Qual è la migliore pratica per creare un Excel-VBA
oggetto dati (dizionario, elenco, ecc.) accessibile da tutti i membri dell'applicazione? Dovrebbe essere dichiarato come modulo separato o modulo di classe?
Ad esempio, voglio creare un oggetto dizionarioquali diverse subroutine vorranno controllare un input dell'utente contro (se contiene o meno). Questo oggetto dizionario dovrebbe essere il proprio modulo, modulo di classe o parte del modulo che contiene le subroutine che lo usano?
Nota: questa domanda è un'estensione di Verifica se un valore è un membro di un elenco
risposte:
7 per risposta № 1È possibile utilizzare la seguente costruzione (dichiarare il proprio myList
oggetto come Public
nella parte superiore del tuo modulo):
Public myList As Object
Sub Main()
Call InitializeList
"Do something with your Dictionary object
End Sub
Sub InitializeList()
If Not myList Is Nothing Then Exit Sub
Set myList = CreateObject("Scripting.Dictionary")
myList.Add "item1", 1
myList.Add "item2", 2
myList.Add "item3", 3
End Sub
4 per risposta № 2
VBA può essere frustrante per le persone che sono abituate a simpatici linguaggi OOP come Java e C #. Dobbiamo accettare i limiti di VBA e fare semplicemente il meglio che possiamo con ciò che offre.
Quello che descrivi sembra quasi qualcosa che dichiareresti come Singleton in altre lingue.
La mia soluzione sarebbe quella di creare un modulo "principale"(non modulo di classe). In là, crea un dizionario privato e crea una funzione di accesso pubblico per esso. Ciò consentirà agli altri metodi - er - functions / subs di accedervi in modo cieco.
Private pMyList as Scripting.Dictionary
Public Property Get MyList() as Scripting.Dictionary
If pMyList = Nothing Then
Set pMyList = new Scripting.Dictionary
pMyList("One") = "Red"
pMyList("Two") = "Blue"
pMyList("Three") = "Green"
EndIf
Set MyList = pMyList
End Property
Public Sub Cleanup
Set pMyList = Nothing
" To deallocate arrays, use:
" Erase pArray
End Sub
"--------------------------------
Public Sub SomeRandomSubInAnotherModule()
Dim theList As Scripting.Dictionary
Set theList = MyList " If not yet initialized, will initialize
" Do whatever you need to do with theList
Set theList = Nothing " Release the memory
End Sub
A proposito, la subroutine "Pulizia" è semplicemente buonapratica. Alla fine della tua macro, dovresti chiamare la subroutine "Cleanup" per liberare memoria che Excel potrebbe aver allocato per qualsiasi oggetto che hai creato. Per i Class Module, puoi inserire il tuo codice di pulizia
Public Sub Class_Terminate()
e sarà chiamato automaticamente.
Nota: il codice precedente richiede di aggiungereil "Microsoft Scripting Runtime" come riferimento. Questo ti fornisce utili suggerimenti sui tipi quando lavori con il dizionario mentre scrivi il codice. Se non vuoi farlo per qualche motivo, usa questo codice:
Private pMyList as Object
Public Property Get MyList() as Object
If pMyList = Nothing Then
Set pMyList = CreateObject("Scripting.Dictionary")
pMyList("One") = "Red"
pMyList("Two") = "Blue"
pMyList("Three") = "Green"
EndIf
Set MyList = pMyList
End Property
Public Sub Cleanup
Set pMyList = Nothing
End Sub