2012-09-03 64 views
1

我想編寫一個使用我已定義爲參數的類的自定義工作表函數。我試圖做到以下幾點:使用類作爲自定義工作表函數的參數

我創建了一個名爲包裝類:

Private m_value As Integer 

Public Property Get value() As Integer 
    value = m_value 
End Property 

Public Property Let value(value As Integer) 
    m_value = value 
End Property 

然後我寫了兩個功能:

Function make_wrapper(value As Integer) As wrapper 
    Set make_wrapper = New wrapper 
    make_wrapper.value = value 
End Function 

Function square(wrapper As wrapper) As Integer 
    square = wrapper.value * wrapper.value 
End Function 

如果我直接從VBA連鎖的功能,一切正常如我所料

Sub doit() 
    MsgBox (square(make_wrapper(7))) 
End Sub 

顯示49

如果我嘗試直接從Excel中調用該函數,它不起作用。如果我在單元格中鍵入「= square(make_wrapper(7))」,它會顯示「#VALUE!」。我究竟做錯了什麼?這可能嗎?

+0

似乎從來沒有用這兩個公式調用「square」 - 也許Excel在公式中收到非標準值時立即停止?你可以定義一個單獨的函數,這個函數實際上是將square(make_wrapper(foo))作爲整數返回(即使從Excel工作表也可以)。 – enderland

+0

是的,但這正是我所做的*不*想要做的。我想用它來構造函數的非常複雜的參數,並通過使用不同的類作爲參數來獲得一些「類型安全」。 – MadScientist

+0

我希望Excel不喜歡在UDF中從第一個函數make_wrapper返回的類型'wrapper'。嘗試重寫以輸出已知類型,例如'Variant' – user3357963

回答

-1

參數名稱無效:「包裝器」已經是類的名稱。

試試這個:

Function square(MyWrapper As wrapper) As Integer 
    square = MyWrapper.value * MyWrapper.value 
End Function 
+0

這不起作用。 – enderland

+1

如果您無法提供關於它如何失敗的詳細信息 - 輸出,錯誤消息,來自編譯器的警告 - 那麼我無法爲您提供幫助。我認爲你最好的行動方式是閱讀一些基礎知識 - 在VBA中傳遞參數,UDF如何工作,使用Option Explicit - 並且用更簡單的編程任務重新開始。 –

0

似乎沒有人給你一個明確的答案。

這可能嗎?

您不能像這樣將自定義類型返回給UDF。

試試這個:

Function square(iValue) As Integer 
    Dim w As New wrapper 

    w.value = iValue 

    square = w.value * w.value 
End Function 

雖然我不知道你的努力實現與類模塊是什麼。

相關問題