Tutorial ed esempi del modulo di classe VBA

Questo tutorial ti insegnerà i moduli di classe in VBA. Imparerai cosa sono e come usarli.

Moduli di classe VBA - Introduzione

Quando inserisci i moduli nell'editor di Visual Basic (VBE) per inserire il tuo codice, potresti aver notato che puoi anche inserire quello che viene chiamato un "modulo di classe".

Moduli di classe contro moduli

I moduli di classe funzionano in modo molto diverso dai normali moduli in quanto facilitano la creazione di un Component Object Model (COM) che può quindi essere utilizzato all'interno del normale codice VBA

In effetti, crei un oggetto che funziona allo stesso modo di un oggetto Excel integrato come "Fogli di lavoro". Nell'oggetto Fogli di lavoro, hai una serie di proprietà e metodi che ti consentono di ottenere il numero di fogli di lavoro all'interno di una cartella di lavoro o ogni singolo nome di un foglio di lavoro o numerose altre informazioni

Quando crei un nuovo oggetto in questo modo, stai creando un blocco costitutivo che può essere utilizzato ovunque all'interno di VBA. L'oggetto ha una serie di proprietà e metodi a cui è possibile accedere dal codice VBA da qualsiasi punto all'interno della cartella di lavoro senza dover riscrivere nuovamente il codice.

Oltre a fare riferimento al tuo nuovo oggetto da un modulo VBA standard, puoi anche usarlo nel codice dietro un modulo utente che fa parte della tua applicazione personalizzata

Puoi anche usarlo dove hai posizionato i controlli Active X su un foglio di lavoro, come un pulsante di comando o un menu a discesa. Questi controlli utilizzano tutti VBA e il tuo nuovo oggetto può essere facilmente incorporato nel codice evento per questi controlli.

Puoi anche trasformare il tuo oggetto in un componente aggiuntivo di Excel. Il tuo oggetto sarà automaticamente disponibile per gli altri utenti che hanno caricato quel componente aggiuntivo. Questo aggiunge la tua architettura multilivello alla tua applicazione Excel

Excel è un'applicazione a più livelli. C'è il livello dei servizi client, che guida la finestra del foglio di lavoro effettiva con cui l'utente ha familiarità. Il modello a oggetti di Excel è il livello successivo sottostante. Premi F2 in un modulo VBA e sarai in grado di vedere l'enorme numero di oggetti e membri di quegli oggetti che sono il motore di Excel. Nota che il tuo nuovo oggetto verrà visualizzato anche qui.

Infine, al di sotto di tutto ciò, hai il livello dei servizi dati che contiene tutti i dati che hai inserito nei fogli di lavoro e nelle celle. Excel vi accede utilizzando il modello a oggetti Excel.

La creazione di un modulo di classe consente di estendere il modulo oggetto di Excel con i propri oggetti e membri personalizzati

In questo articolo viene spiegato come creare una gerarchia semplice di oggetti utilizzando i moduli di classe.

Vantaggi dell'utilizzo dei moduli di classe

  1. Puoi sviluppare un blocco di costruzione robusto che può essere utilizzato in un numero qualsiasi di diverse applicazioni Excel
  2. Una volta che è stato accuratamente testato, è possibile fare affidamento su di esso per produrre sempre i risultati corretti allo stesso modo degli oggetti Excel incorporati
  3. Se vengono apportati aggiornamenti al codice altrove nell'applicazione, il nuovo oggetto continuerà a funzionare allo stesso modo
  4. Puoi utilizzare il tuo nuovo oggetto in altre applicazioni Excel come componente aggiuntivo
  5. Gli oggetti possono essere riutilizzati in altre applicazioni e aiutano nel debug

Svantaggi dell'utilizzo dei moduli di classe

  1. Possono essere difficili da creare e comprendere.
  2. Le convenzioni di denominazione sono molto importanti perché questo è ciò che vedrai quando usi il tuo oggetto all'interno di un modulo normale.
  3. Se non hai mai creato un modulo di classe prima, possono essere difficili da capire e c'è una curva di apprendimento ripida
  4. Impossibile apportare modifiche in fase di esecuzione: è necessario reimpostare il progetto.
  5. Se le proprietà e le variabili private hanno lo stesso nome, possono verificarsi cicli infiniti con conseguenti errori

Inserimento di un modulo di classe

Seleziona Inserisci | Modulo di classe dal menu VBE (Visual Basic Editor). Il nuovo modulo di classe si chiamerà automaticamente "Classe 1", ma questo deve essere cambiato immediatamente con il nome che utilizzerai per il tuo oggetto

Modificare il nome nella finestra Proprietà in cui punta la freccia. Digita semplicemente il tuo nuovo nome e questo cambierà nella raccolta Moduli di classe

Se la finestra Proprietà non è visibile, selezionare Visualizza | Proprietà nel menu VBE o premere F4

Chiama il tuo nuovo modulo di classe "MyItem" e fai doppio clic sul nome nella visualizzazione ad albero in Project Explorer per visualizzare la finestra del codice per esso.

Creazione di un oggetto oggetto

Questo esempio creerà un oggetto di primo livello chiamato "MyItems" con un oggetto membro al di sotto di esso chiamato "MyItem" che conterrà i dati individuali per ogni elemento. Una volta creato, funzionerà allo stesso modo di un oggetto Excel integrato. Ad esempio, esiste un oggetto chiamato "Fogli di lavoro" che è una raccolta di ciascun foglio di lavoro all'interno della cartella di lavoro. C'è anche un oggetto chiamato "Foglio" che rappresenta ogni singolo foglio di lavoro all'interno della tua cartella di lavoro e contiene tutte le proprietà e i metodi per ogni foglio di lavoro. Questo oggetto si riferisce all'oggetto della raccolta "Fogli di lavoro".

Puoi scorrere la raccolta "Fogli di lavoro", visualizzando a turno ogni "Foglio". Allo stesso modo sarai in grado di scorrere la raccolta "MyItems" visualizzando le proprietà che hai creato nel membro "Myitem".

La prima cosa da fare è creare l'oggetto secondario per il livello membro che conterrà gli elementi effettivi all'interno della raccolta dell'oggetto di livello superiore. Questo è l'equivalente dei membri (ad esempio nome, visibile, conteggio) all'interno dell'oggetto "Foglio" in Excel. Questo codice viene inserito nel modulo di classe chiamato "MyItem"

I moduli di classe hanno proprietà e metodi. Le proprietà sono effettivamente come le variabili, in quanto contengono valori di dati come variabili e i metodi sono come sottoroutine o funzioni.

Nel sottooggetto creeremo due proprietà per l'oggetto: Item e Detail

Inizialmente è necessario dichiarare due variabili stringa per contenere i valori per le proprietà:

12 Oggetto privato come stringamDetail privato come stringa

Questi devono essere dichiarati nella sezione Dichiarazioni all'inizio del codice per il modulo di classe in modo che possano essere utilizzati in tutte le sottoroutine del modulo

Devono avere nomi univoci per renderli diversi dalle proprietà che creeremo, quindi una "m" (per membro) è stata messa davanti a ciascun nome.

Le variabili sono dichiarate come Private in modo che non possano essere viste da chiunque utilizzi l'oggetto. Sono variabili funzionanti da utilizzare all'interno del codice oggetto e non sono presenti come parte dell'oggetto finale.

Il passaggio successivo consiste nell'impostare il codice per consentire l'accesso alle due proprietà. Lo fai per mezzo di un'istruzione Property Let e ​​Property Get per ogni proprietà. Questi devono essere Pubblici altrimenti l'oggetto di primo livello non avrà proprietà visibili

123456789101112131415 Proprietà pubblica Let Item (vdata As String)mItem = vdataFine proprietàProprietà pubblica Ottieni elemento () come stringaArticolo = mArticoloFine proprietàDettaglio let proprietà pubblica (vdata come stringa)mDetail = vdataFine proprietàProprietà pubblica Ottieni dettaglio () come stringaDettaglio = mDettagliFine proprietà

Questo codice crea i mezzi per leggere e scrivere valori nelle due proprietà (Item e Detail) utilizzando le due variabili private che sono state definite nella sezione delle dichiarazioni del modulo.

Il parametro "vdata" viene utilizzato per trasferire i dati alla proprietà interessata.

È importante che ogni proprietà abbia un'istruzione "Let" e "Get" e che il nome della proprietà sia lo stesso in ogni caso. Potresti ritrovarti con due proprietà diverse se scrivi male: una da cui puoi leggere e una su cui puoi scrivere!

Per aiutare con la creazione di questo codice, puoi usare Inserisci | Procedura nel menu VBE per creare uno scheletro di codice che creerà il codice iniziale per le proprietà "Get" e "Let" per un determinato nome di proprietà

Verrà visualizzata una finestra pop-up in cui si digita il nome della proprietà e si seleziona "Proprietà" sui pulsanti di opzione:

Fai clic su "OK" e il codice scheletro verrà aggiunto nel modulo della classe:

1234567 Proprietà pubblica Ottieni MyProperty() come varianteFine proprietàProprietà pubblica Let MyProperty(ByVal vNewValue As Variant)Fine proprietà

In questo modo si evitano errori sui nomi delle proprietà. È sufficiente aggiungere il codice tra le istruzioni "Proprietà pubblica" e "End Property".

Ora hai un oggetto chiamato "MyItem" che conterrà tutti i dati per questo esercizio.

Stanco di cercare esempi di codice VBA? Prova AutoMacro!

Creazione di una collezione

La fase successiva è creare un oggetto di primo livello come oggetto Collection per dare accesso alle proprietà che hai impostato nell'oggetto "MyItem"

Ancora una volta, devi definire un oggetto funzionante che agisca come oggetto di raccolta nello stesso modo in cui hai definito le due variabili stringa nell'oggetto "MyItem".

1 Oggetti privati ​​come collezione

Di nuovo, questo deve avere un nome univoco, motivo per cui c'è una 'm' (oggetto membro) davanti al nome, ed è anche dichiarato come 'Privato' in modo che non appaia quando il nuovo oggetto viene Usato

Successivamente, è necessario popolare il codice Class_Initialize. Viene eseguito quando si utilizza per la prima volta l'oggetto all'interno del codice e determina quali valori verranno caricati nell'oggetto

È possibile accedere a questa sottoroutine selezionando "Classe" nel primo menu a discesa e "Inizializza" nel secondo menu a discesa della finestra del modulo

12345678910 Sottoclasse privata_Inizializza()Dim objItem As MyItemImposta mItems = Nuova raccoltaPer n = da 1 a 3Set objItem = New MyItemobjItem.Item = Fogli di lavoro("Foglio1").Intervallo("a" & n).ValoreobjItem.Detail = Fogli di lavoro("Foglio1").Intervallo("b" & n).ValoremItems.Add objItemSuccessivo nFine sottotitolo

Il codice imposta un oggetto chiamato "objItem" utilizzando la definizione di "MyItem" che abbiamo creato in precedenza come modulo di classe.

Quindi crea una nuova raccolta basata sull'oggetto "mItems" definito in precedenza

Itera i valori contenuti nel Foglio1 della cartella di lavoro e li inserisce nelle proprietà che abbiamo creato per l'oggetto "MyItem". Si noti che quando si utilizza "objitem", viene visualizzato un menu a discesa che mostra le due proprietà, esattamente come se si stesse utilizzando un oggetto Excel integrato.

L'oggetto elemento viene quindi aggiunto all'oggetto raccolta che ora contiene tutti i dati nei valori delle proprietà.

I dati di input non devono essere presi da un foglio di lavoro. Potrebbe trattarsi di valori statici, oppure potrebbe provenire da una connessione a un database come Microsoft Access o SQL Server, oppure potrebbe provenire da un altro foglio di lavoro.

È quindi necessario aggiungere una funzione pubblica chiamata "Articolo"

123 Elemento di funzione pubblica (indice come numero intero) come MyItemImposta elemento = mItems.Item (indice)Fine funzione

Ciò consente di fare riferimento a singoli oggetti all'interno dell'oggetto della raccolta tramite il loro numero di indice. Questa funzione fornisce uno "specchio" di ciò che sta accadendo nella raccolta "mMyItems" in background.

Dovrai anche aggiungere una proprietà chiamata "Count" in modo che il tuo codice possa stabilire quanti oggetti "MyItem" ci sono nella raccolta "MyItems", se desideri scorrere attraverso di essa.

123 Proprietà pubblica Get Count() As LongConteggio = mItems.CountFine proprietà

In questo caso è necessaria solo una proprietà "Get" perché è di sola lettura. Usa la collezione mItems perché ha già una proprietà count incorporata.

Ora hai un oggetto (MyItems) con una gerarchia completa definita dall'oggetto 'MyItem'

Per far funzionare tutto, ora devi popolare un foglio di lavoro (Foglio1) con i dati in modo che la routine Class Initialize possa raccoglierli nell'oggetto

Il tuo foglio di calcolo dovrebbe assomigliare a questo:

Usando il tuo nuovo oggetto

Ora puoi utilizzare il tuo oggetto Collection (MyItems) all'interno di un modulo VBA Excel standard. Inserisci il seguente codice:

12345678 Sub oggetto_prova()Dim MyClass As New MyItems, n As IntegerMsgBox MyClass.CountPer n = 1 A MyClass.CountMsgBox MyClass.Item(n).ItemMsgBox MyClass.Item(n).DettaglioSuccessivo nFine sottotitolo

Questo codice crea un oggetto chiamato "MyClass" basato sull'oggetto della raccolta che hai creato chiamato "MyItems". Questo attiva la routine "Inizializza" che estrae tutti i dati dal foglio di lavoro nell'oggetto.

Visualizza il numero di elementi nella raccolta e quindi scorre la raccolta mostrando il testo "Articolo" e il testo "Dettagli". Noterai che quando fai riferimento all'oggetto "MyClass" nel tuo codice, vedrai un elenco delle due proprietà dei membri che aiuta ad aggiungere la proprietà corretta.

Se modifichi il valore di una cella nei dati di input sul foglio di calcolo, questo verrà automaticamente aggiornato nella raccolta quando esegui nuovamente il codice sopra, poiché quando si dimensiona l'oggetto, la routine di inizializzazione viene eseguita e preleva tutti i nuovi dati

Se usi la parola "Static" invece di "Dim", la routine di inizializzazione non viene eseguita e i vecchi valori vengono mantenuti, purché il codice sia continuamente in esecuzione. Se i dati sul foglio di calcolo cambiano, ciò non si rifletterà nell'oggetto

1234567 Sub Test_Statico()Static Myclass As New MyItems, n As IntegerPer n = 1 A Myclass.CountMsgBox Myclass.Item(n).ItemMsgBox Myclass.Item(n).DettagliSuccessivo nFine sottotitolo

Riepilogo della creazione di un oggetto utilizzando un modulo di classe

Come hai visto, la creazione di una gerarchia di moduli di classe da utilizzare come oggetto è un'attività piuttosto complicata, anche per una struttura semplice come l'esempio fornito qui. La possibilità di commettere errori è enorme!

Tuttavia, ha enormi vantaggi nel rendere il tuo codice più elegante e più facile da leggere. È anche più semplice condividerlo con altre applicazioni e sviluppatori Excel trasformandolo in un componente aggiuntivo.

In questo esempio di come creare un oggetto per contenere i dati, sarebbe un approccio normale creare un array multidimensionale per contenere i dati del foglio di calcolo a più colonne e scriveresti una riga di codice per aggiornare o leggere ogni elemento in la matrice. Questo probabilmente finirebbe per essere piuttosto disordinato e si potrebbero facilmente commettere errori nell'affrontare i vari elementi.

Con il tuo nuovo oggetto, puoi semplicemente fare riferimento ad esso e ai membri che hai creato sotto di esso per contenere i dati.

Inoltre, se i dati cambiano nel foglio di calcolo (o in un database collegato se è stato utilizzato come origine dati all'interno del modulo di classe) ogni volta che si utilizza l'istruzione 'Dim' verrà chiamata la routine di inizializzazione e i dati verranno aggiornati immediatamente . Non è necessario scrivere codice per ripopolare l'array.

Utilizzo di un modulo di classe per creare un repository di variabili

Quando scrivi codice VBA, usi variabili ovunque, tutte con ambiti diversi. Alcuni possono essere definiti solo per una particolare procedura, alcuni per un particolare modulo e alcuni possono essere variabili globali che possono essere utilizzate in tutta l'applicazione

È possibile creare un modulo di classe che conterrà un numero elevato di variabili e, poiché è un oggetto, può essere utilizzato ovunque all'interno del codice, anche in un modulo utente o in un controllo Active X inserito in un foglio di lavoro.

Il vantaggio aggiuntivo è che quando fai riferimento al tuo oggetto variabile, vedrai un elenco di tutti i nomi delle variabili contenuti nell'oggetto ordinato in ordine crescente.

Per creare un repository, è necessario inserire un nuovo modulo di classe. Puoi farlo usando Inserisci | Modulo di classe dal menu VB Editor

Cambia il nome in "MyVariables" utilizzando la stessa metodologia discussa in precedenza in questo articolo.

Inserisci il seguente codice:

12345678910111213141516 mV privato come varianteProprietà pubblica Ottieni variabile1() come varianteVariabile1 = mVFine proprietàProprietà pubblica Let Variable1(ByVal vNewValue As Variant)mV = vNuovoValoreFine proprietàProprietà pubblica Ottieni Variabile2() come varianteVariabile1 = mVFine proprietàProprietà pubblica Let Variable2(ByVal vNewValue As Variant)mV = vNuovoValoreFine proprietà

Questo codice imposta le proprietà "Let" e "Get" per due variabili ("Variable1" e "Variable2"). Le proprietà Let e ​​Get sono necessarie per ciascuna delle tue variabili in modo che siano lette/scritte

Puoi usare i tuoi nomi per le variabili invece di quelli di esempio in questo codice e puoi aggiungere ulteriori variabili, assicurandoti che ogni nuova variabile abbia un'istruzione "Let" e "Get".

La dichiarazione privata della variabile 'mV' serve a creare una variabile di lavoro che viene utilizzata solo all'interno del modulo di classe per trasferire valori.

Per utilizzare il repository delle variabili, inserisci il seguente codice in un modulo standard:

123456 Global VarRepo come nuove MyVariablesSub TestVariableRepository()MsgBox VarRepo.Variable1VarRepo.Variabile1 = 10MsgBox VarRepo.Variable1Fine sottotitolo

Questo codice crea un'istanza globale del tuo oggetto "MyVariables" che hai creato. Hai solo bisogno di fare questa dichiarazione una volta da qualsiasi punto all'interno del tuo codice.

Il codice mostra prima il valore di "Variabile1" per mostrare che è vuoto.

Un valore di 10 viene assegnato a "Variabile1" e il nuovo valore all'interno dell'oggetto viene quindi visualizzato per mostrare che questa proprietà ora contiene questo valore.

Poiché l'istanza dell'oggetto "MyVariables" è stata definita a livello globale, è possibile fare riferimento a qualsiasi variabile definita all'interno dell'oggetto da qualsiasi punto del codice.

Questo ha un enorme vantaggio in quanto se vuoi usare le tue variabili ovunque nel tuo codice, devi solo definire una variabile globale, e da quell'istanza, tutte le variabili possono essere liberamente accessibili e modificate in tutto il tuo codice.

Trasforma il tuo oggetto in un componente aggiuntivo

Finora, il codice per la creazione dell'oggetto è all'interno dell'applicazione della cartella di lavoro. Tuttavia, se vuoi essere in grado di condividere il tuo oggetto con altri sviluppatori o in altre tue applicazioni Excel, puoi trasformarlo in un componente aggiuntivo

Per fare ciò, tutto ciò che deve accadere è salvare il file come componente aggiuntivo. Seleziona File | Salva con nome e apparirà una finestra del browser

Seleziona il tipo di file come componente aggiuntivo (.xlam) dal menu a discesa del tipo di file e fai clic su OK. Il file verrà salvato nella cartella del componente aggiuntivo per impostazione predefinita, ma è possibile modificare la posizione.

Puoi quindi incorporare il file aggiuntivo nelle tue applicazioni Excel, offrendoti la flessibilità di utilizzare il tuo nuovo oggetto

Per includere il tuo nuovo componente aggiuntivo in Excel, fai clic su File sulla barra multifunzione di Excel, quindi fai clic su Opzioni nella parte inferiore del riquadro di sinistra

Fai clic su "Componenti aggiuntivi" nel riquadro di sinistra nella finestra pop-up che appare. Nella parte inferiore della finestra c'è un pulsante contrassegnato con "Vai"

Fare clic su questo e verrà visualizzata una finestra pop-up "Componente aggiuntivo". Fare clic su "Sfoglia" e quindi individuare il file del componente aggiuntivo. Sarai quindi in grado di fare riferimento al tuo oggetto nel tuo codice.

Aiuterete lo sviluppo del sito, condividere la pagina con i tuoi amici

wave wave wave wave wave