Я новичок в VBA. Мне нужна помощь в написании функции, которую я могу вызывать в формуле, функция должна копировать значения ячейки (эта ячейка не должна быть предопределенной фиксированной ячейкой, а должна быть, мы должны иметь возможность ее выбрать. при вызове функции) и вставьте их в ячейку рядом с ячейкой, в которой вызывается функция.

Пример:

В приведенной выше функции, если значения в ячейке B3 и C3 равны, тогда формула в ячейке E3 должна вызывать функцию «Myfunction ()», эта функция должна копировать сумму в ячейке D3 в ячейку F3, и мы должны иметь возможность выбрать ячейку для копирования (моя функция (D3) D3 может отличаться, это может быть E3 или F3 и т. д.)

Мой код:


Dim c As Range
Function myfunction(c)
myfunction = c.Select
Selection.Copy
Range("c" + 1).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Function

"С" должен быть переменным.

2 ответа2

1

и вставьте их в ячейку рядом с ячейкой, в которой вызывается функция.

Это невозможно, функции VBA, вызываемые по формуле на листе, не имеют доступа ни к какой другой ячейке на листе.


Пользовательским функциям не разрешается делать что-либо кроме возврата значения в формулу на рабочем листе или в выражение, используемое в другом макросе или функции VBA. Например, пользовательские функции не могут изменять размеры окон; редактировать формулу в ячейке; или измените параметры шрифта, цвета или рисунка для текста в ячейке. Если вы включите код «действия» такого рода в процедуру функции, функция возвратит # ЗНАЧЕНИЕ! ошибка.

из руководства Microsoft Excel UDF

0

Как отмечает Мате Юхас, пользовательские формулы не могут изменять другие ячейки. Попытка сделать это вернет # ЗНАЧЕНИЕ! Ошибка в ячейке, которую занимает формула.

Что касается первой части (доступ к значению случайной ячейки, то есть D3), вы можете просто вернуть значение переменной диапазона ячеек источника:

Function MyFunction(SourceCell As Range)
    MyFunction = SourceCell.Value
End Function

Это можно использовать в исходной формуле =IF(C3=B3,myfunction(D3),"") , причем эта формула помещается непосредственно в, например, F3. Его также можно использовать, например, в E3, изменив значение F3 на =E3 .

Вы (очевидно) не ограничены одной ячейкой - если вы хотите выполнить начальное сравнение в самой формуле, вы можете использовать =myfunction(B3, C3, D3) где функция может выглядеть примерно так:

Dim ReturnValue As Variant

Function MyFunction(FirstCell As Range, SecondCell As Range, SourceCell As Range)

    If FirstCell.Value = SecondCell.Value Then
        'If our source is empty, return an error
        If SourceCell.Value = "" Then
            ReturnValue = "Empty Source"
        Else
            ReturnValue = SourceCell.Value
        End If
    Else
        'Our input cells aren't equal
        ReturnValue = "Not Equal"
    End If

    'Return our final value to the cell
    MyFunction = ReturnValue

End Function

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .