打电话给我

时间:2013-04-08 19:31:11

标签: excel-vba vba excel

我在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....,但找不到我的功能。我缺少一个设置吗?

2 个答案:

答案 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)

一些事情......

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

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

  3. 您似乎无法在任何地方设置FindTwoStrings的值。这就是该方法知道返回什么值的方式。

  4. 以下是我编写的一个小函数的示例,用于将范围连接成由逗号分隔的单个字符串。你可以用= 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