[Tutorial VBA] Consigli per i Newbies

Stato
Chiusa ad ulteriori risposte.

Zer0Kelvin

VBA Expert
Expert
19 Novembre 2016
1.560
63
59
Teramo (Provincia)
zer0kelvin.altervista.org
2010
95
Ciao a tutti.

Alcune semplici regole che possono aiutare molto nella stesura dei programmi in VBA.

Mettete sempre le cinture di sicurezza.
Rendete obbligatoria la dichiarazione delle variabili
Questo vi aiuterà a scoprire molti errori gia in fase di compilazione.
Per esempio:
errori di battitura
Codice:
Public Sub MiaMacro()
ambarabàcicìcocò = 1
For c = 1 To 100
    ambarabàcicìcocò = ambarabàcicicocò + 1
Next c
MsgBox ambarabàcicìcocò
End Sub
a fine ciclo la variabile visualizzata vale ancora 1 a causa dell'errore di battitura.
assegnazioni errate
Codice:
Public Sub MiaMacro2()
    Myrange = Range("A2:A5") 'mi sono dimenticato l'istruzione Set
'altro codice..
'eccetera eccetera
    For Each Cella In Myrange.Cells '<<==
        MsgBox Cella.Value
    Next Cella
End Sub
nel punto indicato dalla freccia vedrete comparire l'errore misterioso:
Errore di Run-Time '424':
Necessario oggetto
:occhispalancati:
Dopo l'assegnazione MyRange non conterrà un Range, ma un vettore.

Per rendere obbligatoria la dichiarazione delle variabili potete usare
Codice:
Option Explicit
all'inizio del modulo, oppure impostarla da menù
-Strumenti->Opzioni->scheda "Editor" e mettete la spunta a "Dichiarazione di variabili obbligatoria"

Mettete sempre pantaloni larghi.
Mi è capitato di leggere domande tipo: "perchè usare un Long se la mia tabella ha solo 100 righe?"
Ci possono essere diversi motivi, i più banali:
-potrei usare lo stesso codice in un contesto diverso (particolarmente vero se il codice viene postato su un forum)
-il n° di righe potrebbe, un domani, superare la capacità di integer
In linea di massima, in questi casi, "chi sparagna spreca" (...tempo a correggere il codice).
Se avete un oggetto piccolo da mettere in una scatola grande va bene; ma se avete un oggetto grande e una scatola piccola?

Finite sempre ciò che cominciate.
Non capita di rado di dimenticarsi di chiudere un if..end if oppure un ciclo o un With... End With.
Per evitare questi errori è utile scrivere prima le istruzioni di inizio e fine blocco e poi metterci dentro il codice.
Per es. scrivo subito
Codice:
If A = 1 Then
'il codice qui dentro lo scrivo dopo
Else
'idem
End If
e solo dopo inserisco il codice che deve andare in quel blocco.

Tenete sempre in ordine.
Usate sempre l'indentazione; aiuterà voi e chi leggerà il vostro codice ad identificare "a colpo d'occhio" i blocchi di codice.
Un codice ben indentato è molto più comprensibile.
Con
Codice:
    If CdCValido(aCdC) Then
        With CdcCollection(aCdC)
            For C = 1 To .Count
                For Q = LBound(vQualifiche) To UBound(vQualifiche)
                    If .Item(C).Offset(0, 3) = vQualifiche(Q) Then
                        ContaPerCdCeQualifiche = ContaPerCdCeQualifiche + 1
                        If Not IsEmpty(pTime) Then
                            If .Item(C).Offset(0, 4) = 3 Then pTime = pTime + 1
                            If Not IsEmpty(L104) Then
                                If (.Item(C).Offset(0, 5) And cbLegge104) <> 0 Then L104 = L104 + 1
                                If Not IsEmpty(ART42) Then
                                    If (.Item(C).Offset(0, 5) And cbArt42) <> 0 Then ART42 = ART42 + 1
                                    If Not IsEmpty(Prescrizioni) Then
                                        If (.Item(C).Offset(0, 5) And   cbPrescrizioni) <> 0 Then Prescrizioni = Prescrizioni + 1
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next Q
            Next C
        End With
    End If
E senza!
Codice:
If CdCValido(aCdC) Then
With CdcCollection(aCdC)
For C = 1 To .Count
For Q = LBound(vQualifiche) To UBound(vQualifiche)
If .Item(C).Offset(0, 3) = vQualifiche(Q) Then
ContaPerCdCeQualifiche = ContaPerCdCeQualifiche + 1
If Not IsEmpty(pTime) Then
If .Item(C).Offset(0, 4) = 3 Then pTime = pTime + 1
If Not IsEmpty(L104) Then
If (.Item(C).Offset(0, 5) And cbLegge104) <> 0 Then L104 = L104 + 1
If Not IsEmpty(ART42) Then
If (.Item(C).Offset(0, 5) And cbArt42) <> 0 Then ART42 = ART42 + 1
If Not IsEmpty(Prescrizioni) Then
If (.Item(C).Offset(0, 5) And cbPrescrizioni) <> 0 Then Prescrizioni = Prescrizioni + 1
End If
End If
End If
End If
End If
Next Q
Next C
End With
End If

Di chi è questo Next?

Indicate sempre la variabile di controllo alla fine del ciclo For...Next; nel caso di cicli nidificati vi aiuta a capire a quale ciclo appartiene quella parte di codice (Vedi l'esempio qui sopra).

In definitiva, se dovete scrivere una macro di poche righe, potete permettervi di tutto; ma se il codice è di parecchie righe è meglio essere prudenti!
 
  • Like
Reactions: daniela74

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
3.931
63
office pro 2010
52
Bravo Zero...

Aggiungerei anche che:

un istruzione... una riga...
Nomi delle variabili esplicative

Tutto perché, chi legge e chi scrive, gli interlocutori insomma, dovrebbero potersi comprendere senza troppi problemi.
 

alfrimpa

VBA Expert
Supermoderatore
Expert
18 Dicembre 2015
19.468
713
66
Napoli
2013
361
Scusa Zero ma qual è la differenza tra lo scrivere

Codice:
For Each Cella in myRange
e

Codice:
For Each Cella in myRange.Cells
 

Zer0Kelvin

VBA Expert
Expert
19 Novembre 2016
1.560
63
59
Teramo (Provincia)
zer0kelvin.altervista.org
2010
95
Scusa Zero ma qual è la differenza tra lo scrivere

Codice:
For Each Cella in myRange
e

Codice:
For Each Cella in myRange.Cells

In quella situazione MyRange contiene un vettore, quindi il codice
Codice:
Public Sub MiaMacro2()
    Myrange = Range("A2:A5") 'mi sono dimenticato l'istruzione Set
'altro codice..
'eccetera eccetera
    For Each Cella In Myrange
        MsgBox Cella
    Next Cella
End Sub
viene eseguito senza problemi.
 

Marius44

VBA Expert
Moderatore
Expert
9 Settembre 2015
5.714
83
75
Catania
Excel2010
146
Ciao Zer0Kelvin
Non basta darti un "like" come ho fatto ma i complimenti per quanto hai realizzato nisogna farli "di persona, personalmente" :applausi:

Ciao,
Mario
 

Amerigo

Utente abituale
27 Agosto 2015
200
16
49
Salerno
2016
0
Grande Zero.. Saluto_salutocappello_salutaMiInchino

Ho un pò trascurato i progetti prefissatomi per mancanza di tempo libero da dedicare all'apprendimento, ma seguendovi sempre, farò tesoro dei consigli.
Penso sia lo spirito del forum, imparare e insegnare.
Saluti:StrettaDiMano:
Amerigo
 

ges

Excel/VBA Expert
Amministratore
Expert
21 Giugno 2015
20.428
1.733
Como
2011MAC 2016WIN
416
Ciao a tutti,
con imperdonabile ritardo (questa discussione mi era sfuggita), faccio i miei complimenti a Zer0 per la chiara e esaustiva spiegazione.:StrettaDiMano:
 

1234567890

Utente abituale
29 Ottobre 2015
280
16
_
Excel 2007
0
ciao a tutti, ho imparato talmente tanto ZeroK cappello_saluta,
che sono certo che i commenti al codice gli sono "sfuggiti"HideMe
A distanza di tempo, aiutano a ricordare l'impostazione del progetto.

Anche se predico bene, ma razzolo di un male......

Ciao
Frank
 

klingklang

Ciappinaro VBA_Expert
Expert
20 Ottobre 2017
4.830
113
42
San Giovanni in Persiceto (BO)
www.excelswissknife.com
2016, 365
331
Scusa Zero ma qual è la differenza tra lo scrivere

Codice:
For Each Cella in myRange
e

Codice:
For Each Cella in myRange.Cells
Io inizialmente utilizzavo sempre la sintassi For Each Cella in myRange, dopo aver dichiarato entrambe le variabili come range. Mi sono capitate situazioni in cui myRange era definito come ad esempio "UsedRange.Columns(1)", e scrivendo così il ciclo "Cella" non era ciascuna cella della prima colonna del range, ma l'intera colonna stessa. Una ragione in più per sprecare sempre quegli ulteriori 6 caratteri :;):
 

1234567890

Utente abituale
29 Ottobre 2015
280
16
_
Excel 2007
0
ciao a tutti, ho imparato talmente tanto ZeroK cappello_saluta,
che sono certo che i commenti al codice gli sono "sfuggiti"HideMe
A distanza di tempo, aiutano a ricordare l'impostazione del progetto.

Anche se predico bene, ma razzolo di un male......

Ciao
Frank
edit
ho imparato talmente tanto da ZeroK
 
Stato
Chiusa ad ulteriori risposte.

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!