Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 使用Application.Run计算作为字符串传递的工作表函数_Excel_Vba_User Defined Functions - Fatal编程技术网

Excel 使用Application.Run计算作为字符串传递的工作表函数

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 德语错误消息,我会尽力翻译,但可能与英文版本不完全匹配: 运行时

我有一个关于Application.Run的简单语法问题。我想写一段代码,其中我将一个字符串传递给一个UDF,该字符串包含一个工作表函数的名称,例如“iserror”或其他一些UDF返回布尔值。然后,将为传递范围内的每个单元格执行该函数,并根据结果执行某些操作

但是,我还没有找到正确的语法。错误消息会随着我的试用而改变,但非错误消息尤其有用。e、 g:

?HRD数据!A1:B10,工作表function.iserror,False

德语错误消息,我会尽力翻译,但可能与英文版本不完全匹配:

运行时错误1004:

无法执行宏“Worksheetfunction.iserror”。宏可能在此工作表中不可用,或者宏已被停用

当然,宏还没有被停用,但它实际上并不是一个宏。还尝试了在没有前导“Worksheetfunction”的情况下使用相同的错误消息

在我的代码中,调用如下所示:

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)