# Debugging and Troubleshooting
If you would like to test a line of macro code without needing to run an entire sub, you can type commands directly into the Immediate Window and hit ENTER to run the line.
For testing the output of a line, you can precede it with a question mark ? to print directly to the Immediate Window. Alternatively, you can also use the print command to have the output printed.
While in the Visual Basic Editor, press CTRL + G to open the Immediate Window. To rename your currently selected sheet to "ExampleSheet", type the following in the Immediate Window and hit ENTER
To print the currently selected sheet’s name directly in the Immediate Window
This method can be very useful to test the functionality of built in or user defined functions before implementing them in code. The example below demonstrates how the Immediate Window can be used to test the output of a function or series of functions to confirm an expected.
The Immediate Window can also be used to set or reset Application, Workbook, or other needed properties. This can be useful if you have Application.EnableEvents = False in a subroutine that unexpectedly throws an error, causing it to close without resetting the value to True (which can cause frustrating and unexpected functionality. In that case, the commands can be typed directly into the Immediate Window and run:
For more advanced debugging techniques, a colon : can be used as a line separator. This can be used for multi-line expressions such as looping in the example below.
# Debug.Print
To print a listing of the Error Code descriptions to the Immediate Window, pass it to the Debug.Print function:
You can show the Immediate Window by:
- Selecting View | Immediate Window from the menu bar
- Using the keyboard shortcut Ctrl-G
# Use Timer to Find Bottlenecks in Performance
The first step in optimizing for speed is finding the slowest sections of code. The Timer VBA function returns the number of seconds elapsed since midnight with a precision of 1/256th of a second (3.90625 milliseconds) on Windows based PCs. The VBA functions Now and Time are only accurate to a second.
# Debugger Locals Window
The Locals window provides easy access to the current value of variables and objects within the scope of the function or subroutine you are running. It is an essential tool to debugging your code and stepping through changes in order to find issues. It also allows you to explore properties you might not have known existed.
Take the following example,
In the VBA Editor, click View —> Locals Window
Then by stepping through the code using F8 after clicking inside the subroutine, we have stopped before getting to assigning findMeinLocals. Below you can see the value is 0 — and this is what would be used if you never assigned it a value. The range object is ‘Nothing’.
If we stop right before the subroutine ends, we can see the final values of the variables.
We can see findMeInLocals with a value of 1 and type of Integer, and FindMeInLocals2 with a type of Range/Range. If we click the + sign we can expand the object and see its properties, such as count or column.
The Stop command will pause the execution when called. From there, the process can be resumed or be executed step by step.
# Adding a Breakpoint to your code
You can easily add a breakpoint to your code by clicking on the grey column to the left of the line of your VBA code where you want execution to stop. A red dot appears in the column and the breakpoint code is also highlighted in red.
You can add multiple breakpoints throughout your code and resuming execution is achieved by pressing the "play" icon in your menu bar. Not all code can be a breakpoint as variable definition lines, the first or last line of a procedure and comment lines cannot be selected as a breakpoint.
VBA-Урок 2. Отладчик (Debugger)
Иструмент в среде VBA для отладки кода программ. Уметь работать с дебагером жизненно важно каждому, кто пишет на VBA . Он нужен для того, чтобы проверить как работает ваш код, и чтобы найти и исправить в нем ошибки.
Откройте Visual Basic Editor (Alt + F11) . Создайте в нем модуль и пропишите следующий код:
Sub LearningDebug() Dim A As Long, B As Long, C As Long, D As Long D = 0 A = 10 Debug.Print «A = » + Trim(Str(A)) B = 15 Debug.Print «B = » + Trim(Str(B)) C = A + B Debug.Print «C = » + Trim(Str(C)) C = Round(C /5) Debug.Print «С делим на 5: C текст» печатают указанный нами текст в открытое ранее окно Immediate , чтобы видеть, что происходит с переменной. Str (A) превращает число в текстовое значение. А Trim () убирает с него справа и слева пробелы. Оператор Round (С) округляет значения по правилам арифметики до целого числа (поэтому результат вычислений мы присваиваем в переменную целого типа Long , значит он должен быть целым). В конце кода мы специально создали ложную ситуацию, чтобы потренироваться использовать дебагер.
Станьте внутрь кода и нажмите F8 четыре раза. Желтым будет отмечено строку, который будет выполнен следующим. Наведите курсор на различные переменные. При этом появится всплывающее окошко, в котором увидите значение. Переменные, которым еще не были присвоены значения равны нулю.
Нажмите еще раз F8. В окне Immediate появится строка:
А = 10
Теперь мы можем изменить значение переменной A сразу в окне Immediate (например, изменим его на 8) . Для этого в новой строке окна Immediate напишите:
А = 8
и нажмите Enter . Теперь наведите на переменную A курсор и увидите, что его значение равно 8. чтобы увидеть значение, не приводя курсор, можно заставить его появиться в окне Immediate. Делается это так, введите в пустой строке окна Immediate:
?A
и нажмите Enter. Знак в окне Immediate означает то же самое, что и Debug.Print в коде. Просто так удобнее и короче писать. Сразу вы увидите число — результат вашего запроса.
Станьте курсором на последнюю строку кода (C = Round (C /D)) и нажмите F9. Появится точка остановки. Той же кнопкой ее можно убрать, но мы ее убирать пока не будем. Нажмите F5, программа выполнит все строки и остановится на последней. В окне Immediate появятся, сообщение о присвоении значений переменным. Мы добрались до последней строки кода. Он должен вызвать ошибку, так как содержит деления на ноль. Нажмите F8 и убедитесь в этом. В появившемся окне нажмите Debug. Если вы нажмете End, выполнение программы остановится, а мы хотим довести ее до конца.
Исправить ситуацию можно, изменив значение переменной D. Сейчас она равна нулю. В окне Immediate введите в пустой строке текст:
D = 2
и нажмите Enter . Теперь последней строкой кода мы делим не на ноль, а на 2, таким образом избегая ошибки. Нажмите F5 и программа завершит свою работу без ошибок.
Попробуйте изменить код потренируйтесь в использовании отладчика. Поверьте, он вам очень облегчит жизнь.
VBA – Debug.Print and the Immediate Window
The VBA Immediate Window is used to quickly run lines of VBA code, as well as fetch information about your code or Excel file. This tool allows you to test individual lines of code, which is useful when you are writing and debugging code. The output is displayed in the Immediate Window.
Displaying the Immediate Window
You need to display the Immediate Window first. In order to do this, you would press Alt + F11 to enter the Visual Basic Editor. Once you have inserted a module. Press Ctrl + G to view the Immediate Window.
You should see the following:
Executing Lines of Code
One of the things that the Immediate Window allows you to do is test a line of code. The following code will show you how to use the Immediate Window to fill Cell A1 of the Active Sheet with a light orange fill color. Type in the following line and then press Enter on your keyboard:
Questions and the Immediate Window
You can use the Immediate Window to get information about your workbook. You can do this by using the question mark. If you enter a statement preceded by a question mark then the Immediate Window will deliver the appropriate answer. Let’s say you have the number 5, in cell A1 which is selected. The following code will allow you to use the Immediate Window to get this value:
Run a Macro from the Immediate Window
You can run a macro from the Immediate Window by typing in the name of the macro and pressing Enter. If your macro contains arguments then you can use the Immediate Window and pass the arguments to the macro through the Immediate Window. The following code shows you how to call a macro named CountWorksheets from the Immediate Window:
After pressing Enter, the result is shown on the worksheet in Cell A1.
Using Debug.Print
You can use Debug.Print as part of your sub procedures and this tells the Immediate Window to display certain information. This is used when you don’t want to display values or results in a cell in the workbook itself or in a message box. The following code uses the Debug.Print statement as part of a sub procedure and displays the results in the Immediate Window.
The result when you press F5 to run the macro is shown in the Immediate Window:
Using the Immediate Window When Running Code
You can also use the Immediate Window to set or get a variable’s value while you are stepping through your code:
The following code has a breakpoint that is inserted as shown below:
If you enter ?SName in the Immediate Window while stepping into your code using F8, at the break point you will get the following result:
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
VBA Code Examples Add-in
Easily access all of the code examples found on our site.
Simply navigate to the menu, click, and the code will be inserted directly into your module. .xlam add-in.
информатика / Информатика_2 семестр / 2-VBA / VBA-Учебные материалы / VBA-2 Ввод-вывод,лин_процессы
Оператор присваивания служит для вычисления значения выражения и присваивания этого значения переменной. При записи программы оператор Let можно опускать.
[Let] Имя_переменной = Выражение
Следует различать оператор присваивания и алгебраическое равенство. Оператор Y = A + B означает для ЭВМ: сложить содержимое ячеек памяти, отведенных для размещения значений переменных А и В, и поместить результат в ячейку памяти, отведенную для значения переменной Y. В программировании широко используется конструкция оператора присваивания типа I = I + 1. К заданному значению переменной I прибавляется 1, и результат помещается в ту же ячейку, заменив бывшую там информацию на новую. С точки зрения математики равенство i=i+1 не имеет смысла.
При присвоении переменным строковых значений их необходимо заключать в кавычки:
а значения типа Дата/Время заключать в символы # («решетка»):
ОПЕРАТОРЫ ВВОДА ДАННЫХ
Рассмотрим три основных способа ввода данных.
1. Запись значений переменных непосредственно в тексте программы осуществляется с помощью оператора присваивания.
Имя_переменной = Выражение
Этот способ используется, если исходные данные не изменяются при нескольких исполнениях программы.
2. Ввод данных из ячеек рабочего листа Excel.
Для этого используется инструкция Сells(i, j), которая в данном случае выступает как функция ввода данных. Формат использования:
Имя_переменной = Сells(i, j),
где i, j – порядковые номера соответственно строки и столбца (числовые значения!), на пересечении которых находится ячейка, т. е. адрес ячейки.
При этом следует иметь в виду, что данные на листе Excel уже имеются.
Пример: А = Сells(1, 2)
После выполнения этой команды переменной А присвоится значение, которое хранится в ячейке, находящейся в первой строке (первая цифра) и во втором столбце (вторая цифра), т. е. в ячейке B1 электронной таблицы.
3. Ввод данных непосредственно в ходе выполнения программы, т. е. в диалоговом режиме, выполняется с помощью диалогового окна ввода информации, реализуемого функцией InputBox. Основной формат этой функции:
Имя_переменной = InputBox(“Сообщение” [, “Заголовок”] [, “Значение”]).
В ходе работы программы при выполнении данной команды на экране монитора появляется диалоговое окно с указанным Заголовком, содержащее текст Сообщения, а также поле ввода с указанным Значением:
Выполнение программы приостанавливается в ожидании ввода данных с клавиатуры и нажатия одной из кнопок. После ввода информации и нажатия на кнопку ОК переменной присваивается значение типа String (строковый тип данных), содержащее текст, введенный в поле ввода.
Пример: x = InputBox(“Введите x”, “Ввод исходных данных”, “0.15”)
Имя окна можно опустить (при этом местоположение запятых сохраняется):
x = InputBox(«Введите x», , «0.15»)
Функция InputBox используется, когда исходные данные меняются при каждом запуске программы, поэтому обычно значение переменной не задается и применяется простейший вариант записи этой функции:
Имя_переменной = InputBox(“Сообщение”)
Пример: d = InputBox(“Введите значение диаметра”)
Если в поле ввода в появившемся диалоговом окне ввести 23, то в переменную d будет записан текст “23”, а не число 23. Текстовая строка “23” представляет собой лишь визуальное отображение числа, но не является числом в буквальном смысле слова, т. е. с ним, как и с любым другим текстом, нельзя производить никаких арифметических действий.
Для преобразования строкового типа данных в числовой тип используется функция Val(Строка), которая возвращает число, содержащееся в Строке, как числовое значение соответствующего типа.
При записи в коде программы
d = Val(InputBox(“Введите значение диаметра”))
и вводе в поле ввода цифр 23 переменной d присвоится число 23.
ОПЕРАТОРЫ ВЫВОДА ДАННЫХ
Рассмотрим три основных способа вывода данных.
1. Вывод в диалоговое окно с помощью команды MsgBox:
MsgBox «Сообщение», , «Заголовок»
В результате выполнения этой команды на экране появляется диалоговое окно Заголовок, содержащее указанный текст Сообщения. Выполнение программы приостанавливается до нажатия пользователем кнопки ОК.
Пример: MsgBox y , , «Результат»
В данном случае в качестве выводимого в окно Результат сообщения задано текущее значение переменной y:
Простейший формат записи оператора MsgBox:
MsgBox «Сообщение»
Обычно сообщение включает в себя не только выводимое значение, но и комментарий, который заключается в кавычки. Для слияния нескольких фрагментов в одну строку в операторе вывода их разделяют знаком &.
Пример: MsgBox “Значение диаметра =” & d
В результате на экране появится следующее диалоговое окно:
2. Вывод данных на лист рабочей книги Excel с использованием инструкции Сells(i, j). В этом случае в отличие от ранее рассмотренного она выступает как команда вывода:
Cells(i, j) = «Сообщение».
В результате этой команды указанное Сообщение помещается в ячейку с адресом, определяемым номером строки i и номером столбца j.
Cells(1, 1) = “x=” ‘Вывод в ячейку A1 текста x=
Cells(1, 2) = x ‘Вывод в ячейку B1 текущего значения переменной x
3. Вывод данных в окно отладки Immediate («Немедленно»). Это окно обычно располагается под окном программного кода. Если этого окна нет, то его можно вывести, нажав Ctrl+G или из главного меню VBA View → Immediate Window.
Для вывода в окно отладки применяется метод Print (печать) объекта Debug (отладчик). Формат записи:
Debug.Print [«Сообщение»]
Пример: Debug.Print “Значение диаметра =” & d
Как видно из этого примера, команда Debug.Print используется аналогично команде MsgBox.
Пустой (т. е. без Сообщения) метод Debug.Print выводит пустую строку.
Помимо знака & в методе Print возможно использование разделителей списка выводимых данных. При этом знак «;» означает вывод очередного значения непосредственно за предыдущим, знак «,» – переход к началу новой зоны печати (окно отладки делится на 5 вертикальных зон по 14 символов каждая). При вводе знак «;» между элементами выводного списка можно опускать, VBA добавит его автоматически.
Запятая или точка с запятой в конце выводного списка в команде Debug.Print подавляет переход на новую строку (следующий Debug.Print начнет печать в той же строке).
Пример: Debug.Print «Результат y justify»> В любом операторе вывода (MsgBox, Cells, Debug.Print) возможен вывод не только готовых результатов, но и одновременный расчет и вывод:
Debug.Print «s = «; s, » k1+k2 justify»> MsgBox «Если диаметр = » & d & «, то радиус justify»> Для вывода числового значения в заданном формате в операторах вывода MsgBox, Debug.Print вместо имени переменной следует использовать функцию Format с указанием количества десятичных знаков.
Debug.Print z ‘вывод переменной z обычным образом
Debug.Print Format(z, «#0.00«) ‘вывод переменной z с 2-мя десятичными знаками
MsgBox Format(z, «#0.000«) ‘вывод переменной z с 3-мя десятичными знаками
В операторе вывода Cells функцию Format использовать не рекомендуется.
ЛИНЕЙНЫЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ
Простейшими являются программы, реализующие алгоритмы линейного вычислительного процесса. Программа в этом случае содержит операторы ввода данных, присваивания и вывода данных. Операторы записываются последовательно друг за другом в естественном порядке их следования и выполняются только один раз.
Общая структура линейной программы:
Option Explicit ‘Запрет использования необъявленных переменных
Sub Имя_процедуры()
‘Объявление констант (Const …)
‘Объявление переменных (Dim …)
‘Тело процедуры:
‘Ввод исходных данных
‘Вывод результатов
End Sub
Пример_Л1. Составить ГСА и текст программы для вычисления функции:
где x = a∙t 2 + 0.2 , a = 18, t – произвольное.
ГСА Текст программы:
Option Explicit ‘Запрет использования необъявленных переменных
Sub Лин_процесс1() ‘Начало процедуры Лин_процесс1
Const a = 18 ‘Объявление константы a
Dim t As Single ‘Объявление вещественной переменной t
Dim x As Single ‘Объявление вещественной переменной x
Dim y As Single ‘Объявление вещественной переменной y
t = Val(InputBox(«Введите t»)) ‘Ввод значения t
x = a * t ^2 + 0.2 ‘Расчет x
y = (x ^ 2 + Log(x) — (x + 1) ^ 2) / (x * Sin(x)) ‘Расчет y
MsgBox «Результат y justify»> Ниже приведено решение того же примера с использованием других способов ввода и вывода данных.