我在VBA中编写了一个函数,我不知道如何调用它。
Public Function FindTwoStrings(rng As Range, s1 As String, _
s2 As String) As Integer
'Application.Volatile
If TypeName(rng) <> "Range" Then Exit Function
Dim cell As Range
Dim accumulator As Integer
For Each cell In rng.Cells
If (InStr(1, UCase(cell.Value), UCase(s1), _
vbTextCompare) > 0) Or (InStr(1, UCase(cell.Value), _
UCase(s2), vbTextCompare) > 0) Then _
accumulator = Me.Cells(cell.Row, 5) + accumulator
Next cell
End Function
如何在我的手机中调用此功能?我试过=Find....
,但找不到我的功能。我缺少一个设置吗?
答案 0 :(得分:2)
您需要将用户定义的函数放在Modules
中。不在Classes
或表单,工作表或Thisworkbook
等对象中。
您需要在函数退出之前为其设置返回值,否则它将始终具有默认值0
。
您可能需要重新考虑一下
accumulator = Me.Cells(cell.Row, 5) + accumulator
因为您无法访问除传递给UDF之外的任何内容。因此,不允许引用 Me
。
修改强>
您无法使用模块中的Me
关键字(需要驻留UDF)来访问对象,因为Me
是指代码所在的非静态对象,但模块是静态的Me
1}}是不合逻辑的。正如Chris在评论中指出的那样,您可以访问未传入的对象,而不是通过Me
关键字这样做,您需要明确引用它们,例如{{1} }
答案 1 :(得分:0)
一些事情......
Excel自定义函数(您尝试创建的类型,它在单元格的公式中显示为可用关键字)只能更改一个单元格的值。您会注意到,所有内置Excel函数(例如,= LEFT)仅影响它们所使用的单元格的值。
Excel正在寻找的方法签名是一个范围......我不知道它是否会接受多个参数,如您的示例所示。
您似乎无法在任何地方设置FindTwoStrings的值。这就是该方法知道返回什么值的方式。
以下是我编写的一个小函数的示例,用于将范围连接成由逗号分隔的单个字符串。你可以用= cvsRange([some range])
来调用它Function csvRange(myRange As Range)
Dim csvRangeOutput As String
For Each entry In myRange
If Len(entry) > 0 Then
csvRangeOutput = csvRangeOutput & entry.Value & ","
End If
Next
If Len(csvRangeOutput) > 2 Then
csvRange = Mid(csvRangeOutput, 1, Len(csvRangeOutput) - 1)
Else
csvRange = ""
End If
End Function
... HTH