如何将行传递给 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)自定义函数?的主要内容,如果未能解决你的问题,请参考以下文章