excel-vba
Debug e risoluzione dei problemi
Ricerca…
Sintassi
- Debug.Print (stringa)
- Basta basta
Debug.Print
Per stampare un elenco delle descrizioni dei codici di errore nella finestra immediata, passarlo alla funzione Debug.Print
:
Private Sub ListErrCodes()
Debug.Print "List Error Code Descriptions"
For i = 0 To 65535
e = Error(i)
If e <> "Application-defined or object-defined error" Then Debug.Print i & ": " & e
Next i
End Sub
Puoi mostrare la finestra immediata di:
- Selezionare V isualizza | I mmediate Window dalla barra dei menu
- Usando la scorciatoia da tastiera Ctrl-G
Stop
Il comando Stop interrompe l'esecuzione quando viene chiamato. Da lì, il processo può essere ripreso o essere eseguito passo dopo passo.
Sub Test()
Dim TestVar as String
TestVar = "Hello World"
Stop 'Sub will be executed to this point and then wait for the user
MsgBox TestVar
End Sub
Finestra immediata
Se desideri testare una riga di codice macro senza dover eseguire un intero sottotitolo, puoi digitare i comandi direttamente nella finestra immediata e premere ENTER
per eseguire la riga.
Per testare l'output di una linea, puoi precederla con un punto interrogativo ?
per stampare direttamente nella finestra immediata. In alternativa, è anche possibile utilizzare il comando di print
per print
l'output.
Mentre nel Visual Basic Editor, premere CTRL + G
per aprire la Finestra Immediata. Per rinominare il foglio attualmente selezionato in "Foglio di esempio", digita quanto segue nella Finestra immediata e premi ENTER
ActiveSheet.Name = "ExampleSheet"
Per stampare il nome del foglio attualmente selezionato direttamente nella Finestra immediata
? ActiveSheet.Name
ExampleSheet
Questo metodo può essere molto utile per testare la funzionalità di funzioni incorporate o definite dall'utente prima di implementarle nel codice. L'esempio seguente mostra come la finestra immediata può essere utilizzata per testare l'output di una funzione o una serie di funzioni per confermare un risultato previsto.
'In this example, the Immediate Window was used to confirm that a series of Left and Right
'string methods would return the desired string
'expected output: "value"
print Left(Right("1111value1111",9),5) ' <---- written code here, ENTER pressed
value ' <---- output
La finestra immediata può anche essere utilizzata per impostare o ripristinare l'applicazione, la cartella di lavoro o altre proprietà necessarie. Questo può essere utile se Application.EnableEvents = False
in una subroutine genera un errore inaspettatamente, causando la chiusura senza reimpostare il valore su True
(che può causare funzionalità frustranti e impreviste. In questo caso, i comandi possono essere digitati direttamente nella finestra immediata ed eseguire:
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
False ' <---- Output
Application.EnableEvents = True ' <---- Resetting the property value to True
? Application.EnableEvents ' <---- Testing the current state of "EnableEvents"
True ' <---- Output
Per tecniche di debug più avanzate, i due punti :
possono essere utilizzati come separatori di riga. Questo può essere usato per espressioni multi-linea come il loop nell'esempio sotto.
x = Split("a,b,c",","): For i = LBound(x,1) to UBound(x,1): Debug.Print x(i): Next i '<----Input this and press enter
a '<----Output
b '<----Output
c '<----Output
Utilizzare il timer per individuare i colli di bottiglia nelle prestazioni
Il primo passo per ottimizzare la velocità è trovare le sezioni di codice più lente. La funzione VBA Timer
restituisce il numero di secondi trascorsi da mezzanotte con una precisione di 1/25 di secondo (3.90625 millisecondi) su PC basati su Windows. Le funzioni VBA Now
e Time
sono accurate solo per un secondo.
Dim start As Double ' Timer returns Single, but converting to Double to avoid
start = Timer ' scientific notation like 3.90625E-03 in the Immediate window
' ... part of the code
Debug.Print Timer - start; "seconds in part 1"
start = Timer
' ... another part of the code
Debug.Print Timer - start; "seconds in part 2"
Aggiunta di un punto di interruzione al codice
Puoi aggiungere facilmente un punto di interruzione al tuo codice facendo clic sulla colonna grigia a sinistra della linea del tuo codice VBA in cui desideri interrompere l'esecuzione. Un punto rosso appare nella colonna e il codice di punto di interruzione è anche evidenziato in rosso.
Puoi aggiungere più punti di interruzione nel codice e riprendere l'esecuzione premendo l'icona "Riproduci" nella barra dei menu. Non tutto il codice può essere un punto di interruzione come linee di definizione delle variabili, la prima o l'ultima riga di una procedura e le righe di commento non possono essere selezionate come punto di interruzione.
Finestra dei debugger locali
La finestra Locals fornisce un facile accesso al valore corrente di variabili e oggetti nell'ambito della funzione o subroutine in esecuzione. È uno strumento essenziale per eseguire il debug del codice e modificare le modifiche per trovare i problemi. Permette anche di esplorare proprietà che potresti non sapere esistessero.
Prendi il seguente esempio,
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
Nell'editor VBA, fare clic su Visualizza -> Finestra locale
Quindi, passando attraverso il codice usando F8 dopo aver fatto clic all'interno della subroutine, ci siamo fermati prima di arrivare all'assegnazione di findMeinLocals. Qui sotto puoi vedere che il valore è 0 --- e questo è quello che verrebbe usato se non gli avessi mai assegnato un valore. L'oggetto range è 'Nothing'.
Se ci fermiamo appena prima della fine della subroutine, possiamo vedere i valori finali delle variabili.
Possiamo vedere findMeInLocals con un valore di 1 e tipo di numero intero e FindMeInLocals2 con un tipo di intervallo / intervallo. Se clicchiamo sul segno +, possiamo espandere l'oggetto e vedere le sue proprietà, come il conteggio o la colonna.