Как остановить выполнение макроса в excel. Прерывание процедур и функций VBA

Как приостановить выполнение кода VBA?

скажем, у меня есть клавиша, интегрированная в мою электронную таблицу, которая запускает некую функцию VBA.

Я желал бы иметь возможность иметь какую-то клавишу “Отмена”, которая тормознула бы выполнение в случайный момент, и я не участвую тут, поэтому что я желал бы сделать это молча.

Я думаю, это обязано быть достаточно всераспространенной неувязкой, любые идеи?

спасибо.

6 ответов


добавьте еще одну клавишу с именованием “CancelButton”, которая устанавливает флаг, а потом проверьте этот флаг.

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



Как насчет приложения.EnableCancelKey-используйте клавишу Esc

фрагмент из http://msdn.microsoft.com/en-us/library/aa214566 (офис.11).aspx


или, ежели вы желаете избежать внедрение глобальная переменная вы сможете применять изредка используемые свойство userform:


что произнес jamietre, но


Я делаю это много. Много. 🙂

Я привык использовать” DoEvents ” почаще, но по-прежнему склонен устанавливать вещи, работающие без вправду двойной проверки уверенного способа остановки.

затем, сейчас, сделав это опять, я подумал:” ну, просто дождитесь конца через 3 часа”, и начал грести по ленте. Ранее я увидел, что в разделе” вид “ленты” макросы ” тянутся вниз, и пошевелил мозгами, что у меня есть взор, чтоб узреть, могу ли я узреть собственный нескончаемый макрос бегущий….

теперь я понимаю, что вы также сможете получить это с помощью Alt-F8.

тогда я подумал: А что, ежели я “шагну” в иной макрос, это выручит меня? Он сделал 🙂 Он также работает, ежели вы заходите в собственный запущенный макрос (но вы все равно теряете, где вы до), Ежели вы не чрезвычайно ленивый программер, как я, и объявляете много “глобальных” переменных, в этом случае глобальные данные сохраняются : -)

K


~ для тех, кто употребляет настраиваемое поле ввода


Рубрики

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

Как записать самый обычный макрос?

Для начала запишем самый легкий макрос — зададим в ячейке А1 формат вида 12 345:

  •  Открываем новейшую книжку, в ячейке А1 набираем шестизначное число 123456. На данный момент оно выдается без разделителей разрядов. Запишем макрос, который ставит эти разделители.
  •  Заходим на панели инструментов в закладку Вид*, находим клавишу Макросы, нажимаем Запись макроса. В появившемся окне задаем имя макроса и книгу, в которой желаем этот макрос сохранить.

 

Важно

Запустить макросы можно лишь из открытых книжек, потому ежели вы планируете применять записанные вами макросы достаточно нередко, стоит применять специальную книжку макросов, которая автоматом раскрывается совместно с пуском сеанса Excel.

Если вы все-же желаете хранить макросы в отдельном файле, эту книжку необходимо сохранить, выбрав тип файла Книжка Excel с поддержкой макросов. В неприятном случае опосля закрытия книжки макросы будут стерты.

 

  •  Выбираем Сохранить в… –  Личная книжка макросов и жмем Ок (рис. 1).

 

 

Рис. 1. Запись макроса в личную книжку макросов

 

  •  Записываем в макрос деяния, которые желаем выполнить: вызываем контекстное меню Формат ячеек (можно пользоваться композицией кнопок Сtrl+1) и задаем подходящий нам формат числа: на закладке Число идем в блок (все форматы) и избираем там формат вида # ##0.

 

К сведению

Этот формат можно задать и в блоке Числовой, но чуток позднее для вас станет ясно, почему мы пользовались блоком Все форматы.

 

  •  На закладке Вид – Макросы избираем пункт Остановить запись.

Второй, наиболее стремительный метод приостановить запись макроса — надавить на показавшийся в левом нижнем углу голубий квадратик (рис. 2.).

 

Мы рекомендуем

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

 

Проверяем, что макрос записан и работоспособен:

  •  в ячейку А2 вбиваем хоть какое шестизначное число;
  •  запускаем макрос одним из 2-ух способов: на закладке Вид – Макросы избираем пункт Макросы либо жмем комбинацию кнопок Alt+F8, находим в перечне наш макрос и жмем клавишу Выполнить.

 

 

Рис. 2. Форматирование числа и остановка записи макроса

Читайте также  Как телевизор шарп подключить к интернету. Как настроить Wi-Fi на телевизоре – инструкция от профессионала

 

Итак, вы записали собственный 1-ый макрос! Примите поздравления. Сейчас давайте познакомимся с личной книжкой макросов и синтаксисом написания команд для макроса.

Личная книжка макросов

По умолчанию Excel не показывает личную книжку макросов. Чтоб убедиться, что она открыта, избираем на вкладке Вид клавишу Отобразить — в появившемся окне обязана быть книжка под именованием PERSONAL.

Мы удостоверились, что книжка открыта, но показывать ее не будем, чтоб позже по ошибке не закрыть ее. По сущности, в данной нам книжке нас интересует так именуемый Исходный текст — блок, в котором записываются макросы. Чтоб узреть это окно, нажмите клавиши Alt+F11 либо кликните правой клавишей мыши на ярлычке хоть какого листа Excel и выберите в контекстном меню Исходный текст. Раскроется окно VBA-кодирования в Excel (рис. 3). Оно состоит из 2-ух блоков:

1. В левой части экрана окно Project – VBAProject — это проводник, в котором показываются все открытые в данный момент книжки Excel (даже ежели вы их не видите, как, к примеру, книжку Personal). Работа с сиим блоком подобна работе в обыкновенном проводнике — двойной клик по наименованию книжки открывает ее содержимое. Нас интересует блок Modules – Module1. Кликаем левой клавишей мыши два раза по этому объекту.

2. В правой части экрана раскроется блок записи и редактирования макросов. Тут уже автоматом записался Макрос1. Разглядим на его примере основную канву макроса.

 

 

Рис. 3. Окно VBA-кодирования в Excel

Синтаксис макроса

Макросы — это команды, написанные на языке VBA (Visual Basic for Applications). И синтаксис кода макроса не различается от записи кода в Visual Basic.

Любой макрос имеет последующий вид:

 

Sub Имя_Макроса_Без_Пробелов()

' комменты к макросу — они необходимы для вас, VBA не принимает такие строчки как команды

команды, написанные на языке VBA

 

End Sub

 

3 неотклонимых блока макроса:

1. Начало макроса. Постоянно начинается с команды Sub. Дальше идет имя макроса — оно может быть на российском языке, но не обязано содержать пробелы и особые символы.

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

2. Блок команд. В нашем примере он состоит из одной строки: Selection.NumberFormat = "#,##0"

Каждая команда обязана начинаться с новейшей строчки. Ежели текст команды чрезвычайно длиннющий и не помещается на экране, его можно разбить на несколько строк, заканчивая строчку эмблемой нижнего подчеркивания _ (далее в примере мы это увидим).

3. Конец макроса. Постоянно обозначается как End Sub.

 

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

 

Обратите внимание!

Если вы желаете расположить комменты в несколько строк, каждую новейшую строчку нужно начинать с апострофа.

 

Теперь запишем наиболее непростой макрос и научимся осознавать текст его кода.

Например, информационная система выдает отчет «Бюджет на месяц» без выделения групповых значений цветом либо шрифтом.

Нам необходимо:

  •  выделить групповые строчки полужирным шрифтом;
  •  отформатировать на печать — расположить отчет по центру листа, задать масштаб 75 %, вывести в колонтитулы заглавие отчета (рис. 4).

 

Рис. 4. Конфигурации опосля написания макроса

 

Запишем метод форматирования отчета в макрос.

Нажимаем клавишу записи макроса и исполняем последующие действия:

  •  Даем макросу имя Форматирование_БДР, в блоке описания записываем, что будет делать этот макрос (например, Выделяет жирным курсивом итоги, форматирует на печать). Нажимаем Ок.
  •  Выделяем столбцы А:С, ставим автофильтр — на закладке Данные находим клавишу Фильтр.
  •  По столбцу КОД задаем условие не содержит точку: Текстовые фильтры – Не содержит и в поле текста ставим знак точки без пробелов (рис. 5).

 

 

Рис. 5. Внедрение автофильтра по столбцу «КОД»

 

  •  Выделяем отфильтрованный спектр и задаем ему полужирный шрифт.
  •  Снимаем автофильтр (повторное нажатие на закладке Данные кнопки Фильтр).
  •  Заходим в меню форматирования на печать (Кнопка Файл/Office – Печать – Подготовительный просмотр – Характеристики страницы) и задаем там три параметра:

1) на вкладке Страница задаем масштаб 75 %;

2) на вкладке Поля отмечаем пункт Горизонтально в блоке Центрировать на странице;

3) на вкладке Колонтитулы создаем верхний колонтитул с текстом Бюджет на январь.

  •  Выходим из характеристик страницы.
  •  Заканчиваем запись макроса.
  •  Нажимаем Alt+F11 и смотрим, что вышло (см. рис. 4).

Код этого макроса уже еще длиннее и непонятнее, но просто читаем для знающих британский язык и азы программирования в VBA.

Читайте также  Пропало изменение языка windows 10. Пропала языковая панель Windows 10 - Как восстановить?

Правила написания команд в VBA

Любая команда макроса состоит из 2-ух блоков, разбитых точкой:

 

Объект.Действие с объектом либо свойство объекта

 

Объектами в Excel являются, например:

  •  книга: WorkBook, ActiveWorkbook;
  •  лист, листы: WorkSheet, ActiveSheet, Sheets;
  •  ячейка: Cells(1,1) — в скобках указываются номера строчки (Row) и столбца (Column) ячейки на листе;
  •  диапазон ячеек (может быть и одна ячейка): Range(«А1:С5»), Range(«А1»);
  •  строки (Rows);
  •  столбцы (Columns);
  •  выделение (Selection) — выделенный в данный момент спектр (это может быть как несколько смежных ячеек, так и смежные строчки либо столбцы).

Примеры действий с объектами:

  •  ActiveWorkbook.Save — сохранить рабочую книжку (та, которая была активна в момент вызова юзером макроса);
  •  Sheets("Лист3").Name = "Отчет" — переименовать «Лист3» в «Отчет»;
  •  Sheets("Отчет").Activate — перейти на лист с заглавием «Отчет»;
  •  Range("А1").Copy — скопировать в буфер обмена данные из ячейки А1;
  •  Rows("13:13").Delete Shift:=xlUp — удалить строчку 13 со сдвигом вверх.

Примеры параметров объектов:

  •  ActiveCell.FormulaR1C1 = "БДР" — в выделенной (активной) ячейке записан текст «БДР»;
  •  ActiveCell.Row < 65 — номер ряда активной ячейки меньше 65.

Помнить все наименования объектов, команд и параметров для написания легких макросов не непременно. Вы постоянно сможете поначалу записать ваши обычные деяния с отчетами в Excel, а позже отформатировать код макроса, убрав из него излишние деяния либо заменив некие данные характеристики (например, длину диапазона) на переменные (которые в предстоящем макрос будет запрашивать у юзера либо рассчитывать самостоятельно).

Но о этом мы поведаем дальше, а на данный момент обратимся к коду нашего первого макроса, состоящего из одной строки:

 

Selection.NumberFormat = "#,##0"

 

Суть его в следующем: к объекту Выделенный диапазон (у нас одна ячейка, но это может быть и весь столбец/строка либо спектр смежных ячеек) применяется свойство Числовой формат вида # ##0 (если помните, конкретно этот формат мы избрали в списке).

Код макроса Форматирование_БДР и расшифровка строк кода представлены в таблице.

 

Строка кода

Расшифровка

Sub Форматирование_БДР()

Начало макроса, имя макроса

'

Пустая строчка комментариев (ставится автоматом при записи макроса)

' Форматирование_БДР Макрос

Автоматически добавленный комментарий при записи макроса — может быть удален без утраты работоспособности макроса

' Выделяем жирным курсивом итоги, форматируем на печать

Автоматически добавленный комментарий при записи макроса из поля Описание

 

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

   Columns("A:C").Select

Выделить (Select) объект Столбцы (Columns) А:С

    Selection.AutoFilter

Применить автофильтр (AutoFilter) для выделенного спектра (Selection)

    ActiveSheet.Range("$A$1:$C$34").AutoFilter Field:=1, Criteria1:="<>*.*", _

Задать аспект отбора «не содержит точку»

        Operator:=xlAnd

Продолжение команды из предшествующей строки.

Обратите внимание: предшествующая строчка закончилась эмблемой нижнего подчеркивания _, означает, текст команды не уместился на одну строчку и окончание команды перенесено на следующую

    Range("A1:C34").Select

Выделить (Select) объект Диапазон (Range) А1:С34.

Обратите внимание: какой бы длины ни был ваш последующий отчет, для которого вы будете использовать этот макрос, выделится постоянно лишь спектр до 34 строки!

Как сделать этот спектр хоть какой длины — обсудим мало позже

    Selection.Font.Bold = True

Для выделенного спектра (Объект Selection) установить свойство «полужирный шрифт» (Font.Bold = True). Ежели необходимо отменить какое-то свойство, пишем False

    Selection.AutoFilter

Снять автофильтр (при записи макроса это было повторное нажатие клавиши Фильтр на закладке Данные)

    With ActiveSheet.PageSetup

Начало процедуры With (используется, ежели дальше перечисляются характеристики либо деяния с одним и тем же объектом для компактности записи кода).

Для объекта ActiveSheet (Текущий лист) применить последующие характеристики характеристики PageSetup (Параметры печати):

        .PrintTitleRows = ""

Печатать на каждой страничке сквозные строчки — пусто (то есть данное свойство не задано пользователем)

        .PrintTitleColumns = ""

Печатать на каждой страничке сквозные столбцы — пусто

    End With

Окончание процедуры With

    ActiveSheet.PageSetup.PrintArea = ""

Заданная область печати — пусто (то есть юзер не ограничил область печати, следовательно, на экран будет выведено все, что есть на листе)

    With ActiveSheet.PageSetup

Начало процедуры With

Для объекта Текущий лист применить последующие характеристики печати (цветом выделены те, которые мы изменили по сопоставлению со стандартными):

        .LeftHeader = ""

Левый верхний колонтитул — пусто

        .CenterHeader = "Бюджет на январь"

Центральный верхний колонтитул — задан текст пользователем

        .RightHeader = ""

Правый верхний колонтитул — пусто

        .LeftFooter = ""

Левый нижний колонтитул — пусто

        .CenterFooter = ""

Центральный нижний колонтитул — пусто

        .RightFooter = ""

Правый нижний колонтитул — пусто

        .LeftMargin = Application.InchesToPoints(0.708661417322835)

Размеры левого поля

        .RightMargin = Application.InchesToPoints(0.708661417322835)

Размеры правого поля

        .TopMargin = Application.InchesToPoints(0.748031496062992)

Размеры верхнего поля

        .BottomMargin = Application.InchesToPoints(0.748031496062992)

Размеры нижнего поля

        .HeaderMargin = Application.InchesToPoints(0.31496062992126)

Размеры верхнего колонтитула

        .FooterMargin = Application.InchesToPoints(0.31496062992126)

Размеры нижнего колонтитула

        .PrintHeadings = False

Не печатать заглавия строк и столбцов (False — юзер не отметил этот пункт)

        .PrintGridlines = False

Не печатать сетку

        .PrintComments = xlPrintNoComments

Не печатать примечания

        .PrintQuality = 600

Качество печати — 600 точек на дюйм

        .CenterHorizontally = True

Центрировать на страничке горизонтально (True — юзер отметил этот пункт)

        .CenterVertically = False

Не центрировать по вертикали

        .Orientation = xlPortrait

Ориентация странички — книжная

        .Draft = False

Пользователь не отметил пункт Черновая в блоке Печать

        .PaperSize = xlPaperA4

Размер бумаги А4

        .FirstPageNumber = xlAutomatic

Номер первой странички — автоматически

        .Order = xlDownThenOver

Последовательность вывода страниц: вниз, позже на право (пункт в блоке Печать)

        .BlackAndWhite = False

Пользователь не отметил пункт Черно-белая в блоке Печать

        .Zoom = 75

Масштаб 75 %

        .PrintErrors = xlPrintErrorsDisplayed

Пункт в блоке ПечатьОшибки ячеекКак на экране

        .OddAndEvenPagesHeaderFooter = False

Пользователь не задавал различные колонтитулы для четных и нечетных страничек (флажок в блоке Колонтитулы)

        .DifferentFirstPageHeaderFooter = False

Пользователь не задавал отдельный колонтитул для первой странички (флажок в блоке Колонтитулы)

        .ScaleWithDocHeaderFooter = True

Флажок в блоке Колонтитулы – Изменять вкупе с масштабом страницы отмечен пользователем

        .AlignMarginsHeaderFooter = True

Флажок в блоке Колонтитулы – Выровнять относительно полей страницы отмечен пользователем

        .EvenPage.LeftHeader.Text = ""

Текст колонтитулов для четных и первой страничек не задан

        .EvenPage.CenterHeader.Text = ""

        .EvenPage.RightHeader.Text = ""

        .EvenPage.LeftFooter.Text = ""

        .EvenPage.CenterFooter.Text = ""

        .EvenPage.RightFooter.Text = ""

        .FirstPage.LeftHeader.Text = ""

        .FirstPage.CenterHeader.Text = ""

        .FirstPage.RightHeader.Text = ""

        .FirstPage.LeftFooter.Text = ""

        .FirstPage.CenterFooter.Text = ""

        .FirstPage.RightFooter.Text = ""

    End With

Окончание процедуры With

End Sub

Окончание кода макроса

Читайте также  Как сделать на айфоне живые обои на. Как установить живые обои на iOS

Редактирование макроса

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

 

Sub Форматирование_БДР()

' Макрос выделяет жирным курсивом итоги, форматирует отчет на печать

'—————–

' Выделяем столбцы и ставим фильтр по столбцу КОД

 Columns("A:C").Select

 Selection.AutoFilter

 ActiveSheet.Range("$A$1:$C$34").AutoFilter Field:=1, Criteria1:="<>*.*", _

 Operator:=xlAnd

' Выделяем отфильтрованный спектр полужирным шрифтом, снимаем фильтр

 Range("A1:C34").Select

 Selection.Font.Bold = True

 Selection.AutoFilter

 ' Форматируем на печать: верхний колонтитул, центрирование по горизонтали, масштаб 75 %

 With ActiveSheet.PageSetup

 .CenterHeader = "Бюджет на январь"

 .CenterHorizontally = True

 .Zoom = 75

 End With

End Sub

Ввод в код макроса функций и процедур

Теперь усложним код макроса, задав ему два параметра:

1. Заглавие месяца отчета запрашиваем у пользователя.

2. Крайняя строчка отчета БДР (в случае ежели она плавающая) рассчитывается в коде макроса.

Функция InputBox

Чтобы запросить у юзера месяц отчета, воспользуемся функцией Inputbox, которая выводит диалоговое окно, в котором юзер может без помощи других задать значение переменной, используемой в коде. Синтаксис функции InputBox:

 

Zapros = InputBox("Текст запроса", <"Текст в шапке окна">, <Значение по умолчанию>,…)

 

где Zapros — введенная вами переменная (имя придумываете вы сами), а в скобках через запятую перечисляются аргументы функции.

Обратите внимание: 1-ый аргумент является неотклонимым, то есть хоть какое диалоговое окно обязано сопровождаться пояснительным текстом, что вы ожидаете от юзера. Последующие аргументы неотклонимыми не являются и их можно не указывать. То есть ежели вы желаете задать значение по умолчанию, но не желаете писать текст в шапке диалогового окна, разделите 1-ый и 3-ий аргументы 2-мя запятыми, как это будет изготовлено в нашем примере (см. далее).

Для удобства присвойте приобретенное значение функции InputBox какой-либо введенной вами переменной, в особенности ежели в коде макроса вы будете несколько раз употреблять значение данной функции.

 

Важно

Имена вводимых переменных не должны совпадать с уже занятыми VBA словами под заглавие объектов, параметров либо функций!

 

В нашем примере присвоим итог вызова функции InputBox переменной Mes.

Например, нельзя завести свою переменную Range, Cells либо Month — компилятор VBA предупредит вас, что делать этого нельзя, и не запустит макрос, пока вы не устраните ошибку (рис. 6).

 

 

Рис. 6. Пример ошибки при заведении переменной

 

Не запамятовывайте хоть какой текст в коде брать в кавычки! В неприятном случае компилятор VBA будет принимать этот текст как команды и выдавать ошибку, так как не сумеет их обработать.

Итак, приступим к редактированию кода макроса.

Оставьте комментарий