Как передать строку в пользовательскую функцию Excel (Visual Basic для приложений)? - PullRequest
0 голосов
/ 24 ноября 2018

Мне нужно создать пользовательскую функцию для кого-то еще, чтобы использовать в Excel.Я могу читать VB скрипт просто отлично, но я не занимался программированием в Excel.Для начала я надеюсь запустить снаряд.Как бы я создал функцию, которая могла бы вызываться в ячейке как =@MyFunction(ThisRow) (или что-то подобное, чтобы скрыть сложность), чтобы делать следующее:

Function MyFunction(Row) 
    firstName = Row.FIRST_NAME // FIRST_NAME is the column label
    lastName = Row.LAST_NAME
    name = firstName + " " + lastName // just an example of an operation
    MyFunction = name // return value
End Function

Поиск в Интернете привел к некоторым примерам, в которых передается диапазонв функцию.Поскольку эта функция будет использоваться кем-то другим, я бы предпочел ограничить аргумент текущей строкой.Опять же, выше - только оболочка для запуска функции.Как только у меня будет эта работа, я смогу выполнять сложные операции внутри функции.

Пример:

A1  | B1     | C1
Mel | Gibson | @MyFunction(thisrow)

C1 would produce 'Mel Gibson'

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Это очень простая задача, которую можно легко выполнить, используя формулу рабочего листа:

=CONCATENATE(A1," ",B1)

enter image description here

Однако, если вы настаиваете наиспользуя функцию UDF, это должно сделать

Public Function MyFunction() As String

    With Application.Caller
        MyFunction = .Parent.Cells(.Row, Range("FIRST_NAME").Column) & _
            " " & .Parent.Cells(.Row, Range("LAST_NAME").Column)
    End With

End Function

. Выше даже не нужно передавать аргумент.Он использует метод Application.Caller.Row, чтобы получить строку, из которой расположена функция.

Вы просто используете функцию =MyFunction(), и VBA автоматически определит строку, в которой находится функция.

enter image description here

0 голосов
/ 24 ноября 2018
Public Function MyFunction(ByVal rowIndex As Long)
    Dim firstNameCol As Long
    Dim lastNameCol As Long

    firstNameCol = Rows(1).Find(What:="FIRST_NAME", LookIn:=xlValues, LookAt:=xlWhole).Column
    lastNameCol = Rows(1).Find(What:="LAST_NAME", LookIn:=xlValues, LookAt:=xlWhole).Column

    MyFunction = Cells(rowIndex, firstNameCol).Value & " " & Cells(rowIndex, lastNameCol).Value
End Function
0 голосов
/ 24 ноября 2018

Я не совсем понимаю вашу цель, но это может помочь вам.

Public Function MyFunction(ByVal argRow As Long)
Dim fName As String
Dim lName As String

    fName = Range("A" & argRow)
    lName = Range("B" & argRow)

MyFunction = fName & " " & lName
End Function

enter image description here

...