1

我在 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....但它找不到我的功能。有没有我缺少的设置?

4

2 回答 2

2

您需要将用户定义的函数放入Modules. 不在Classes表单、工作表或Thisworkbook.

并且您需要在函数退出之前为其设置返回值,否则它将始终具有默认值0.

你可能需要重新考虑你的路线

accumulator = Me.Cells(cell.Row, 5) + accumulator

因为除了传入 UDF 的内容之外,您无法访问任何内容。Me因此不允许引用。

编辑: 您不能使用Me模块中的关键字访问对象(需要驻留 UDF),因为Me它指的是代码所在的非静态对象,但模块是静态的,这Me是不合逻辑的。正如克里斯在评论中指出的那样,您可以访问未传入的对象,而不是通过Me关键字这样做,您需要明确引用它们,例如ThisWoorkBook.Sheets("sheetname").Cells(cell.row,5)

于 2013-04-08T19:43:45.820 回答
0

一些东西...

  1. Excel 自定义函数(您尝试创建的那种在单元格公式中显示为可用关键字的函数)只能更改一个单元格的值。您会注意到所有内置 Excel 函数(例如,=LEFT)仅影响使用它们的单元格的值。

  2. Excel 正在寻找的方法签名是一个范围......我不知道它是否会像您的示例一样接受多个参数。

  3. 您似乎没有在任何地方设置 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...

于 2013-04-08T19:47:25.383 回答