2013-12-11 12 views
9

Czy przed użyciem funkcji utworzonych programowo wymagana jest funkcja "Register" lub "Re-compile"?Jak używać programowo utworzonych funkcji arkusza roboczego w VBA

Po dodaniu funkcji do arkusza roboczego nie można jej używać, dopóki po powrocie kontroli do arkusza roboczego.

Na przykład: Jeśli mój kod dodaje funkcję do arkusza roboczego, a następnie próbuje go użyć, pojawia się następujący błąd: Błąd wykonania 438 - Obiekt nie obsługuje tej właściwości lub metody Kiedy patrzę na kod dla arkusze kalkulacyjne, w których znajdują się funkcje i jeśli uruchomię kod, który wykorzystuje tylko utworzone funkcje, nie występuje błąd.

Jak korzystać z funkcji zaraz po ich utworzeniu, bez uprzedniego zatrzymania?

Oto przykład kodu - pojawia się błąd podczas uruchamiania TestingWorkSheetFunctions, ale nie po uruchomieniu TestWorkSheetFunction po utworzeniu funkcji.

Przykład zakłada nowy skoroszyt z co najmniej dwóch arkuszy (Arkusz1 i Arkusz2)

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

Dziękuję Passerby za naprawienie mojego przykładowego kodu. – LastDavid

Odpowiedz

2

myślę tu problemem jest to, że VBA dodaje się do arkuszy i nie jest kompilowany, tak, że gdy reszta kodu próbuje uzyskać dostęp do tych funkcji, są one napisane, ale nie są jeszcze częścią programu. Można to zobaczyć po ponownym uruchomieniu kodu i wszystko działa poprawnie.

Spróbuj przełączyć kod masz na następującej procedury:

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 
    Application.OnTime Now, "TestWorkSheetFunction" 

End Sub 

ten sposób VBA uruchomi pierwszą część kodu i zwolnić proces, a następnie procedurę „TestWorkSheetFunction” zostanie nazwany od razu. Ważne: Jest to obejście problemu, może to nie być najlepsze rozwiązanie, ale może zadziałać w konkretnym przypadku.

+1

Dobra odpowiedź: to działa dla mnie. Powód, dla którego oryginalny kod nie działa, ponieważ gdy VBA zaczyna uruchamiać procedurę, moduły kodu są kompilowane w tym punkcie. Dlatego też dowolny tekst dodany do modułów kodu podczas procesu uruchamiania nie jest automatycznie rekompilowany. Rozwiązanie Abe zapewnia uruchomienie oddzielnego procesu dla drugiej części funkcji, co oznacza, że ​​kod jest rzeczywiście ponownie skompilowany. –

0

Program Excel nie może wywoływać procedur "podrzędnych" w formułach komórek. Należy utworzyć je za pomocą procedury funkcji w module, aby zapewnić, że jest ona globalnie dostępna dla całego dokumentu.

Public Function testFunc() 

    Code here 

End Function 

Teraz możesz skorzystać z funkcji w arkuszu lub innych procedur.

Twoja funkcja może wywoływać inne procedury typu Sub i Function w swoim bloku kodu.

Powiązane problemy