簡體   English   中英

excel vba:特殊類型 - 函數作為函數的參數

[英]excel vba: Special Types - Functions as Arguments of Functions

VBA中的函數沒有特殊類型。 我很難看到如何在Excel VBA中添加函數作為函數的參數。

我想要完成的是這樣的事情:

function f(g as function, x as string) as string
        f = g(x)
end function

目前,我有一組小函數都在重復自己但只調用一個特定的函數。

由於VBA的根源在於交互式語言,因此它始終具有執行文本的能力:

function f(g as string, x as string) as string
        f = application.run(g,x)
end function

MyStringA = f("functionA",string1)
MyStringB = f("functionB",string1)

編輯添加:我認為在當前版本的Excel中,應用程序(Excel)只能“運行”您可以在電子表格單元格中顯示的內容。 這意味着功能,而不是子程序。 要執行子例程,請將其包裝在函數包裝器中:

function functionA(x as string)
    Call MySubA(x)
end function

從你的代碼中,函數g接受一個字符串參數並返回一個字符串。 我建議你創建一個名為IStringFunction的類模塊,作為所有函數都支持的接口的定義,因此:

類模塊:IStringFunction

Public Function Evaluate(ByVal s As String) As String
End Function

然后,創建幾個實現此接口的示例函數:

類模塊:HelloStringFunction

Implements IStringFunction

Public Function IStringFunction_Evaluate(ByVal s As String) As String
    IStringFunction_Evaluate = "hello " & s
End Function

類模塊:GoodbyeStringFunction

Implements IStringFunction

Public Function IStringFunction_Evaluate(ByVal s As String) As String
    IStringFunction_Evaluate = "goodbye " & s
End Function

...最后,一些測試代碼來執行這些功能:

(標准)模塊:測試

Sub Test()

    Dim oHello As New HelloStringFunction
    Dim oGoodbye As New GoodbyeStringFunction

    MsgBox Evaluate(oHello, "gary")
    MsgBox Evaluate(oGoodbye, "gary")

End Sub

Private Function Evaluate(ByVal f As IStringFunction, ByVal arg As String) As String
    Evaluate = f.Evaluate(arg)
End Function

請注意,實現接口的類必須具有名為<Interface>_<Method>如上例所示,而不僅僅是<Method>

在這里下載簡單的演示中間演示

可以將一個函數作為一個參數傳遞 ,並獲得你所追求的行為,但它有點hacky。 這是通過利用類的默認屬性來實現的,

創建一個包含函數的類myFunction

Public Function sayHi(ByVal s As String) As String
    sayHi = "Hi " & s
End Function

導出它,然后在文本編輯器中打開.cls文件

你應該看到文件中的某個地方,一行定義你的功能

Public Function sayHi(ByVal s As String) As String

在它下面,添加Attribute Value.VB_UserMemId = 0 ,現在它看起來像這樣:

Public Function sayHi(ByVal s As String) As String
Attribute Value.VB_UserMemId = 0
    sayHi = "Hi " & s
End Function

你在這里做的是將sayHi標記為類的默認屬性 現在你可以通過類對象單獨的class(args)調用該函數,而不是class.function(args)

保存修改后的文件並將其導入VBA項目

測試模塊

Sub test()
    Dim parameterFunction As Object         'this is what we'll be passing to our routine
    Set parameterFunction = New myFunction  'create instance of the function object
    MsgBox f(parameterFunction, "Greedo")
End Sub

Function f(ByVal g As Object, ByVal x As String) As String
        f = g(x)
End Function

*注意,這樣你就可以傳遞任何功能; 但你可以改為指定ByVal g As IStringFunction來獲得具有正確接口的子集,根據Gary McGill的回答

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM