2013-12-11 19 views
9

È necessaria una funzione "Registra" o "Ricompila" prima di utilizzare le funzioni create a livello di programmazione?Come utilizzare le funzioni del foglio di lavoro create in modo programmatico in VBA

Quando aggiungo una funzione a un foglio di lavoro, non posso utilizzarla finché non viene restituito il controllo al foglio di lavoro.

Ad esempio: Se il mio codice aggiunge una funzione a un foglio di lavoro, quindi tenta di utilizzarlo, ottengo il seguente errore: Errore di run-time 438 - L'oggetto non supporta questa proprietà o metodo Quando guardo il codice per i fogli di lavoro le funzioni sono lì e se eseguo il codice che utilizza solo le funzioni create, non c'è errore.

Come posso utilizzare le funzioni subito dopo averle create, senza fermarsi prima?

Ecco un esempio nel codice: viene visualizzato l'errore quando si eseguono TestingWorkSheetFunctions ma non quando si esegue TestWorkSheetFunction dopo la creazione delle funzioni.

esempio presuppone una nuova cartella di lavoro con almeno due fogli (Foglio1 e 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

Grazie Passerby per fissare il mio codice di esempio. – LastDavid

risposta

2

Credo che il problema qui è che VBA viene aggiunto ai fogli di lavoro e non è compilato, in modo che quando il resto del tuo codice prova ad accedere a queste funzioni, sono scritte ma non fanno ancora parte del programma. Questo può essere visto quando si esegue nuovamente il codice e tutto funziona correttamente.

prega di provare a cambiare il codice che hai sul seguente procedura per:

Public Sub TestingWorksheetFunction() 

    AddWorkSheetFunction 
    Application.OnTime Now, "TestWorkSheetFunction" 

End Sub 

In questo modo, la VBA verrà eseguito la prima parte del codice e rilasciare il processo, e quindi la procedura "TestWorkSheetFunction" sarà chiamato subito. Importante: questa è una soluzione per il tuo problema, questa potrebbe non essere la soluzione migliore, ma potrebbe funzionare per il tuo caso specifico.

+1

Buona risposta: questo funziona per me. Il motivo per cui il codice originale non funziona è perché quando VBA inizia a eseguire una procedura, i moduli di codice vengono compilati in quel punto. Pertanto, qualsiasi testo aggiunto ai moduli di codice durante il processo di esecuzione non viene automaticamente ricompilato. La soluzione di Abe garantisce l'avvio di un processo separato per la seconda parte della funzione, il che significa che il codice è effettivamente ricompilato. –

0

Excel non è in grado di chiamare le routine "secondarie" nelle formule di cella. È necessario crearli utilizzando una procedura di funzione in un modulo per assicurarsi che sia globalmente disponibile per l'intero documento.

Public Function testFunc() 

    Code here 

End Function 

Ora è possibile utilizzare la funzione all'interno del foglio o altre procedure.

La funzione può chiamare altre procedure di tipo Sub e Function nel suo blocco di codice.

Problemi correlati