Как сделать паузу в vba excel
У меня есть лист Excel со следующим макросом. Я бы хотел зацикливать это каждую секунду, но, черт возьми, я могу найти функцию для этого. Разве это невозможно?
или (для Excel 2010 и новее):
DateAdd ("s", 1, Now) поступает правильно. И может быть обобщен на любое длинное количество секунд: DateAdd ("s", nSec, Now) без использования литерала времени. Чтобы спать менее 1 секунды, используйте Sleep API в kernel32
@ ZX9 timevalue ("00:00:01") = 0.0000115740 . Итак, Application.wait (теперь + 0.00001) составляет около секунды. Мне нравится использовать Application.wait(now + 1e-5) секунду, Application.wait(now + 0.5e-5) полсекунды и т. Д.
Добавьте это в свой модуль
Или для 64-битных систем используйте:
Назовите это в своем макросе так:
Я использовал этот метод, поскольку он переносится между различными офисными продуктами, такими как Access, и не относится к Excel.
+1, потому что Sleep() позволяет указать время ожидания менее 1 секунды. Application.Wait иногда бывает слишком гранулированным.
Вместо того, чтобы использовать:
потому что после этого читать намного легче.
ВНИМАНИЕ! Все решения, использующие Application.Wait, имеют неточность в 1 секунду. Этот метод не учитывает миллисекунды, которые уже прошли с момента начала текущей секунды . Например, если до изменения секунд времени остается всего 1 миллисекунда, вы будете спать только в течение 1 миллисекунды. Вы просто сравниваете 2 округленных числа вместо того, чтобы ждать 1 секунду!
у меня это работает безупречно. вставьте любой код до или после цикла «делать до». В вашем случае поместите 5 строк (time1 = & time2 = & "do until" loop) в конец внутри цикла do
Это решение является точным и не требует объявления функции sleep-API. Раньше я сохранял время в двойных значениях и использовал вместо этого микросекунды с тем же результатом.
Это решение работает лучше, чем аналогичные решения, которые используются ниже, Timer потому что этот Timer подход не работает незадолго до полуночи.
Это решение не является точным, оно не учитывает миллисекунды, которые уже прошли с текущего времени . Например, если до изменения значения Now seconds осталась всего 1 миллисекунда, вы будете спать только 1 миллисекунду.
когда другие решения занимали много времени для макроса VBA, отличного от MS Office, этот работал отлично - спасибо!
Объявление Sleep в kernel32.dll не будет работать в 64-битном Excel. Это было бы немного более общим:
Не удается скомпилировать в Office 2013. Средство проверки ошибок в VBA для Office 2013, похоже, игнорирует операторы компилятора.
Большинство людей согласны с тем, что Win64 / VBA7 dwMilliseconds - это Long, а не LongPtr. Excel VBA скрывает подобные ошибки, выполняя коррекцию стека после внешних вызовов, но подобные ошибки приведут к сбою большинства версий Open Office
Просто очищенная версия кода clemo - работает в Access, в котором нет функции Application.Wait.
Если Timer дает количество секунд, прошедших с полуночи, то этот подход не работает, если он выполняется непосредственно перед полуночью (т. sngEnd Е. Когда> = 86 400). В полночь Timer сбрасывается до 0 и, таким образом, остается меньше, чем sngEnd навсегда.
@vknowles, то, что вы сказали, абсолютно верно. А также может быть скомпенсировано в методе ниже. Поскольку этот метод обрабатывает миллисекунды, я думаю, что это безопасная ставка. `` Public Sub Sleep (sngSecs As Single) Dim sngEnd As Single sngEnd = Timer + (sngSecs / 1000) While Timer
Большинство представленных решений используют Application.Wait, которое не учитывает время (в миллисекундах), уже прошедшее с момента начала текущего подсчета секунд, поэтому они имеют внутреннюю неточность до 1 секунды .
Подход с использованием таймера - лучшее решение , но вы должны учитывать сброс в полночь, поэтому вот очень точный метод сна с использованием таймера:
ИСПОЛЬЗУЙТЕ ЭТО ДЛЯ ПРОВЕРКИ ЛЮБОЙ ФУНКЦИИ СНА: (открыть окно немедленной отладки: CTRL + G)
I have a complex VBA function and a workbook with multiple sheets. Let's say the code goes through every row of Sheet1 and does something with that data.
I would like to be able to pause on SourceRow = 16 , check out results I'm getting on different sheets and then continue on (press ok, or some key stroke)
But the Message box is modal and I can not switch to a different sheet(s) to see the data.
P.S. 16 is just as an example, hardcoded for now but will not be later on.
Are breakpoints sufficient? That would allow the code to stop when a line is reached (Can be inside an If Statement) and then allows you to change sheets etc. and then resume the code
@Evan I agree that breakpoints are a possible option, but when I'm doing what Boris refers to, if it's something where I'm including a break for a specific point in a loop and need to add an "if i = x" statement, then using Stop as Joshua indicates below removes the requirement of adding an extra line of code just to click a breakpoint on it.
2 Answers 2
You can use the Stop statement and then press F5 to resume the code execution. This is akin to adding a breakpoint.
The row will be highlighted yellow while it is paused and you should be able to navigate work sheets.
In similar fashion you can use Debug.Assert (sourcerow <> 16) which will pause the code when sourcerow<>16 evaluates to false, that is to say when sourcerow equals 16. (Thanks to RBarryYoung for the comment)
If you don't want a permanent stop in your code, consider adding a breakpoint by clicking the gray region to the left of the editing window in the VB editor, which should will look like this:
The code will stop when the line is reached. Again press F5 to resume code execution. Alternatively you can continually press F8 in order to step through the code line by line. This eliminates the need to set many breakpoints.
Simply click the maroon circle to dismiss the breakpoint. Breakpoints are not saved in your code, so this is a temporary method (as opposed to the two methods listed above which would stay in your VBA code if you save the workbook).
The images were taken from this tutorial from Wise Owl regarding breakpoints.
I have an Excel worksheet that has the following macro. I'd like to loop it every second but danged if I can find the function to do that. Isn't it possible?
15 Answers 15
or (for Excel 2010 and later):
That format wasn't working in Excel 2010. This works though : Application.Wait (Now + TimeValue("0:00:01"))
DateAdd("s", 1, Now) does the right thing. And can be generalized for any long number of seconds: DateAdd("s", nSec, Now) without using the time literal. To sleep less than 1 second use the Sleep API in kernel32
@ZX9 timevalue("00:00:01") = 0.0000115740. So Application.wait(now + 0.00001) is about a second. I like to use Application.wait(now + 1e-5) for a second, Application.wait(now + 0.5e-5) for half a second etc.
Add this to your module
Or, for 64-bit systems use:
Call it in your macro like so:
I have used this method as it is portable between the various office products such as Access and is not Excel specific.
There is also another VBA application (ERS) that I use that has a very limited subset of the language.
+1, because Sleep() lets you specify wait times of less than 1 second. Application.Wait is sometimes too granular.
instead of using:
because it is a lot easier to read afterwards.
WARNING: All solutions using 'Application.Wait' have 1 second imprecision. This method does not consider the milliseconds that already elapsed since the current second started. For example, if there is only 1 milisecond left until the time seconds change, you will only sleep for 1 milisecond. You are just comparing 2 rounded numbers instead of waiting for 1 second!
this works flawlessly for me. insert any code before or after the "do until" loop. In your case, put the 5 lines (time1= & time2= & "do until" loop) at the end inside your do loop
This solution is precise and does not require the declaration of the sleep-API-Function. I used to store time in double values and use microseconds instead with the same result.
This solution works better than the similar solutions below that use Timer because the Timer approach fails just before midnight.
This solution is not precise, it does not take in account the milliseconds that already elapsed from current time. For example, if there is only 1 milisecond left until the Now seconds changes, you will only sleep for 1 milisecond.
when other solutions were taking a long time for a non-MS Office based VBA macro, this one worked perfectly - thanks!
The declaration for Sleep in kernel32.dll won't work in 64-bit Excel. This would be a little more general:
Fails to compile in Office 2013. The error checker in VBA for Office 2013 seems to ignore the compiler statements.
Most people agree that Win64/VBA7 dwMilliseconds is Long, not LongPtr. Excel VBA hides errors like this by doing stack correction after external calls, but errors like this will crash most versions of Open Office
Just a cleaned up version of clemo's code - works in Access, which doesn't have the Application.Wait function.
If Timer gives the number of seconds since midnight, then this approach fails if it is executed just before midnight (i.e., such that sngEnd is >= 86,400). At midnight, Timer resets to 0 and thus remains less than sngEnd forever.
@vknowles, what you said is absolutely true. And also can be compensated in below method. Since this method handles milliseconds, I think it's a safe bet. ``` Public Sub Sleep(sngSecs As Single) Dim sngEnd As Single sngEnd = Timer + (sngSecs / 1000) While Timer < sngEnd DoEvents If (sngEnd - Timer) > 50000 Then sngEnd = sngEnd - 86400 End If Wend End Sub ```
Most of the presented solutions use Application.Wait, which does not take in account the time (miliseconds) already elapsed since the currend second count started, so they have an intrinsic imprecision of up to 1 second.
The Timer approach is the best solution, but you have to take in account the reset at midnight, so here is a very precise Sleep method using Timer:
USE THIS TO TEST ANY SLEEP FUNCTION: (open debug Immediate window: CTRL+G)
Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
-
Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.
Способ 2. Запись макросов макрорекордером
Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
- в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
- Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
- В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button) :
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Я хотел бы 1-секундную задержку в моем коде. Ниже приведен код, который я пытаюсь сделать эту задержку. Я думаю, что он опрашивает дату и время от операционной системы и ждет, пока время не совпадет. У меня проблема с задержкой. Я думаю, что он не опрашивает время, когда он соответствует времени ожидания, и он просто сидит там и замерзает. Он зависает только около 5% времени, когда я запускаю код. Мне было интересно О применении.Подождите, и если есть способ проверить, больше ли опрошенное время чем время ожидания.
Я использую эту небольшую функцию для VBA.
Если вы находитесь в Excel VBA, вы можете использовать следующее.
(строка времени должна выглядеть как H:MM: SS.)
вы можете скопировать это в модуле:
и всякий раз, когда вы хотите применить паузы записи:
надеюсь, это поможет!
вы пытались использовать сон?
вот пример здесь (скопировал ниже):
обратите внимание, что это может заморозить приложение на выбранное количество времени.
другой вариант ответа Стива Мэллори, мне особенно нужен был excel, чтобы бежать и делать вещи во время ожидания, и 1 секунда была слишком длинной.
на таймер функция также применяется к Access 2007, Access 2010, Access 2013, Access 2016, Access 2007 Developer, Access 2010 Developer, Access 2013 Developer. Вставить этот код, чтобы приостановить время на определенное количество секунд
Access всегда может использовать процедуру Excel, пока проект имеет Microsoft Excel XX.X Объект справочник включены:
ваш код создает только время без даты. Если ваше предположение верно, что при запуске приложения.подождите время на самом деле уже достигнуто, что время будет ждать 24 часа ровно. Я также немного беспокоюсь о вызове now () несколько раз (может быть по-другому?) Я бы изменил код на
я использовал ответ Стива Мэллори, но я боюсь, что таймер никогда или, по крайней мере, иногда не идет на 86400 или 0 (ноль) sharp (MS Access 2013). Поэтому я изменил код. Я изменил условие полуночи на " если таймер >= 86399, то" и добавил разрыв цикла "Exit Do" следующим образом:
на Windows таймер возвращает сотые доли секунды. Большинство людей просто используют секунды, потому что на платформе Macintosh таймер возвращает целые числа.
с должными кредитами и благодаря Стиву Маллрою.
У меня были полночные проблемы в Word, и приведенный ниже код работал для меня
Читайте также: