excel-vba
Debugowanie i rozwiązywanie problemów
Szukaj…
Składnia
- Debug.Print (ciąg)
- Stop () / Stop
Debuguj. Drukuj
Aby wydrukować listę opisów kodów błędów w oknie natychmiastowym, przekaż ją do funkcji 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
Możesz wyświetlić okno natychmiastowe poprzez:
- Wybór V iew | I Średnie okno z paska menu
- Za pomocą skrótu klawiaturowego Ctrl-G
Zatrzymać
Polecenie Stop wstrzyma wykonanie po wywołaniu. Stamtąd proces można wznowić lub wykonać krok po kroku.
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
Natychmiastowe okno
Jeśli chcesz przetestować wiersz kodu makra bez konieczności uruchamiania całego podrzędnego, możesz wpisać polecenia bezpośrednio w oknie natychmiastowym i nacisnąć ENTER
aby uruchomić wiersz.
Aby przetestować wynik linii, możesz poprzedzić go znakiem zapytania ?
aby wydrukować bezpośrednio w oknie natychmiastowym. Alternatywnie można również użyć polecenia print
aby wydrukować wydruk.
W Edytorze Visual Basic naciśnij CTRL + G
aby otworzyć okno natychmiastowe. Aby zmienić nazwę aktualnie wybranego arkusza na „ExampleSheet”, wpisz następujące polecenie w oknie natychmiastowym i naciśnij ENTER
ActiveSheet.Name = "ExampleSheet"
Aby wydrukować nazwę aktualnie wybranego arkusza bezpośrednio w oknie natychmiastowym
? ActiveSheet.Name
ExampleSheet
Ta metoda może być bardzo przydatna do testowania funkcjonalności wbudowanych lub zdefiniowanych przez użytkownika funkcji przed ich implementacją w kodzie. Poniższy przykład pokazuje, w jaki sposób można użyć okna natychmiastowego do przetestowania wyniku funkcji lub serii funkcji w celu potwierdzenia oczekiwanego.
'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
Okno natychmiastowe można również wykorzystać do ustawienia lub zresetowania aplikacji, skoroszytu lub innych potrzebnych właściwości. Może to być przydatne, jeśli masz Application.EnableEvents = False
w podprogramie, który nieoczekiwanie generuje błąd, powodując jego zamknięcie bez resetowania wartości do True
(co może powodować frustrujące i nieoczekiwane działanie. W takim przypadku polecenia można wpisywać bezpośrednio do okna natychmiastowego i uruchom:
? 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
W przypadku bardziej zaawansowanych technik debugowania dwukropek :
może być używany jako separator linii. Można tego użyć do wyrażeń wieloliniowych, takich jak zapętlanie w poniższym przykładzie.
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
Użyj Timera, aby znaleźć wąskie gardła w wydajności
Pierwszym krokiem w optymalizacji szybkości jest znalezienie najwolniejszych sekcji kodu. Funkcja Timer
VBA zwraca liczbę sekund, które upłynęły od północy z dokładnością do 1/256 sekundy (3,90625 milisekund) na komputerach z systemem Windows. Funkcje VBA Now
i Time
są dokładne z dokładnością do sekundy.
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"
Dodanie punktu przerwania do kodu
Możesz łatwo dodać punkt przerwania do swojego kodu, klikając szarą kolumnę po lewej stronie wiersza kodu VBA, w którym chcesz zatrzymać wykonywanie. Czerwona kolumna pojawia się w kolumnie, a kod punktu przerwania jest również podświetlony na czerwono.
Możesz dodać wiele punktów przerwania w całym kodzie, a wznowienie wykonania można osiągnąć, naciskając ikonę „Odtwórz” na pasku menu. Nie cały kod może być punktem przerwania jako linie definicji zmiennej, nie można wybrać pierwszego lub ostatniego wiersza procedury i linii komentarza jako punktu przerwania.
Okno Lokalne debuggery
Okno Locals zapewnia łatwy dostęp do bieżącej wartości zmiennych i obiektów w zakresie uruchomionej funkcji lub podprogramu. Jest to niezbędne narzędzie do debugowania kodu i wprowadzania zmian w celu znalezienia problemów. Umożliwia także eksplorację właściwości, o których istnieniu mogłeś nie wiedzieć.
Weź następujący przykład
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
W Edytorze VBA kliknij Widok -> Okno mieszkańców
Następnie, przechodząc przez kod za pomocą F8 po kliknięciu wewnątrz podprogramu, zatrzymaliśmy się przed przejściem do przypisywania findMeinLocals. Poniżej możesz zobaczyć, że wartość wynosi 0 --- i to by było, gdybyś nigdy nie przypisał jej wartości. Obiektem zasięgu jest „Nic”.
Jeśli zatrzymamy się tuż przed zakończeniem podprogramu, zobaczymy końcowe wartości zmiennych.
Widzimy findMeInLocals o wartości 1 i typie Integer oraz FindMeInLocals2 o typie Range / Range. Klikając znak +, możemy rozwinąć obiekt i zobaczyć jego właściwości, takie jak liczba lub kolumna.