Remkomplekty.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Excel vba goto

Оператор GoTo в VBA, ситуации применения GoTo

Оператор GoTo — это оператор безусловного перехода, когда ход выполнения программы без проверки каких-либо условий перепрыгивает на метку в коде. Пример применения GoTo может выглядеть так:

MsgBox «Едем на метро»

EngineNotStarted: — это метка, для нее используется имя (выбираемое по правилам назначения имен для переменных), которое оканчивается на двоеточие.

Иногда использование GoTo очень удобно — например, когда нам нужно добиваться от пользователя ввода правильного значения неизвестное число раз. Однако использование GoTo категорически не рекомендуется, потому что код становится трудночитаемым. Чаще всего GoTo можно заменить на конструкцию Do While или на вызов функции из самой себя.

Работа с циклами

Циклы VBA, конструкция For. Next, конструкция For Each. Next, выход из цикла по Exit For, конструкции Do While и Do Until, выход из цикла по Exit Do, конструкция While. Wend

Циклы используются в ситуациях, когда нам нужно выполнить какое-либо действие несколько раз. Первая ситуация — мы знаем, сколько раз нужно выполнить какое-либо действие, в этом случае используется конструкция For…Next:

For iCounter = 1 to 10

Чтобы указать, насколько должно прирастать значение счетчика, используется ключевое слово Step:

For iCounter = 1 to 10 Step 2

Можно и уменьшать исходное значение счетчика:

For iCounter = 10 to 1 Step -2

Для безусловного выхода из конструкции For…Next используется команда Exit For.

VStop = InputBox (“Введите значение останова”)

For iCounter = 1 to 10

MsgBox «Счетчик: » & iCounter

If iCounter =VInput Then Exit For

Очень часто в VBA требуется сделать какое-нибудь действие со всеми элементам коллекции или массива — перебрать все открытые документы, все листы Excel, все ячейки в определенном диапазоне и т.п. Для того, чтобы пройти циклом по всем элементам коллекции, используется команда For Each … Next:

For Each oWbk in Workbooks

При использовании этого приема можно очень просто найти и получить ссылку на нужный нам объект:

For Each oWbk in Workbooks

Set oMyWorkBook = oWbk

В этом случае мы проходим циклом по всем элементам коллекции Workbooks (то есть открытым рабочим книгам в Excel), для каждой книги проверяем ее имя, и если мы нашли книгу с именем Сводка.xls, то мы получаем на нее ссылку и выходим из цикла. Коллекция рабочих книг — это специальная коллекция, которая умеет производить поиск в себе по имени элементов, поэтому в принципе можно было обойтись такой строкой:

Но для многих других коллекций без конструкции For Each не обойтись.

Еще одна ситуация — когда мы не знаем точно, сколько раз должна быть выполнена та или другая команда — это зависит от какого-либо условия. Используются конструкции Do While…Loop и Do Until…Loop.

Конструкция Do While означает: выполнять какое-либо действие до тех пор, пока условие истинно:

Do While MyVar +
. Откроется окно, аналогичное представленному на рис. 3.1, в котором вы сможете продолжить выполнение, завершить его или открыть ваш код в отладчике.

Рис. 3.1 Выполнение макроса остановлено по +

Второй вариант — Do Until. Все выглядит точно так же, за одним исключением: цикл будет выполняться до тех пор, пока условие ложно.

Do Until MyVar >= 10

MyVar = MyVar + 1

MsgBox “ MyVar = “ & MyVar

Можно переписать цикл так, чтобы условие проверялось после завершения цикла:

MyVar = MyVar + 1

WScript.Echo “MyVar = “ & MyVar

Loop While MyVar

Дата добавления: 2018-10-27 ; просмотров: 1018 ;

VBA GoTo Statement

Excel VBA GoTo Statement

VBA GoTo statement is used when an error occurs while running the code rather than displaying error to resume the next line of code by ignoring the error message. There are two kinds of GOTO statements one is to select any range of the worksheet in the specified workbook and another one is error handler.

In order to overcome the anticipated errors in VBA, we have function called “GOTO”. We will see both kinds of GoTo statements in this article.

2 Ways to use GoTo Statement in VBA Code

#1 – Application.GoTo Method

If you want to go to the specific workbook or specific worksheet in all the opened workbooks then we can use the statement Application.GoTo method.

Let’s look at the syntax of Application.GoTo method

  • [Reference]: This is nothing but a specified cell reference. If the reference is not provided by default it will take you to the last used cell range.
  • [Scroll]: This a logical statement of TRUE or FALSE. If the value is TRUE it will scroll through the window, if the value if FALSE it will not scroll through the window.
Example

If you want to go to a specific cell in the specific worksheet we can use Goto method. I have 3 sheets named Jan, Feb, and Mar.

Now if I want to go to cell C5 in Jan sheet I will use below set of code.

Step 1: Start the macro name.

Code:

Step 2: Start the method “Application.GoTo

Code:

Step 3: In the reference argument we need to specify the worksheet name and in that worksheet, we need to mention the specific cell.

Code:

Step 4: Mention the scroll as TRUE.

Code:

Step 5: Now run this code using the F5 key or you can also run this code manually, it will take you to the specified sheet and specified cell.

Now I will change the scroll argument to FALSE and see the change it will encounter.

If you want to go to specific workbook then you need to mention the workbook name as well before the workbook name.

#2 – Error Handler Method

When the particular line of code encounters an error then VBA stops executing the rest of the code and shows the error message.

For an example look at the below line of code.

Above code says to delete the sheet April and add a new sheet. In the active workbook if there is any sheet name called April it will delete or else it will show the below error message dialogue box.

When I run this code my workbook didn’t have a sheet called April, so VBA code couldn’t find the sheet name and throws the error. Sometimes we need to ignore this error because often times if there is no sheet name called April then we need to go on with the other lines of code.

To eliminate this error we can use GoTo method as an error handler.

Now I will modify the code as On error go to next line

Now if you run this it will add the new sheet even though there is no sheet name called April.

The statement “On Error GoTo NextLine” understands that if any error occurs it will jump to the next line and in the next line VBA code is to add a new sheet.

Операторы ветвления VBA: сложный выбор. Безусловный переход

В реальных программах зачастую бывает необходимо выполнять более сложный выбор в процедурах, выбирая между тремя и более ветвями. В этом случае можно помещать операторы If..Then..Else друг в друга. Это называется вложением операторов.

Вышепоказанная процедура использует несколько вложенных друг в друга операторов условного перехода. Следует сказать, что такая процедура будет работать только в Excel, т.к. использует метод Application.InputBox (см. Функции host-приложений). Этот метод не дает пользователю во время работы функции ввести что-либо, кроме числа.

Если пользователь вводит не число, то получает об этом сообщение.

Если пользователь ничего не вводит, то получает сведение об ошибке.

Если пользователь воспользуется кнопкой «Отмена», то получает сообщение «Не введены данные».

VBA предоставляет сокращенную версию оператора If..Then..Else, являющуюся сжатым эквивалентом вложенных операторв If..Then..Else, использованных в листинге. Такой краткой формой является операторIf..Then..ElseIf

Какой из вариантов использовать — вопрос, который решает каждый программист для себя индивидуально. Считается, что второй вариант более компактный, тогда как первый — более удобный и понятный.

Для выполнения выбора из нескольких возможных ветвей кода можно вкладывать операторы If..Then..Else на много уровней вглубь, но уследить за ходом выполнения ветвей становится все труднее и труднее.

VBA имеет условный оператор перехода для использования в случаях, когда необходимо выбирать из большого количества различных ветвей кода — Select Case. Он работает практически так же, как и Else..If, но более понятен.

Ключевые слова Select Case используются со многими операторами Case, где каждый оператор Case проверяет появление другого условия и выполняется только одна из ветвей Case. Ветвь Case может содержать один, несколько или ни одного оператора VBA.

Оператор безусловного перехода

Оператор безусловного перехода, можно сказать, является рудиментом от ранних языков программирования, в которых он являлся практически единственным средством организации циклических выполнений блоков кода.

Оператор безусловного перехода всегда изменяет порядок выполнения операторов в процедуре или функции. При этом не проверяется никаких условий.

line — любая допустимая метка или номер строки в той же процедуре или функции, которая содержит оператор GoTo.

При выполнении оператора GoTo управление выполнения программы немедленно передается оператору в строке, определенной с помощью метки line.

В среде программистов считается, что любую логику программы можно организовать без применения оператора безусловного перехода. Поэтому, применение GoTo может быть оправдано только в исключительных случаях.

В начало страницы

В начало страницы

Excel VBA GoTo Statement

GoTo Statement

he GoTo statement branches unconditionally to a specified line in a procedure. It is used to transfer the program control to a new statement, which is headed by a label. It sends your program wherever you want. The statement is useful in controlling program flow, and it’s easy to create.

GoTo statement cannot be used to branch from outside a For…Next, For Each…Next, With…End With, SyncLock…End SyncLock, Try…Catch…Finally, or Using…End Using construction to a label inside.

GoTo statements are used when you wish to force the user to select any specific option. It functions as a loop and repeats the same stamen again and again unless the user uses another option.

Syntax

Parameter

Line (required) – This parameter represents any line label.

Example 1

Output

Press F5 to run the output. As soon as, VBA code run, a msgbox will pop up, asking a question, “Do you like VBA?” with buttons, Yes or No option (as shown below).

We will choose the “No” option. Another msgbox pops up.

As soon as you will click on OK. The program jumps again to the first Msgbox, stating, “Do you like VBA?”. This will continue if you will click on No option. If you select the Yes option, another Msgbox will pop up (as shown below).

As soon as you click OK, the program terminates.

While entering any password, if you type the wrong password, you notice the Input box appears over again till the time you enter the correct one. This can be done with VBA GOTO as well.

Example 2

Output

As you will run the code. An InputBox will pop out, asking for your name. Type your name and click OK.

Once you submit the name, another box appears asking for your password.

If your password matches with “Bill Gates” a MsgBox will appear stating your eligibility. Else for the wrong password, it will intimidate you and again ask for the right password.

by

Excel vba goto

Поискав по рунету материал на тему обработки ошибок в VBA, не увидал на первых двух страницах результатов поиска чего-то, что мне понравилось. Может плохо смотрел, но решил написать на эту тему свою статью.

Простите, но — немного словоблудия 🙂

Ошибки в программе

Ошибки времени исполнения программы возникают, когда среда программирования не может выполнить то, что вы хотите. Таких ситуаций может быть много. Например:

Вы обращаетесь к объекту по имени, а объекта с таким именем в коллекции нет

Вы хотите выделить ячеку на одном листе, а этот лист в данный момент не является активным (типичнейшая ошибка новичков в Excel VBA)

Вы хотите удалить отфильтрованные автофильтром строки, а фильтр вообще не вернул записей и удалять нечего

Вы ссылаетесь на элемент массива, который находится за пределами его границ.

Вы пытаетесь присвоить переменной значение, которое оно не может хранить. Например, переменной типа Long нельзя присвоить строковую константу или переменной типа Integer присвоить знанчение превышающее число 32767 .

На любую из этих и сотни других ситуаций среда выполнения реагирует стандартно — прерывает ход выполнения программы на том операторе, где возникла ошибка или, как ещё принято говорить, исключение. На экран выводится информация о возникшей ошибке и предлагаются стандартные варианты для продолжения работы:

Continue (продолжить) — этот пункт во время возникновения ошибки всегда не активен. Он активен, когда по ходу выполнения программы вы использовали оператор Stop . Кстати это очень полезный оператор для отладки программы.

End (завершить) — завершение исполнения программы

Debug (отладка) — переход в режим отладки, в котором можно посмотреть, на каком операторе возникла ошибка, что содержат переменные, можно даже перетащить жёлтую полоску, подсвечивающую текущий оператор, назад, и модифицировать знанчение переменных через окно Immediate window (впрочем это экзотика). В общем случае кнопка Debug позволяет посмотреть, где случилась ошибка и попытаться понять почему так случилось.

Если вы — автор программы, в которой случилась ошибка, то вы, должно быть, в начале будете рады увидеть подобное окно, ибо только так вы сможете отловить основные ошибки, скрытые в вашем коде. Однако, если эту ошибку видит пользователь, то для него это, мягко говоря, безрадостное и малопонятное зрелище. Ещё хуже, если за эту программу вам заплатили деньги. Поэтому в среде худо-бедно профессиональных программистов принято предусматривать обработку ошибок в своих программах.

Почему вообще в коде возникают ошибки?

Много ошибок во время написания кода возникает по невнимательности или не совсем адекватного понимания того, что делаешь. Таких ошибок, как правило, очень много, особенно у начинающих программистов, но эти ошибки довольно легко отловить и исправить, так как, пока вы их не исправите, ничего не работает. Ну, например, вы должны извлечь данные из 5-го столбца, а вы извлекаете из 6-го, а их там банально нет. Ясно, что вы это очень быстро заметите.

Вторая группа ошибок — это ошибки оптимиста. Когда программа написана в целом правильно, но алгоритм не готов к ударам судьбы в виде неожиданных действий со стороны пользователя, ошибок ввода-вывода (вы рассчитывали считать данные из файла, а файла с таким именем не оказалось, либо он заблокирован другим приложением), особенностей конфигурации компьютера (разные версии ОС или офиса, которые в некоторых мелочах отличаются).

Тонкие логические ошибки. Чем сложнее программа, тем больше шансов, что модель задачи в вашей голове, ваша программа и реальность не совсем согласованы между собой. Пока вы не достигните достаточного погружения в задачу вы такие ошибки не найдёте и не исправите. Порой на это уходит много времени. Но это характерно для сложных задач.

Ошибки на стыке вашего приложения и сервисов ОС, приводящие к неожиданным крахам приложения. Такого вообще возникать не должно, но как мы понимаем, и ОС и офис содержат ошибки, да и вы (что более вероятно) можете пользоваться системными вызовами не правильно. Подобные ошибки — сущий кошмар, особенно когда они проявляются лишь на некоторых конфигурациях, при определенных условиях, их трудно поймать и надёжно воспроизвести.

Задачи механизмов обработки ошибок

Обеспечить стабильную работу программы . Возникновение ошибки, появление которой вы не предусмотрели, приведёт в большинстве случаев к аварийному завершению всей программы или её части. При определенном уровне подобных ситуаций это ведёт к тому, что программой пользоваться становится невозможно.

Информирование . Мало обработать ошибку и предотвратить завершение программы. Надо ещё и адекватно проинформировать пользователя о причинах нестандартного поведения программы. Частно причиной ошибок в программе являются некорректные действия пользователя, поэтому важно сообщать ему о них.

Защита данных от повреждения . Программа обязана защищать от непреднамеренных повреждений результаты своей или пользовательской работы. Деструктивные действия должны быть снабжены соответствующими предупредительными диалоговыми окнами. Часто ошибка, не обработанная должным образом может повредить нужные данные.

Файл примера

Скачать

Код без обработки ошибок

Вот простой пример с потолка. Если вызвать Example_00 , то она прекрасно отработает без ошибок и вернёт это:

В функцию GetCalories передаётся строка с блюдом, а она должна вернуть его калорийность, сверившись с таблицей в A1:B7 .

Давайте поищем слабые места в этом коде. Первое, что должно прийти в голову — если мы ищем, то, что произойдёт, если мы не найдём? А произойдёт, конечно же, ошибка. Её инициирует метод Match .

Ещё одно слабое место этой подпрограммы: функция возвращает вещественный тип Double , и даже, если поиск оказался удачным, то в Cells(intRow, 2) может случайно находиться текстовая строка, а потому, когда вы числовому типу попытаетесь присвоить строковый тип, также произойдёт ошибка. И, если вы второй ошибки сможете избежать за счёт дополнительного оператора if с проверкой через IsNumber (), то избежать первой ошибки таким способом нельзя. Что же делать? А вот тут на сцену выходят операторы обработки ошибок.

Есть 2 подхода к обработке ошибок: автономный подход и выносной . Эти термины я придумал только что, чтобы проще было их обсуждать.

Автономный подход

Смысл автономного подхода в том, чтобы не выносить сор из избы. Если в подпрограмме возникла ошибка, то мы должны предположить, на каком месте она возникнет и поджидать её там с дубиной. С ошибкой, в этом случае, разбираются обычно в операторе, идущем сразу после потенциально опасного места. Давайте смотреть, как это может выглядеть:

Итак, что тут сделано:

Сразу после объявления функции GetCalories_v1 идёт оператор on error resume next , который в случае возникновения в каком-либо месте ошибки, предписывает VBA просто передавать управление на следующий оператор, идущий после ошибочного.

Мы объявили переменные. Необъявленные переменные получают тип Variant и значение по умолчанию Empty . Объявленные переменные числовых типов инициируются нулём, строковые — пустой строкой, то есть я наперёд знаю, что они содержат, а это хорошо для обработки ошибок.

На вызове метода WorksheetFunction.Match у нас возникает ошибка, так как искомого значения в таблице нет. А это, между прочим, был оператор присваивания ( = ). Прежде, чем левой части оператора присваивания ( intRow ) что-то будет присвоено, необходимо вычислить правую часть оператора присваивания ( WorksheetFunction.Match . ), а поскольку в процессе этого вычисления возникает ошибка, то переменная intRow остаётся такой, какой была! А, как я уже сказал, VBA автоматически её инициализирует нулём до начала исполнения подпрограммы. Получается, что, если в этом операторе возникнет ошибка, то в intRow будет ноль. Если ошибки во время поиска не возникнет, то ноля там не будет ни при каких раскладах, так как строки на листе нумеруются с единицы.

И вот этот ноль мы и контролируем, добавляя оператор If . Если intRow больше нуля, то WorksheetFunction.Match отработала штатно, а если нет — то работу подпрограммы надо прерывать, но об этом чуть позже.

Далее мы помним, что Cells(intRow, 2) может теоретически вернуть строковое значение, которое вызовет ошибку Type missmatch при присвоении переменной типа Double ( GetCalories_v1 ), поэтому мы вставляем дополнительную проверку промежуточной переменной varTemp тому, что она числовая. И если это так, то присваиваем GetCalories_v1 значение из varTemp .

В случае возникновения любой ошибки внутри GetCalories_v1 она просто вернёт ноль. Почему ноль? Потому что переменная GetCalories_v1 тоже инициализируется нулём и об этом не надо заботиться, а в случае ошибки она останется в неприкосновенности.

Соответственно родительский код (в нашем случае его роль играет процедура Example_01 ) должен проверить, а не вернёт ли GetCalories_v1 ноль, и быть готовым к этой ситуации.

А вот теперь тонкий момент, который не все понимают. Почему я использовал промежуточные переменные intRow и varTemp ? Вроде бы есть очевидный ответ — чтобы не вычислять значение выражений с Match и Cells 2 раза. Отчасти это, конечно, так. Но это, в данном случае, не главная причина. Главная причина в том, что такой код

вызовет неправильное поведение программы. Если у нас Match вызовет исключение, то VBA передаст управление на СЛЕДУЮЩИЙ оператор, а следующий оператор в данном случае это то, что идёт после Then — присваивание переменной varTemp значения. Таким образом наша проверка на наличие ошибки сработает с точностью до наоборот, передав управление в ту часть кода, которая должна быть защищена от ситуации, когда Match не нашла строку в таблице. Вот почему важно в операторе If не иметь ничего такого, что могло бы вызвать ошибку.

Как видите, в этом подходе мне зачастую даже нет необходимости проверять объект Err , чтобы понять, что произошла ошибка, так как я ориентируюсь на то, что промежуточные переменные остаются неинициализированными, что является показателем наличия ошибки.

Выносной подход

Данный метод основан на том, что, когда возникает ошибка, то VBA передаёт управление на специальный участок кода — обработчик ошибок, который обычно размещают в конце подпрограммы. Это может выглядеть так:

Обратите внимание, что:

Оператор on error теперь в случае ошибки предписывает передавать управление на метку ErrorHandler , которая объявлена в конце кода процедуры GetCalories_v2

В коде мы никак не заботимся о каких-либо проверках. Возникла ошибка? Иди на метку — там разберутся.

Если ошибки не случилось, то, чтобы программа не стала исполнять строчки, предназначенные для обработки ошибок, перед меткой ErrorHandler обычно ставят оператор Exit Sub или Exit Function (в зависимости от типа подпрограммы).

Принципиальный момент — наличие оператора On Error Resume Next сразу после метки ErrorHandler . Дело в том, что после того, как вы перешли на метку ErrorHandler , очень опасно иметь действующим оператор On Error GoTo ErrorHandler , так как, если у вас в обработчике ошибки случится любая ошибка, то управление будет передано опять на метку и, как нетрудно понять, образуется бесконечный цикл. Поэтому сразу после метки мы возможность возникновения цикла ликвидируем оператором On Error Resume Next .

Что лучше?

Какой метод лучше применять зависит от ваших предпочтений и конкретных ситуаций. Грамотную обработку ошибок можно сделать и так и эдак. Вот несколько соображений по преимуществам и недостакам данных подходов:

Читать еще:  Ms excel функции впр сводные таблицы
Ссылка на основную публикацию
Adblock
detector