2009-02-20 40 views
22

Ho bisogno di creare alcuni oggetti personalizzati in VBA che dovranno fare riferimento l'un l'altro e ho alcuni problemi.Excel costruttore e distruttore di oggetti VBA

Primo: come funzionano i costruttori di oggetti in VBA? Ci sono costruttori?

Secondo: ci sono i distruttori? In che modo VBA gestisce la fine del ciclo di vita dell'oggetto? Se ho un oggetto che fa riferimento ad altri (e questo è il loro unico riferimento), allora posso impostarlo su Nothing e farlo con esso o potrebbe produrre perdite di memeory?

Questa roba quasi-OO è solo un po 'irritante.

+1

Per aggiungere variabili al costruttore, vedere [questa domanda StackOverflow] [1]. [1]: http://stackoverflow.com/questions/15224113/pass-arguments-to-constructor-in-vba – GregNash

risposta

21

VBA supporta i moduli di classe. Hanno un evento Class_Initialize che è il costruttore e un Class_Terminate che è il distruttore. È possibile definire proprietà e metodi. Credo che VBA utilizzi il conteggio dei riferimenti per il ciclo di vita dell'oggetto. Ecco perché vedi un sacco di Set whatever = Nothing in quel tipo di codice. Nel tuo esempio di esempio, penso che non perderà memoria. Ma devi stare attento ai riferimenti circolari.

16

Se si sta facendo un modulo di classe in VBA, per il costruttore, è possibile utilizzare:

Private Sub class_initialize() 
.... 
End Sub 

Non ci sono distruttori, dal momento che VBA è garbage collection. Assicurati solo di pulire qualsiasi riferimento circolare e dovresti evitare eventuali perdite di memoria.

+9

Non è vero che non c'è un distruttore. È Class_Terminate – RubberDuck

8

È passato un po 'di tempo da quando li ho usati, ma non penso che sia possibile passare parametri ai costruttori. Penso che sia stato uno dei problemi in cui mi sono imbattuto, ma mi sono imbattuto in così tanti problemi su come funzionavano le classi e su come mi aspettavo che funzionassero che potrei essere in errore.

+2

Hai ragione. Non puoi – Tmdean

+0

Le classi più complicate avranno spesso funzioni di tipo "Start" e variabili di stato "objectStarted" per adattare il principio di un costruttore parametrizzato. –

6

Esiste Class_Terminate che è praticamente lo stesso del distruttore.

0

Confido che class_initialize e class_terminate.

È possibile controllare da scrivendo questo TestClass:

Public testVar As Integer 

Private Sub class_initialize() 
    Debug.Print "Class init" 
    testVar = 10 
End Sub 

Private Sub class_terminate() 
    Debug.Print "Class terminate" 
End Sub 

E scrivere questo codice in un modulo:

Sub test() 
    Dim myTestClass As New TestClass 
    Debug.Print myTestClass.testVar 
End Sub 

E poi si vedrà log in finestra Debug. Ma con questo test, possiamo vedere che class_initialize non viene chiamato quando si crea l'istanza (con new) ma solo alla prima chiamata di un metodo nell'istanza o ottenendo un valore var.

La Class_Terminate sembra di essere chiamato alla fine del TestModule (Se un'istanza è maked su ThisWorkbook oggetto, terminare è "mai" chiamato ... probabilmente solo quando la cartella di lavoro è chiuso o quando Excel viene chiuso)