excel-vba
Отладка и устранение неполадок
Поиск…
Синтаксис
- Debug.Print (строка)
- Стоп () / Стоп
Debug.Print
Чтобы распечатать список описаний кодов ошибок в окне «Немедленное», перейдите к функции 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
Вы можете показать окно «Немедленное»:
- Выбор V iew | I mmediate Window из строки меню
- Использование сочетания клавиш Ctrl-G
Стоп
Команда Stop приостанавливает выполнение при вызове. Оттуда процесс можно возобновить или выполнить шаг за шагом.
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
Немедленное окно
Если вы хотите протестировать строку макрокода, не требуя запуска всего суб, вы можете вводить команды непосредственно в окно Immediate и нажимать ENTER
для запуска строки.
Для тестирования вывода строки вы можете поставить перед ним знак вопроса ?
для печати непосредственно в окне Immediate. В качестве альтернативы вы также можете использовать команду print
для вывода вывода.
В редакторе Visual Basic нажмите CTRL + G
чтобы открыть окно Immediate. Чтобы переименовать текущий выбранный лист в «ExampleSheet», введите следующее в окне «Немедленное» и нажмите ENTER
ActiveSheet.Name = "ExampleSheet"
Чтобы напечатать имя текущего выбранного листа непосредственно в окне «Немедленное»
? ActiveSheet.Name
ExampleSheet
Этот метод может быть очень полезен для проверки функциональности встроенных или определенных пользователем функций перед их внедрением в код. В приведенном ниже примере показано, как окно Immediate можно использовать для проверки вывода функции или ряда функций для подтверждения ожидаемого.
'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
Непосредственное окно также может использоваться для установки или сброса приложений, рабочей книги или других необходимых свойств. Это может быть полезно, если у вас есть Application.EnableEvents = False
в подпрограмме, которая неожиданно вызывает ошибку, заставляя ее закрываться без сброса значения в True
(что может вызвать разочарование и неожиданную функциональность. В этом случае команды могут быть введены непосредственно в окно Immediate и запустите:
? 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
Для более сложных методов отладки двоеточие :
можно использовать в качестве разделителя строк. Это можно использовать для многострочных выражений, таких как цикл в приведенном ниже примере.
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
Использование таймера для поиска узких мест в производительности
Первым шагом в оптимизации скорости является поиск самых медленных разделов кода. Функция Timer
VBA возвращает количество секунд, прошедших с полуночи, с точностью 1/256 секунды (3,90625 миллисекунды) на компьютерах под управлением Windows. Функции VBA Now
и Time
верны с точностью до секунды.
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"
Добавление точки останова к вашему коду
Вы можете легко добавить точку останова в свой код, нажав на серый столбец слева от строки вашего кода VBA, где вы хотите остановить выполнение. В столбце появляется красная точка, а код точки останова также выделяется красным цветом.
Вы можете добавить несколько точек останова по всему вашему коду и возобновить выполнение, нажав значок «играть» в строке меню. Не весь код может быть точкой останова в качестве строк определения, первая или последняя строка процедуры и строки комментариев не могут быть выбраны в качестве точки останова.
Окно локаторов отладки
Окно Locals обеспечивает легкий доступ к текущему значению переменных и объектов в рамках функции или подпрограммы, в которой вы работаете. Это важный инструмент для отладки вашего кода и перехода к изменениям, чтобы найти проблемы. Он также позволяет вам исследовать свойства, которые, возможно, не были известны.
Возьмем следующий пример:
Option Explicit
Sub LocalsWindowExample()
Dim findMeInLocals As Integer
Dim findMEInLocals2 As Range
findMeInLocals = 1
Set findMEInLocals2 = ActiveWorkbook.Sheets(1).Range("A1")
End Sub
В редакторе VBA нажмите «Вид» -> «Окно локалей».
Затем, перейдя через код с помощью F8 после нажатия внутри подпрограммы, мы остановились перед тем, как назначить findMeinLocals. Ниже вы можете увидеть, что значение равно 0 --- и это то, что будет использовано, если вы никогда не назначили ему значение. Объект диапазона - «Ничего».
Если мы остановимся до завершения подпрограммы, мы увидим окончательные значения переменных.
Мы можем видеть findMeInLocals со значением 1 и типом Integer и FindMeInLocals2 с типом Range / Range. Если щелкнуть знак +, мы можем развернуть объект и увидеть его свойства, такие как счетчик или столбец.