/ / Best practice per la creazione di un oggetto pubblico in Excel-VBA? - vba, excel-vba, strutture dati, excel

Le migliori pratiche per la creazione di un oggetto pubblico in Excel-VBA? - vba, excel-vba, strutture dati, excel

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