Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Scrivere la Tua Prima Procedura VBA | Introduzione a VBA e al Modello a Oggetti di Excel
Excel VBA per l'Automazione Aziendale

Scrivere la Tua Prima Procedura VBA

Scorri per mostrare il menu

La registrazione delle macro insegna il vocabolario; scriverne una da zero è il punto in cui si inizia a pensare come un programmatore.

Anatomia di una Sub Procedure

Ogni blocco riutilizzabile di codice VBA che esegue un'azione (anziché restituire un valore, come fa una Function) viene scritto come una Sub:

Sub ProcedureName()
    ' instructions go here
End Sub

Con il cursore posizionato all'interno di una Sub, premere F5 (o cliccare sulla freccia verde Esegui) per eseguirla. I commenti — qualsiasi riga che inizia con un apostrofo (') — vengono completamente ignorati da VBA; utilizzarli generosamente per spiegare perché il codice fa qualcosa, non solo cosa fa, poiché il cosa di solito è evidente leggendo il codice stesso.

Abitudini di formattazione che danno risultati immediati

  • Digitare Option Explicit in cima a ogni modulo — obbliga a dichiarare ogni variabile, aiutando a individuare errori di battitura prima che diventino bug;
  • Rientrare il codice all'interno di cicli e blocchi If con un Tab — l'editor VBE non lo impone, ma il codice senza rientri diventa rapidamente illeggibile;
  • Usare nomi descrittivi (HighEarnerCount, non x) — sarà utile in futuro.

Esempio pratico: Evidenziare i redditi alti

Scriviamo manualmente una procedura che esamina ogni dipendente nella tabella ed evidenzia chi guadagna più di $55,000 — qualcosa che il registratore di macro non potrebbe mai fare, perché richiede una decisione (un'istruzione If) ripetuta per ogni riga (un ciclo).

Option Explicit
 
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
 
    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
 
    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i
 
    MsgBox "Done — high earners are highlighted."
End Sub
Analisi riga per riga
expand arrow
  • Dim ws As Worksheet / Dim i As Long — queste dichiarano due variabili: ws conterrà un riferimento al foglio Employees, e i servirà per contare le righe;
  • Set ws = ThisWorkbook.Worksheets("Employees") — questa è la buona pratica dell'object model: nominare esplicitamente il foglio invece di affidarsi a quello attivo;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — un'espressione standard che trova l'ultima riga utilizzata nella colonna A, indipendentemente dal numero di dipendenti nella tabella;
  • For i = 2 To lastRow ... Next i — un ciclo che ripete il codice per ogni riga di dati, iniziando dalla riga 2 per saltare l'intestazione;
  • If ws.Cells(i, 6).Value > 55000 Then — una decisione: solo le righe in cui la colonna Salary (colonna 6) supera 55000 vengono formattate;
  • MsgBox — una semplice finestra pop-up che conferma il completamento della macro.

Digita questa procedura in modIntro, posiziona il cursore al suo interno e premi F5. Verifica tu stesso i numeri — Emma Davis e Olivia Brown sono i due dipendenti che guadagnano più di $55.000 nella tabella di esempio.

Attività

  1. Digita HighlightTopEarners esattamente come mostrato in modIntro ed eseguila. Conferma che due righe diventano verdi.
  2. Duplica la procedura come HighlightITDepartment e modifica la condizione in modo che evidenzi qualsiasi riga in cui il Dipartimento (colonna 3) è uguale a "IT" invece di controllare lo Stipendio.
  3. Aggiungi un commento sopra ogni procedura che spieghi, in una frase, cosa fa — esercitati a scrivere commenti per il lettore, non per te stesso.
  4. Salva nuovamente la cartella di lavoro (è ancora .xlsm, quindi un normale Ctrl+S va bene).
Suggerimento
expand arrow
  1. Seleziona l'intera procedura HighlightTopEarners (da Sub a End Sub), copiala e incollala subito sotto in modIntro.
  2. Rinomina la riga Sub della seconda copia in Sub HighlightITDepartment() — ogni procedura in un modulo deve avere un nome univoco, altrimenti VBA non saprà quale eseguire.
  3. La condizione da modificare è la riga If. Attualmente controlla un numero:
If ws.Cells(i, 6).Value > 55000 Then

Ora deve controllare un testo — la colonna 3 (Dipartimento) deve essere uguale a "IT". Ricorda dal Capitolo 2 che i confronti tra testi richiedono le virgolette attorno al valore da confrontare e si usa = invece di >. 4. Tutto il resto all'interno del ciclo (la riga Interior.Color, la struttura del ciclo stesso) può rimanere esattamente uguale — cambia solo la condizione da verificare.

Aggiunta di commenti

  1. Una riga di commento inizia con un apostrofo (') e va su una riga propria direttamente sopra la riga Sub — non all'interno della procedura.
  2. Scrivila come se stessi spiegando la macro a un collega che non l'ha mai vista, non come promemoria per te stesso. Confronta:
    • Poco utile: ' scorre le righe (descrive come, cosa che il codice già mostra)
    • Più utile: ' Evidenzia i dipendenti che guadagnano più di $55.000 (descrive cosa realizza, che non è ovvio a colpo d'occhio)
  3. Fai lo stesso per la seconda procedura — una frase che descriva cosa evidenzia e perché, in termini di obiettivo aziendale (personale del dipartimento IT), non della meccanica del ciclo.
Soluzione
expand arrow
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — high earners are highlighted."
End Sub

' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = "IT" Then
            ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — IT department is highlighted."
End Sub

Digita entrambe in modIntro, esegui prima HighlightTopEarners e conferma che esattamente due righe diventano verdi (Emma Davis a $62.000 e Sophia Miller a $59.000 — le altre tre sono pari o inferiori a $55.000), poi esegui HighlightITDepartment e conferma che viene evidenziata invece la riga di Sophia Miller. Salva con Ctrl+S una volta che entrambe funzionano.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 6

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 1. Capitolo 6
some-alt