Il registratore di macro di Excel ha molta potenza, ma ha i suoi limiti. Come spiegato in un altro articolo, il registratore di macro spesso registra codice non necessario e non può registrare cose come la logica o le interazioni con altri programmi. Può anche essere difficile da usare per macro più lunghe: potresti trovarti a creare uno storyboard delle tue azioni in anticipo solo per evitare di commettere errori costosi.
Questo articolo ha lo scopo di aiutarti a iniziare a codificare macro da zero in VBA. Imparerai dove sono archiviate le macro, scriverai una macro di base e imparerai le basi della programmazione in VBA utilizzando variabili, logica e loop.
Iniziare
VBA e l'editor di Visual Basic
VBA, o Visual Basic for Applications, è il linguaggio in cui sono scritte le macro. Tutte le macro sono memorizzate come codice VBA, sia che siano codificate manualmente o create con il registratore di macro.
È possibile accedere a tutto il codice VBA in una cartella di lavoro utilizzando Visual Basic Editor. Questo è uno speciale editor di testo e debugger integrato in tutte le app per ufficio, incluso Excel. In genere, aprirai questo editor con il ALT+F11 scorciatoia da tastiera in Excel, ma puoi anche accedervi da Excel Sviluppatore scheda se lo hai abilitato.
L'esploratore del progetto
Il Esplora progetti è una finestra all'interno dell'editor VB che mostra tutti gli elementi che possono contenere codice VBA. Se non vedi questa finestra, premi F5 per farlo apparire o selezionare Esplora progetti dal Visualizzazione menù.
Facendo doppio clic su un elemento in Esplora progetti verrà visualizzato il codice per quell'elemento. Esistono diversi tipi di elementi che possono essere visualizzati in Esplora progetti:
- cartelle di lavoro
- Fogli di lavoro
- Moduli utente
- Moduli di classe
- Moduli (le macro sono memorizzate in questi elementi)
Sebbene tutti questi tipi di elementi possano includere codice VBA, la procedura consigliata consiste nel codificare le macro in Moduli.
Realizzare la tua prima macro
Utilizzo dell'elenco delle macro
L'elenco delle macro mostra tutte le macro nella cartella di lavoro. Da questo elenco puoi modificare una macro esistente o crearne una nuova.
Per creare una nuova macro utilizzando l'elenco Macro:
- Seleziona la scheda Sviluppatore e fai clic su macro (o premere ALT+F8)
- Digita un nuovo nome per la tua macro, quindi fai clic su "Crea"
Dopo aver fatto clic su "Crea", verrà visualizzato l'editor VB, che mostra la macro appena creata. Excel creerà un nuovo modulo per la macro, se necessario.
Manualmente nell'editor VB
È possibile aggiungere manualmente una nuova macro senza l'elenco Macro. Questa è l'opzione migliore se desideri specificare il modulo in cui è salvata la macro.
Per aggiungere una macro manualmente:
- Apri l'editor VB (ALT+F11)
- O:
- Aggiungi un nuovo modulo facendo clic su Inserisci > Modulo nel menu (il modulo si aprirà automaticamente)
-
- OPPURE, fare doppio clic su un modulo esistente in Esplora progetti per aprirlo
- Nel modulo, digita il codice per la tua nuova macro
Sub MyMacro() End Sub
Queste due righe indicano l'inizio e la fine di una macro denominata "MyMacro" (notare le parentesi, che sono obbligatorie). Questo verrà visualizzato nella finestra di dialogo "Visualizza macro" in Excel e può essere assegnato a un pulsante (anche se non fa ancora nulla).
Aggiungi del codice alla macro
Ora aggiungiamo del codice tra le righe "Sub" e "End Sub" per fare in modo che questa macro faccia effettivamente qualcosa:
Sub MyMacro() Range ("A1"). Valore = "Hello World!" Fine sottotitolo
Strutture di base del codice
L'oggetto intervallo
Excel VBA utilizza l'oggetto intervallo per rappresentare le celle in un foglio di lavoro. Nell'esempio sopra, viene creato un oggetto Range con il codice Intervallo ("A1") per accedere al valore della cella A1.
Gli oggetti intervallo vengono utilizzati principalmente per impostare i valori delle celle:
Intervallo ("A1"). Valore = 1
Intervallo ("A1"). Valore = "Prima cella"
Nota che quando definisci i valori delle celle come numeri, inserisci semplicemente il numero, ma quando inserisci il testo devi racchiudere il testo tra virgolette.
Gli intervalli possono essere utilizzati anche per accedere a molte proprietà delle celle come il carattere, i bordi, le formule e altro.
Ad esempio, puoi impostare il carattere di una cella su Grassetto in questo modo:
Intervallo(“A1”).Font.Bold = True
Puoi anche impostare la formula di una cella:
Intervallo ("A1"). Formula = "= Somma (A2: A10)"
In Excel, puoi selezionare un blocco di celle con il cursore (ad esempio, da A1 a D10) e impostarle tutte in grassetto. Gli oggetti intervallo possono accedere a blocchi di celle come questo:
Intervallo ("A1: D10").Font.Bold = True
Puoi anche fare riferimento a più celle/blocchi contemporaneamente:
Intervallo ("A1: D10, A12: D12, G1"). Carattere. Grassetto = Vero
Il formato per questo è lo stesso del formato che useresti quando selezioni le celle per la formula SOMMA() in Excel. Ogni blocco è separato da una virgola e i blocchi sono indicati dalle celle in alto a sinistra e in basso a destra separate da due punti.
Infine, gli oggetti Range hanno metodi incorporati per eseguire operazioni comuni su un foglio di lavoro. Ad esempio, potresti voler copiare alcuni dati da un luogo a un altro. Ecco un esempio:
Range(“A1:D10”).Copy Range(“F1”).PasteSpecial xlPasteValues Range(“F1”).PasteSpecial xlPasteFormats
Questo copia le celle A1: D10 negli appunti, quindi esegue un PasteSpecial() a partire dalla cella C1, proprio come faresti manualmente in Excel. Nota che questo esempio mostra come utilizzare PasteSpecial() per incollare solo valori e formati: ci sono parametri per tutte le opzioni che vedresti nella finestra di dialogo Incolla speciale.
Ecco un esempio di incollare "Tutto" in un altro foglio di lavoro:
Intervallo(“A1:D10”).Copia fogli(“Foglio2”).Intervallo(“A1”).PasteSpecial xlPasteAll
Se Dichiarazioni
Con un Se dichiarazione, puoi eseguire una sezione di codice solo "se" una determinata affermazione è vera.
Ad esempio, potresti voler rendere una cella in grassetto e colorarla di rosso, ma solo "se" il valore nella cella è inferiore a 100.
If Range(“A4”).Value < 100 Then Range(“A4”).Font.Bold = True Range("A4").Interior.Color = vbRed End If
La struttura corretta di un'istruzione If è la seguente (le parentesi quadre indicano componenti opzionali):
Se poi
[AltrimentiSe Allora]
[Altro]
Finisci se
Puoi includerne tanti ElseIf blocchi come preferisci per testare più condizioni. Puoi anche aggiungere un Altro blocco che viene eseguito solo se nessuna delle altre condizioni nell'istruzione If è soddisfatta.
Ecco un altro esempio basato sul precedente, in cui la cella viene formattata in diversi modi a seconda del valore:
If Range("A4").Value < 100 Then Range("A4").Font.Bold = True Range("A4").Interior.Color = vbRed ElseIf Range("A4").Value <200 Then Range( "A4").Font.Bold = False Range("A4").Interior.Color = vbYellow Else Range("A4").Font.Bold = False Range("A4").Interior.Color = vbGreen End If
Nell'esempio sopra, la cella non è in grassetto nei blocchi ElseIf in cui il valore non è inferiore a 100. Puoi nido If istruzioni per evitare la duplicazione del codice, in questo modo:
If Range("A4").Value < 100 Then Range("A4").Font.Bold = True Range("A4").Interior.Color = vbRed Else Range("A4").Font.Bold = False ' annullare il grassetto del carattere solo una volta If Range("A4").Value < 200 Then Range("A4").Interior.Color = vbYellow Else Range("A4").Interior.Color = vbGreen End If End If
Variabili
UN Variabile è un pezzo di memoria utilizzato per memorizzare informazioni temporanee durante l'esecuzione di una macro. Vengono spesso utilizzati nei cicli come iteratori o per contenere il risultato di un'operazione che si desidera utilizzare più volte durante una macro.
Ecco un esempio di una variabile e come potresti usarla:
Sub ExtractSerialNumber() Dim strSerial As String ' questa è la dichiarazione della variabile ' 'As String' significa che questa variabile ha lo scopo di contenere il testo ' impostare un numero seriale falso: Range("A4").Value = “serial# 804567-88 ” ' analizza il numero seriale dalla cella A4 e assegnalo alla variabile strSerial = Mid(Range(“A4”).Value, 9) ' ora usa la variabile due volte, invece di dover analizzare il numero seriale due volte Range(“ B4”).Value = strSerial MsgBox strSerial End Sub
In questo esempio di base, la variabile "strSerial" viene utilizzata per estrarre il numero di serie dalla cella A4 utilizzando la funzione Mid(), quindi viene utilizzata in altri due punti.
Il modo standard per dichiarare una variabile è la seguente:
fioco qualunque sia il nome [Come genere]
- qualunque sia il nome è il nome che decidi di dare alla tua variabile
- genere è il tipo di dati della variabile
Il “[As genere]” può essere omessa - in tal caso, la variabile viene dichiarata come tipo Variant, che può contenere qualsiasi tipo di dati. Sebbene perfettamente validi, i tipi Variant dovrebbero essere evitati poiché possono portare a risultati imprevisti se non si presta attenzione.
Ci sono regole per i nomi delle variabili. Devono iniziare con una lettera o un carattere di sottolineatura, non possono contenere spazi, punti, virgole, virgolette o i caratteri “! @ & $ #”.
Ecco alcuni esempi di dichiarazioni di variabili:
Dim strFilename As String ' stile buon nome - descrittivo e usa il prefisso Dim i As Long ' stile cattivo nome - accettabile solo per alcuni iteratori Dim SalePrice As Double ' stile nome ok - descrittivo, ma non usa un prefisso Dim iCounter ' nome ok - non troppo descrittivo, usa il prefisso, nessun tipo di dato
Tutti questi esempi utilizzano schemi di denominazione leggermente diversi, ma tutti sono validi. Non è una cattiva idea anteporre al nome di una variabile una forma breve del suo tipo di dati (come in alcuni di questi esempi), poiché rende il codice più leggibile a colpo d'occhio.
VBA include molti elementi di base tipi di dati. I più popolari includono:
- Corda (usato per contenere dati di testo)
- Lungo (usato per contenere numeri interi, cioè senza cifre decimali)
- Doppio (usato per contenere numeri in virgola mobile, cioè cifre decimali)
Un elenco completo dei tipi di dati intrinseci VBA è disponibile qui: https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/data-type-summary
Variabili oggetto intervallo
È anche possibile creare variabili che fanno riferimento a oggetti di intervallo. Ciò è utile se si desidera fare riferimento a un intervallo specifico nel codice in più punti: in questo modo, se è necessario modificare l'intervallo, è sufficiente modificarlo in un punto.
Quando crei una variabile oggetto Range, devi "impostarla" su un'istanza di un Range. Per esempio:
Dim rMyRange As Range Imposta rMyRange = Range(“A1:A10;D1:J10”)
Lasciare fuori l'istruzione "Set" durante l'assegnazione di una variabile Range si tradurrà in un errore.
loop
I loop sono blocchi che ripetono il codice al loro interno un certo numero di volte. Sono utili per ridurre la quantità di codice che devi scrivere e ti consentono di scrivere un pezzo di codice che esegua le stesse azioni su molti elementi correlati diversi.
Per il prossimo
UN Per il prossimo il blocco è un ciclo che si ripete un certo numero di volte. Usa una variabile come an iteratore per contare quante volte è stato eseguito e questa variabile iteratore può essere utilizzata all'interno del ciclo. Ciò rende i cicli For-Next molto utili per scorrere le celle o gli array.
Ecco un esempio che scorre le celle nelle righe da 1 a 100, colonna 1 e imposta i loro valori sul valore della variabile iteratore:
Dim i As Long For i = 1 To 100 Cells(i, 1).Value = i Next i
La riga "For i = 1 To 100" significa che il ciclo inizia da 1 e termina dopo 100. Puoi impostare qualsiasi numero iniziale e finale che desideri; puoi anche usare variabili per questi numeri.
Per impostazione predefinita, i cicli For-Next contano per 1. Se vuoi contare con un numero diverso, puoi scrivere il ciclo con un esplicito Fare un passo clausola:
Per i = da 5 a 100 Passaggio 5
Questo ciclo inizierà da 5, quindi aggiungerà 5 a "i" ogni volta che il ciclo si ripete (quindi "i" sarà 10 alla seconda ripetizione, 15 alla terza e così via).
Usando Fare un passo, puoi anche fare in modo che un ciclo conti all'indietro:
Per i = 100 a 1 passo -1
Puoi anche nido Cicli For-Next. Ogni blocco richiede la propria variabile con cui contare, ma puoi usare quelle variabili ovunque tu voglia. Ecco un esempio di come è utile in Excel VBA:
Dim i As Long, j As Long For i = 1 To 100 For j = 1 To 100 Cells(i, j).Value = i * j Next j Next i
Ciò consente di scorrere sia le righe che le colonne.
AVVERTIMENTO: sebbene sia consentito, non dovresti MAI MODIFICARE la variabile iteratore all'interno di un blocco For-Next, poiché utilizza quell'iteratore per tenere traccia del ciclo. La modifica dell'iteratore può causare un ciclo infinito e bloccare la macro. Per esempio:
Per i = 1 A 100 i = 1 Avanti i
In questo ciclo, "I" non andrà mai oltre 2 prima di essere reimpostato su 1 e il ciclo si ripeterà per sempre.
Per ciascuno
Per ciascuno i blocchi sono molto simili ai blocchi For-Next, tranne per il fatto che non utilizzano un contatore per specificare quante volte si ripetono. Invece, un blocco For-Each prende una "raccolta" di oggetti (come un intervallo di celle) e viene eseguito tante volte quanti sono gli oggetti in quella raccolta.
Ecco un esempio:
Dim r As Range For Each r In Range("A15:J54") If r.Value > 0 Then r.Font.Bold = True End If Next r
Notare l'uso della variabile oggetto Range 'r'. Questa è la variabile dell'iteratore utilizzata nel ciclo For-Each: ogni volta che viene eseguito il ciclo, "r" ottiene un riferimento alla cella successiva nell'intervallo.
Un vantaggio dell'utilizzo dei cicli For-Each in Excel VBA è che è possibile scorrere tutte le celle in un intervallo senza annidare i cicli. Questo può essere utile se hai bisogno di scorrere tutte le celle in un intervallo complesso come Intervallo ("A1: D12, J13, M1: Y12").
Uno svantaggio dei cicli For-Each è che non hai alcun controllo sull'ordine in cui vengono elaborate le celle. Sebbene in pratica Excel scorrerà le celle in ordine, in teoria potrebbe elaborare le celle in un ordine completamente casuale. Se hai bisogno di elaborare le celle in un ordine particolare, dovresti invece usare i cicli For-Next.
Do-loop
Mentre i blocchi For-Next utilizzano i contatori per sapere quando fermarsi, Do-loop i blocchi vengono eseguiti fino a quando non viene soddisfatta una condizione. Per fare ciò, usi un Fino a quando clausola all'inizio o alla fine del blocco, che verifica la condizione e provoca l'arresto del ciclo quando tale condizione viene soddisfatta.
Esempio:
Dim str As String str = "Buffalo" Do Until str = "Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo Buffalo" str = str & " " & "Buffalo" Loop Range("A1").Value = str
In questo ciclo, "Buffalo" è concatenato a "str" ogni volta che si attraversa il ciclo finché non corrisponde alla frase prevista. In questo caso, il test viene eseguito all'inizio del ciclo - se 'str' fosse già la frase prevista (che non è perché non l'abbiamo avviata in quel modo, ma se) il ciclo non verrebbe nemmeno eseguito .
Puoi far eseguire il ciclo almeno una volta spostando la clausola Until alla fine, in questo modo:
Do str = str & " " & "Buffalo" Loop Until str = “Buffalo Bufalo Bufalo Bufalo Bufalo Bufalo”
Puoi usare qualsiasi versione abbia senso nella tua macro.
AVVERTIMENTO: puoi causare un loop infinito con un blocco Do-Loop se la condizione Until non è mai soddisfatta. Scrivi sempre il tuo codice in modo che la condizione Until sarà sicuramente soddisfatta quando utilizzi questo tipo di ciclo.
Qual è il prossimo?
Una volta apprese le basi, perché non provare ad apprendere alcune tecniche più avanzate? Il nostro tutorial su https://easyexcel.net/excel/learn-vba-tutorial/ si baserà su tutto ciò che hai imparato qui ed espanderà le tue abilità con eventi, moduli utente, ottimizzazione del codice e molto altro!
