如何将行传递给 Excel(Visual Basic for Applications)自定义函数?

Posted

技术标签:

【中文标题】如何将行传递给 Excel(Visual Basic for Applications)自定义函数?【英文标题】:How to pass a row to an Excel (Visual Basic for Applications) custom function? 【发布时间】:2018-11-24 03:10:53 【问题描述】:

我需要创建一个自定义函数供其他人在 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'

【问题讨论】:

MyFunction(ByVal argRow as Range) @Harun24HR 这是我的搜索结果。你是说范围是行吗?我将 Range 理解为一个矩形,而不是一条线。 Row 是什么意思? Row 是指行号还是参考单元格? 你能把你的样本数据截图吗? 任何一个都可以,只要我可以读取函数中的行单元格。假设 A1 显示“Harun”而 B1 显示“24HR”,我想将 =@MyFunction(ThisRow) 放在 C1 中以在调用函数的 C1 中生成“Harun24HR”。再次。这只是一个外壳。实际逻辑会很复杂,所以需要一个自定义函数。 【参考方案1】:

这是一项非常简单的任务,只需使用工作表公式即可轻松完成:

=CONCATENATE(A1," ",B1)

但是,如果您坚持使用 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 将自动确定该函数所在的行。

【讨论】:

谢谢,这个 Application.Caller 效果很好。同样,我的示例很简单,只是为了让函数运行。我在那里放置了更多代码。我必须创建私有函数并将一些工作委派给它们,以保持可读性。【参考方案2】:

我不清楚你的目标,但这可能会对你有所帮助。

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

【讨论】:

【参考方案3】:
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

【讨论】:

以上是关于如何将行传递给 Excel(Visual Basic for Applications)自定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

Excel里怎么将行和列进行互换?

如何将行传递到pyspark udf

如何将行从一个 Excel 工作表复制到另一个工作表并使用 VBA 创建重复项?

如何将行值从 iframe 弹出窗口传递到父页面文本框

将行的值分配给全局变量

将行插入 QSqlTableModel