2013-12-11 31 views
9

在使用以編程方式創建的函數之前是否需要「註冊」或「重新編譯」功能?如何在VBA中使用以編程方式創建的工作表函數

當我添加一個函數到工作表時,我不能使用它,直到控件返回到工作表之後。

例如:如果我的代碼向工作表中添加了一個函數,然後嘗試使用它,我得到以下錯誤:運行時錯誤438 - 對象不支持此屬性或方法 當我查看代碼工作表中的函數在那裏,如果我運行的代碼只使用創建的函數,那麼就沒有錯誤。

如何在創建它們之後立即使用這些功能,而不必先停下來?

以下是代碼示例 - 我在運行TestingWorkSheetFunctions時遇到錯誤,但在創建函數後運行TestWorkSheetFunction時沒有。

示例假設一個新的工作簿中的至少兩個表(工作表Sheet1和Sheet2的)

Option Explicit 

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 

    TestWorkSheetFunction 

End Sub 

Public Sub AddWorkSheetFunction() 

    'Sheet1's Function 
    Dim strFunctionCode As String 
     strFunctionCode = _ 
      "Public Function HelloWorld() as string" & vbCrLf & _ 
      vbCrLf & _ 
      vbTab & "HelloWorld = ""Hello World from Sheet 1""" & vbCrLf & _ 
      vbCrLf & _ 
      "End Function" 
    ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet1").CodeName).CodeModule.AddFromString strFunctionCode 

    'Sheet2's Function 
    strFunctionCode = _ 
     "Public Function HelloWorld() as string" & vbCrLf & _ 
     vbCrLf & _ 
     vbTab & "HelloWorld = ""Hello World from Sheet 2""" & vbCrLf & _ 
     vbCrLf & _ 
     "End Function" 
    ThisWorkbook.VBProject.VBComponents(ThisWorkbook.Sheets("Sheet2").CodeName).CodeModule.AddFromString strFunctionCode 

End Sub 

Public Sub TestWorkSheetFunction() 

    Dim wsWorksheet1 As Object 
    Set wsWorksheet1 = ThisWorkbook.Sheets("Sheet1") 
    Dim wsWorksheet2 As Object 
    Set wsWorksheet2 = ThisWorkbook.Sheets("Sheet2") 

    MsgBox wsWorksheet1.HelloWorld() 
    MsgBox wsWorksheet2.HelloWorld() 

End Sub 
+0

感謝路人修復我的示例代碼。 – LastDavid

回答

2

我覺得這裏的問題是,您的VBA添加到工作表並沒有被編譯,這樣,當休息的代碼嘗試訪問這些函數,它們被編寫,但不是程序的一部分。當你再次運行代碼時,可以看到這一切,並且一切正常。

請嘗試切換您對以下程序的代碼:

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 
    Application.OnTime Now, "TestWorkSheetFunction" 

End Sub 

這樣,VBA將運行代碼的第一部分和釋放的過程,然後程序「TestWorkSheetFunction」將立即被調用。重要提示:這是針對您的問題的解決方法,這可能不是最佳解決方案,但它可能適用於您的特定情況。

+1

好的答案:這對我有用。原始代碼不起作用的原因是因爲當VBA開始運行一個過程時,代碼模塊在那個時候被編譯。因此,在運行過程中添加到代碼模塊的任何文本都不會自動重新編譯。 Abe的解決方案確保爲函數的第二部分啓動一個單獨的進程,這意味着代碼確實被重新編譯。 –

0

Excel無法在單元格公式中調用「子」例程。 您需要使用模塊下的函數過程來創建它們,以確保它對整個文檔是全局可用的。

Public Function testFunc() 

    Code here 

End Function 

現在您可以在工作表或其他過程中使用該功能。

您的函數可以在其代碼塊中調用其他Sub和Function類型的過程。

相關問題