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.