Excel 使用Application.Run计算作为字符串传递的工作表函数
我有一个关于Application.Run的简单语法问题。我想写一段代码,其中我将一个字符串传递给一个UDF,该字符串包含一个工作表函数的名称,例如“iserror”或其他一些UDF返回布尔值。然后,将为传递范围内的每个单元格执行该函数,并根据结果执行某些操作 但是,我还没有找到正确的语法。错误消息会随着我的试用而改变,但非错误消息尤其有用。e、 g: ?HRD数据!A1:B10,工作表function.iserror,False 德语错误消息,我会尽力翻译,但可能与英文版本不完全匹配: 运行时错误1004: 无法执行宏“Worksheetfunction.iserror”。宏可能在此工作表中不可用,或者宏已被停用 当然,宏还没有被停用,但它实际上并不是一个宏。还尝试了在没有前导“Worksheetfunction”的情况下使用相同的错误消息 在我的代码中,调用如下所示:Excel 使用Application.Run计算作为字符串传递的工作表函数,excel,vba,user-defined-functions,Excel,Vba,User Defined Functions,我有一个关于Application.Run的简单语法问题。我想写一段代码,其中我将一个字符串传递给一个UDF,该字符串包含一个工作表函数的名称,例如“iserror”或其他一些UDF返回布尔值。然后,将为传递范围内的每个单元格执行该函数,并根据结果执行某些操作 但是,我还没有找到正确的语法。错误消息会随着我的试用而改变,但非错误消息尤其有用。e、 g: ?HRD数据!A1:B10,工作表function.iserror,False 德语错误消息,我会尽力翻译,但可能与英文版本不完全匹配: 运行时
Public Function hrCull(r As Range, func As String, Optional invert As Boolean = False) As Range
Dim c As Range
Dim selector As Boolean
...
selector = Application.Run(func, c)
...
end function
我省略了不相关的代码
那么正确的语法是什么呢
杂项:
我认为最好声明自己的Enum,并在其中添加所需的函数。然后使用内置语法执行它们,而不是尝试计算字符串
Public Enum xlSheetFunction
xlIsError
End Enum
Public Function hrCull(r As Range, func As xlSheetFunction, Optional Invert As Boolean = False) As Range
Dim selector As Boolean
Select Case func
Case xlIsError
selector = WorksheetFunction.IsError(r)
End Select
Debug.Print selector
Set hrCull = r
End Function
Public Sub test()
Debug.Print hrCull(Range("A1"), xlIsError)
End Sub
丢失工作表功能。前缀Evaluate不喜欢它,因为Evaluate用于工作表函数
在您的函数中,使用:
selector = Application.Evaluate(func & "(" & c.Address & ")")
要进行测试,请使用:
Debug.Print hrCull(Range("A1"), "ISERROR")
使用CallByName的解决方案:
selector = CallByName(Application.WorksheetFunction, "IsError", VbMethod, c)
使用应用程序。评估而不是应用程序。Run@Tom:嗯,这至少改变了错误消息-恐怕在这种情况下,我还需要一些关于正确语法的帮助。错误消息是什么?要使其工作,您需要传递Excel函数,而不是VBA函数。当WorksheetFunction.IsError只需要一个单元格时,您还将一个范围传递给它。您的语法应该更像Application.EvaluateIsErrorA1I,实际上可能会使用此解决方案。但是,我检查了下面的答案,因为它回答了确切的问题。CallByName是VB6语言的“反射”方法之一。它也在VBA中得到支持,但不是特定于VBA的@YeOldHinnerk:它对我有效——我在发布之前测试过它。IsError的参数c必须是单个单元格范围。你解释了吗?@HooNose是的,它总是只会被一个单元格调用,我保证了这一点。我想知道的一件事是,它是否与语言有关。我在德国,所以在电子表格中,该函数将被称为Istfehler,而在vba中,它将被称为iserror-在这个特殊的callbyname方法中会是什么?@Yeoldhinerk我也在德国,安装了一个德语office版本。但它仍然是IsError——与您在VB代码中直接调用的名称相同。
selector = CallByName(Application.WorksheetFunction, "IsError", VbMethod, c)