Come usare una classe (oggetto) dall'esterno del progetto VBA in cui è dichiarata
Introduzione
Uno dei vantaggi dell'uso della programmazione orientata a oggetti (OOP) è la riutilizzabilità del codice. Il modo tipico per eseguire questa operazione consiste nell'creare un'istanza di un oggetto di una classe già definita con la sintassi Set variable = New ClassName . I programmatori VBA usano tali oggetti ogni volta che usano qualsiasi oggetto all'interno della piattaforma dell'applicazione. Gli esempi includono l'oggetto Workbook in Excel, l'oggetto Presentation in PowerPoint o l'oggetto Document in Word. Inoltre, i programmatori VBA usano i moduli utente, ovvero oggetti che appartengono a un tipo speciale di classe. Tutti questi oggetti sono definiti in librerie esterne al progetto dello sviluppatore VBA. Fare clic sul | Strumenti Riferimenti... per visualizzare l'elenco di librerie esterne che Visual Basic Editor (VBE) stabilisce automaticamente per conto dello sviluppatore.
Questo suggerimento illustra come accedere a una classe personalizzata in una libreria esterna creata da Microsoft. Mentre l'esempio usato di seguito è basato su Excel 2003, i suggerimenti si applicano ad altri prodotti MS Office che supportano VBA ed è applicabile alle versioni 2000 o successive.
Si tratta di un suggerimento di livello intermedio/avanzato e presuppone un certo livello di comfort con la programmazione VB(A).
Sono necessari due passaggi di configurazione distinti prima che un progetto VBA possa accedere a un oggetto dichiarato nel modulo di classe di un altro progetto VBA. Il primo set rende il modulo di classe utilizzabile all'esterno del progetto in cui è dichiarato e fornisce un mezzo per creare un'istanza di un oggetto. Il secondo set riguarda il modo in cui il progetto client usa questa classe.
Configurare il progetto che contiene la definizione della classe
Per impostazione predefinita, la proprietà Instancing di un modulo di classe è impostata su Private. Ciò significa che solo il progetto che contiene la definizione della classe può creare un'istanza di un oggetto di tale classe. L'unica altra scelta supportata da VBA è Public, non creabile. Ciò significa che un progetto esterno può usare un oggetto di questa classe, ma non può crearne un'istanza. Potrebbe sembrare strano, ma è così. Il modo per modificare la proprietà dal valore predefinito consiste nel selezionare il modulo di classe in Esplora progetti VBE, selezionare il modulo di classe di interesse, accedere alla finestra Proprietà (se necessario, usare F4 per renderlo visibile) e modificare la proprietà Instancing in 2-PublicNotCreatable.
Per seguire l'esempio in questo suggerimento, creare un modulo di classe, denominarlo clsEmployee, modificare la proprietà Instancing e aggiungervi il codice seguente.
Option Explicit
Dim sName As String
Property Get Name() As String
Name = sName
End Property
Property Let Name(uName As String)
sName = uName
End Property
Successivamente, poiché la proprietà Instancing della classe è PublicNotCreatable, il progetto deve fornire un modo per consentire a un client di creare un'istanza dell'oggetto. Aggiungere una nuova funzione in un modulo standard:
Option Explicit
Public Function New_clsEmployee() As clsEmployee
Set New_clsEmployee = New clsEmployee
End Function
dove clsEmployee è il nome della classe di interesse. Inoltre, questo non deve essere un modulo privato.
Un ultimo cambiamento renderà la vita un po'più facile. Rinominare il progetto dal progetto VBAProject predefinito in ClassProvider. A tale scopo, selezionare il progetto in Esplora progetti VBE e quindi selezionare Strumenti | Proprietà VBAProject... | | scheda Generale e nel campo Nome progetto immettere ClassProvider.
Salvare questo file, ad esempio, come Classe Provider.xls.
Passare quindi al progetto client.
Configurare il progetto che userà la classe esportata
Il progetto client usa la classe in modo molto simile a una classe definita in qualsiasi altra libreria esterna ,ad esempio un modulo utente, con una differenza chiave. Poiché non può creare un'istanza di un oggetto di tale classe, deve usare la funzione New_clsEmployee() dichiarata in precedenza. Come per qualsiasi altra libreria esterna, decidere se usare l'associazione anticipata o l'associazione tardiva. Il codice seguente illustra entrambi. Tenere presente che per usare il codice di associazione anticipata, il progetto client deve includere un riferimento (Tools | Riferimenti...) al file di Provider.xlsClass .
Option Explicit
Sub UseExportedClass_EarlyBinding()
Dim anEmployee As ClassProvider.clsEmployee
Set anEmployee = ClassProvider.New_clsEmployee
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Sub UseExportedClass_LateBinding()
Dim anEmployee As Object
Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Nota finale
La libreria esterna non deve essere un file normalmente salvato. Può trovarsi in un componente aggiuntivo specifico dell'applicazione, ad esempio un file salvato con il suffisso .xla o .ppa. Ricorda solo che un componente aggiuntivo di questo tipo viene aperto non tramite la normale | file Aperto... ma caricato con il | Tools Componenti aggiuntivi... Comando.