Pausing or delaying vba using wait, sleep or a loop

Основные понятия

Основным «кирпичиком» ООП является класс. Класс включает набор набор переменных и подпрограмм для управления этими переменными. Переменные называют полями, а подпрограммы — методами. После создания класса его название становится новым типом данных. Класс является фабрикой объектов, т. е. позволяет создать неограниченное количество экземпляров, основанных на этом классе. При этом для каждого объекта создается свой набор локальных переменных.

Проводя аналогию с реальным миром можно сказать, что телевизор является экземпляром класса (объектом), а проект по которому создавался телевизор является классом. По этому проекту можно создать множество телевизоров (множество экземпляров класса). Кнопки и разъемы на корпусе телевизора, да и сам корпус являются отдельными объектами соответствующего класса. Сам процесс нажатия кнопки, приводящий к включению или выключению телевизора, переключению канала и т. д. выполняется с помощью методов. Для сохранения текущего состояния кнопки, а также размеров кнопки, ее цвета и др. предназначены поля.

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

Что же должно быть представлено в виде классов, а что в виде методов или полей? Если слово является существительным (автомобиль, телевизор, кнопка и т. д.), то оно может быть описано как класс. Метод описывает изменение объекта, например, автомобиль начал движение, непрерывно движется, остановился. Поле предназначено для сохранения текущего состояния объекта и его характеристик, например, размер кнопки и ее цвет, признак нажата или нет.

К сожалению не все концепции ООП реализованы в языке VBA

Если вы программировали на других языках, например, на C++, то заметите, что полностью отсутствует такое важное понятие как наследование (возможность создания производных классов на основе базового класса), а также не реализована перегрузка операторов. Все это значительно ограничивает возможности языка VBA

Вопросы для контроля

1.Найдите в окне Visual Basic
следующие элементы и поясните их назначение:

строка меню;

панель элементов;

панель инструментов;

окно проекта;

конструктор форм;

форма;

окно свойств;

окно макета формы.

2.Как выполнить запуск системы
Visual Basic и выход из неё?

3.Шаги разработки проекта.

4.Как отобразить на экране и
как закрыть:

— окно свойств;

— окно проекта;

— панель элементов?

5.Поясните назначение свойств:
Alignment, Caption, Font, Height,
Width.

6.Как вставить в форму
надпись, кнопку?

7.Как сохранить проект?

8.Как запустить проект и как
прекратить его работу?

9.Как узнать, находится
система Visual Basic в режиме разработки или в режиме исполнения?

10.Как вызвать в окно программы
код нужной событийной процедуры нужного объекта?

11.Как увидеть список
событийных процедур, связанных с объектом?

12.Как увидеть список объектов,
включенных в форму?

13.Можно ли изменять значения
свойства Caption надписи при исполнении проекта?

14.Поясните назначение свойства
Interval таймера.

15.Как создать выполняемый файл
для разработанного проекта?

16.Как запустить выполняемый
файл?

Loops

The big drawback of using Wait or Sleep, is that Excel locks you out until the wait/sleep period has finished. You can use CTRL+BREAK to interrupt the macro, but Excel won’t accept input from the keyboard or mouse whilst paused using Wait or Sleep.

Events are suspended and anything you have scheduled using Application.OnTime is also delayed until the pause has finished. If you didn’t know what was happening, it looks like Excel has hung whilst Sleep or Wait are in effect. Background processes like printing and recalculation do carry on though.

To overcome this drawback you can use a loop to pause VBA execution, and also allow other things to happen whilst waiting. Macro execution isn’t actually paused, it’s just not doing anything other than running some loop commands.

A loop has an added advantage as Mac users can use them, whereas Wait and Sleep are not available on a Mac.

A simple loop would look something like this

Sub WasteTime(Finish As Long)

    Dim NowTick As Long
    Dim EndTick As Long

    EndTick = GetTickCount + (Finish * 1000)
    
    Do

        NowTick = GetTickCount
        DoEvents

    Loop Until NowTick >= EndTick

End Sub

We write a sub called WasteTime, which when called from another sub or function has a value passed into it which is the number of seconds that we want it to do nothing, like so:

WasteTime(10)

The key here is the DoEvents method. DoEvents tells Excel to check if there is anything else the system wants to do like accept input from the keyboard or mouse. In this example, my macro is executing but allows the user to type into the worksheet. After approximately 10 seconds a message is then displayed.

The GetTickCount function is another Windows API function that we access by using another Declare statement. It returns the number of milliseconds since the computer started up.

The parameter, Finish that we pass into the WasteTime sub, is the number of seconds we want to delay code execution. To convert this to milliseconds, we multiply Finish by 1000.

VBA Application.Wait function

The VBA Application.Wait is a native VBA function that pauses code execution until a certain time is reached. As opposed to VBA Sleep, the Application Wait procedure does not freeze Excel during the pause. This means you can keep working on your Excel Workbook during the delay. Do remember, however, that during macro execution no changes can be undone (CTRL+Z will not undo changes made during macro running). What is more Application Wait does not allow you to wait for periods shorter than a single second.

Syntax

The syntax of the VBA Application.Wait function is:

Application.Wait( time )

Parameters

Parameter Variable Type Description
time Variant The time when the function should return e.g. 15:30:00 for 3:30 pm.

VBA Application.Wait example

The Application.Wait function is similarly pretty easy to use, although a little different than what you might expect with the Sleep function. This is because Application.Wait will wait until a time is reached instead of waiting for a precise interval of time.

Application.Wait "15:30:00"

This approach is of course less practical as usually you want to wait simply for a precise interval of time, like say 3 seconds. That is why we need to aid ourselves with the use of either the DateAdd function or the TimeValue function:

Application.Wait DateAdd("s", 1, Now) 'Wait for 1 second
'same as
Application.Wait Now + TimeValue("0:00:01) 'Wait for 1 second

What does the function above do? It adds 1 second to the current clock time and asks VBA to wait until that moment to return from the function. You can similarly wait for longer periods of time.

Other VBA Wait examples

'Wait for 10 seconds
Application.Wait DateAdd("s", 10, Now)
'Wait for 1 minute
Application.Wait DateAdd("n", 1, Now)
'Wait for 1 hour
Application.Wait DateAdd("h", 1, Now)
'Wait for 1 minute 30 seconds
Application.Wait DateAdd("s", 90, Now) '00:01:30 = 60 + 30
'Wait for 1 hour 2 minutes and 30 seconds
Application.Wait DateAdd("s", 3750, Now) '01:02:30 = 3600 + 120 + 30

Pros and Cons

The pros of using the Application.Wait function:

  • Fairly easy to use (a little less obvious than Sleep)
  • You can break the function at any time (does not freeze the entire process)
  • Available natively from VBA

The cons of using the Application.Wait function:

Allows you to wait for intervals shorter no shorter than 1 second

The Application.Wait function is a little less obvious to use, but won’t freeze your VBA Project allowing you to hit Esc at any time and resume control over your project.

Плюсы и минусы Visual Basic

Ключевым преимуществом этого языка является крайне простой синтаксис. Иными словами, Visual Basic подходит для начинающих программистов. Вместе с тем это не является преградой для применения современных способов создания программных приложений (визуального проектирования и использования объектно-ориентированного подхода).

Плюсы и минусы Visual Basic

Имеются и некоторые другие преимущества:

  1. Можно осуществлять высокоскоростную разработку приложений с графическим интерфейсом для MS Windows.
  2. Есть защита от ошибок, которые связаны с использованием указателей и доступом к памяти, за счет чего VB приложения являются более стабильными. Однако данный нюанс подвергается критике.
  3. Можно применять большинство WinAPI функций в целях увеличения функционала приложений. В книге «Visual Basic Programmer’s Guide to the Win32 API» Дэн Эпплман подробно рассматривает эту тему.
  4. Программист может выбрать компиляцию в машинный код, но и в P-код. Находясь в режиме отладки, программа постоянно компилируется в P-код, причем это не зависит от выбора. Это дает возможность делать паузу в исполнении программы для внесения существенных корректировок в исходный код, после чего продолжать исполнение. Таким образом, нет необходимости в полной перекомпиляции и перезапуске программы.

Популярные статьи

Высокооплачиваемые профессии сегодня и в ближайшем будущем

Дополнительный заработок в Интернете: варианты для новичков и специалистов

Востребованные удаленные профессии: зарабатывайте, не выходя из дома

Разработчик игр: чем занимается, сколько зарабатывает и где учится

Как выбрать профессию по душе: детальное руководство + ценные советы

Но у языка программирования Visual Basic есть и ряд недостатков:

  1. Поддерживаются операционные системы Windows и Mac OS X и никакие другие (исключением является VB1 for DOS).
  2. Низкая скорость работы. Это объясняется тем, что почти весь список имеющихся функций языка реализован посредством библиотеки времени исполнения (runtime library). Данная библиотека осуществляет большое количество «излишних» действий в целях проверки и/или преобразования типов.
  3. Нет механизма наследования реализации объектов. При помощи имеющегося в VB наследования можно наследовать лишь интерфейсы (отсутствует возможность наследования их реализации).
  4. Необходимо иметь установленную msvbvmXX.dll для использования программы.

При этом все вышеназванные недостатки появляются из-за наличия его ключевого преимущества – легкости разработки графического интерфейса. По этой причине множество разработчиков применяют VB в целях создания интерфейса пользователя, тогда как функциональность программы реализуется в виде динамически подключаемых библиотек (DLL), которые пишутся на другом языке (в большинстве случаев это C++).

Плюсы и минусы Visual Basic

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

Первое знакомство

Visual Basic содержит
удобную графическую среду для быстрого создания эффективных приложений для
Windows. Добро пожаловать в мир визуального программирования Visual Basic!

1.1. Запуск Visual Basic

Запустите
Visual Basicи начните краткое
знакомство. Для этого выполните следующие действия:

щелкните на кнопке Пуск (Start) панели
задач, выполните команду Программы (Programs) и укажите на папку Microsoft
Visual Basic
. Появятся значки содержимого папки.

щелкните на значке программы Microsoft Visual
Basic
.

Рис. 1. Окно
нового проекта

Если появится диалоговое окно нового проекта (New
Project
) (рис. 1), в котором можно выбрать один из нескольких типов
шаблонов проектов, выберите Standart.exe (стан-дартный
шаблон)и щелкните на кнопке Open
(От-крыть) – наэкране появится окно
среды Microsoft Visual Basic, изображение которого приведено на рис. 2.

Рис. 2.Основные компоненты окна VisualBasic

Остановимся на назначении отдельных компонент Visual
Basic:

Строка меню Visual Basic содержит
команды для работы с файлами, просмотра и добавления программных модулей, для
выполнения компиляции, а также для конфигурирования среды Visual Basic.

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

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

Форма – это то изображение на
экране, с которым Вы будете взаимодействовать при проектировании, а также при
выполнении Вашей программы.

Конструктор форм информирует о различных
составляющих проекта – формах, модулях и классах.

Окно проекта содержит имена форм и
модулей, входящих в проект.

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

Окно макета формыпредназначено
для изменения положения на экране окна проектируемого приложения.

1.2. Выход из Visual Basic

Ознакомимся с
самым простым способом выхода из Visual Basic.

Выбрать команды File, Exit.

Если появиться вопрос, хотите ли Вы сохранить
изменения проекта, то выбрать No, если Вам не требуется сохранить выполненные изменения или Yes,
если выполненные изменения требуется сохранить.

1. Практическое задание

1.Выполните запуск
Visual Basic.

2.Ознакомьтесь с основными
компонентами Visual Basic.

3.Выйдите из Visual
Basic.

Цикл Do While

Характерная особенность цикла Do While – выполнение содержащегося в нем кода осуществляется до того момента, пока истинно определенное условие. Это хорошо демонстрирует следующий пример функции Sub, где этот цикл используется, чтобы напечатать числа, входящие в последовательность Фибоначчи, пока число в переменной больше 1000.

‘ Sub procedure to list the Fibonacci series for all values below 1,000

Sub Fibonacci()

Dim i As Integer   ‘ counter for the position in the series

Dim iFib As Integer   ‘ stores the current value in the series

Dim iFib_Next As Integer   ‘ stores the next value in the series

Dim iStep As Integer   ‘ stores the next step size

‘ Initialise the variables i and iFib_Next

i = 1

iFib_Next = 0

‘ Do While loop to be executed as long as the value of the

‘ current Fibonacci number exceeds 1000

Do While iFib_Next < 1000

If i = 1 Then

‘ Special case for the first entry of the series

iStep = 1

iFib = 0

Else

‘ Store the next step size, before overwriting the

‘ current entry of the series

iStep = iFib

iFib = iFib_Next

End If

‘ Print the current Fibonacci value to column A of the

‘ current Worksheet

Cells(i, 1).Value = iFib

‘ Calculate the next value in the series and increment

‘ the position marker by 1

iFib_Next = iFib + iStep

i = i + 1

Loop

End Sub

В этом фрагменте видно, что на старте прописано условие iFib_Next < 1000. Если iFib_Next становится больше 1000, то цикл автоматически завершается.

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

Do

Loop While iFib_Next < 1000

Визуальный режим использования таймера в С# (timer wpf c#)

Присутствующий в Windows Forms управляющий элемент «Таймер» () можно перетащить в форму и задать его свойства. Давайте создадим приложение Windows, использующее таймер для записи текста в текстовый файл каждые 5 секунд. В нашем приложении Windows Forms есть две кнопки: «Пуск» и «Стоп». Программа будет записывать строку в текстовый файл каждую секунду после первоначального нажатия кнопки «Пуск». Приложение прекратит временные циклы записи в текстовый файл при нажатии кнопки «Стоп».

Шаг 2

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

Шаг 3

Теперь давайте добавим в нашу программу элемент управления . Перетащим его из Visual Studio Toolbox в форму. С помощью такой нехитрой манипуляции в нашей форме появится элемент – .

Шаг 4

Теперь нам необходимо установить свойства нашего таймера. Для этого щелкнем правой кнопкой мыши на элементе управления «» и откроем окно «Свойства». Здесь для вкладки необходимо установить значение 1000, которое определяется в миллисекундах.

1 секунда = 1000 миллисекунд.

Шаг 5

Теперь нужно нажать кнопку и добавить обработчик событий , дважды щелкнув по свойству . Событие таймера здесь — (как показано на изображении ниже).

Шаг 6

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

using System.IO; 
private static FileStream fs = new FileStream(@"c:\temp\mcb.txt", FileMode.OpenOrCreate, FileAccess.Write);    
private static StreamWriter m_streamWriter = new StreamWriter(fs);

Мы видим из предыдущего участка кода, что класс  создает файл на диске , а определен для записи в него данных. Теперь напишем алгоритм реализации записи нескольких строк в наш файл:

private void Form1_Load(object sender, System.EventArgs e){    
 // Write to the file using StreamWriter class    
  m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);    
  m_streamWriter.Write(" File Write Operation Starts : ");    
  m_streamWriter.WriteLine("{0} {1}",     
  DateTime.Now.ToLongTimeString(),DateTime.Now.ToLongDateString());    
  m_streamWriter.WriteLine("===================================== \n");    
  m_streamWriter.Flush();    
} 

Далее настроим два обработчика регулирующих нажатие кнопок и . В примере ниже, для кнопки «Пуск» устанавливаем значение свойства таймера . Теперь при нажатии на нее будет запускаться таймер, регулирующий выполнение события.

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

private void  button1_Click (  object sender, System.EventArgs e){    
    timer1.Enabled = true ;    
}    
private void  button2_Click (  object sender , System.EventArgs e){    
    timer1.Enabled = false ;    
}    

Остался последний шаг — создать событие , записывающее текущую дату в текстовый файл:

private void  timer1_Tick (  object sender  , System.EventArgs e){    
  m_streamWriter.WriteLine ( "{0} {1}" ,     
  DateTime.Now.ToLongTimeString (), DateTime.Now.ToLongDateString ());    
  m_streamWriter.Flush ();    
}    

Шаг 7

Скомпилируем и запустим приложение. Затем нажмем кнопку «Пуск», чтобы начать запись в текстовый файл. Подождем примерно минуту, а затем нажмем кнопку «Стоп», чтобы остановить его работу. В выходном текстовом файле после всех манипуляций около 60 раз пропишется текущая дата и время. Это значит, что мы все сделали правильно.

Пример решения задачи

Постановка задачи

Построить приложение для
определения процента отклонения фактического выполнения производственной
программы от плана.

Экономико-математическая модель

Процент отклонения (Отклонение) фактического выполнения (Факт)
производственной программы от плана (План) определяется по формуле:

 

где Процент = Факт / План * 100

Если Процент = 100, то вывести сообщение «План
выполнен на 100%».

Структура данных

При решении
задачи используются следующие данные: План, Факт, Процент
и Отклонение. Все значения данных – дробные числа.

Данные План и Факт
являются исходными и вводятся с клавиатуры в текстовые поля, поэтому в
программе им присваиваются имена txtПлан и txtФакт
соответственно.

Вычисляемая с помощью формулы величина Процент
является промежуточной. Она участвует в
определении результата Отклонение.
Поэтому в программе Процент представлен переменной дробного типа с именем sngПроцент и описывается как переменная типа Single.

Рис. 4.1. Схема
алгоритма определения отклонения от плана

Результат решения задачи выводится с
соответствующим пояснительным текстом («План перевыполнен
на <Отклонение> %» или «План недовыполнен
на <Отклонение> %»), т. е. он не выводится только в виде
числового значения. Поэтому в программе величина Отклонение описана как промежуточная переменная sngОтклонение типа Single.

Все сообщение
об отклонении фактического значения от плана формируется в переменной strОтклонение, которая в программе объявляется как строковая
переменная (тип String).

Используемые в задаче
переменные представлены в следующей таблице.

Таблица

Используемые
переменные

Реквизит

Имя

Назначение

План

Факт

Процент

Отклонение

Результат

tхtПлан

tхtФакт

sngПроцент

sngОтклонение

strОтклонение

Значение планового показателя, грн.

Значение фактического показателя, грн.

Процент выполнения плана

Отклонение от плана в процентах

Сообщение об отклонении фактического значения от
плана

Интерфейс с пользователем

Решение задачи производится с помощью формы, приведенной
на рис. 4.2.

Рис. 4.2. Проект
формы для решения задачи

На форме слова «План» и «Факт» представляются
надписями. Соответствующие исходные данные вводятся в текстовые поля. Вычисления
производятся при нажатии кнопки «Вычислить». Результат помещается в вогнутую
область под кнопкой. В зависимости от результата вычисления переменная sngОтклонение может принимать одно из следующих значений:

1)  План
перевыполнен на «0,00» %;

2)  План
недовыполнен на «0,00» %;

3)  План
выполнен на 100 % .

Здесь принято условное обозначение «0,00», которое означает,
что результат sngОтклонение выводится с двумя разрядами в дробной части.

Область результата представляется
надписью lblРезультат.

Сделать цикл

Цикл «Выполнить пока» позволяет вам проверить наличие условия и запустить цикл, пока это условие выполняется (или имеет значение ИСТИНА).

В цикле Do While Loop есть два типа синтаксиса.

Выполните   Цикл

и

Выполните  Цикл 

Разница между этими двумя вариантами заключается в том, что в первом случае сначала проверяется условие «Пока» перед выполнением любого блока кода, а во втором случае сначала выполняется блок кода, а затем проверяется условие «Пока».

Это означает, что если условие «Пока» имеет значение «Ложь» в обоих случаях, код все равно будет выполняться хотя бы один раз во втором случае (поскольку условие «Пока» проверяется после того, как код был выполнен один раз).

Теперь давайте посмотрим на несколько примеров использования циклов Do While в VBA.

Пример 1. Добавление первых 10 положительных целых чисел с помощью VBA

Предположим, вы хотите сложить первые десять положительных целых чисел с помощью цикла Do While в VBA.

Для этого вы можете использовать цикл Do While, пока следующее число не станет меньше или равно 10. Как только число станет больше 1o, ваш цикл остановится.

Вот код VBA, который запустит этот цикл Do While и покажет результат в окне сообщения.

Sub AddFirst10PositiveIntegers () Dim i As Integer i = 1 Do While i <= 10 Result = Result + i i = i + 1 Loop MsgBox Result End Sub

Вышеупомянутый цикл продолжает работать до тех пор, пока значение «i» не станет 11. Как только оно станет равным 11, цикл завершится (так как условие While станет ложным).

Внутри цикла мы использовали переменную Result, которая содержит окончательное значение. После завершения цикла в окне сообщения отображается значение переменной «Result».

Пример 2 — Введите даты текущего месяца

Допустим, вы хотите ввести все даты текущего месяца в столбец таблицы.

Вы можете сделать это, используя следующий код цикла Do While:

Sub EnterCurrentMonthDates () Dim CMDate As Date Dim i As Integer i = 0 CMDate = DateSerial (Год (Дата), Месяц (Дата), 1) Месяц (CMDate) = Месяц (Дата) Диапазон ("A1"). Смещение (i, 0) = CMDate i = i + 1 CMDate = CMDate + 1 подпрограмма конца цикла

Приведенный выше код вводит все даты в первый столбец рабочего листа (начиная с A1). Циклы продолжаются до тех пор, пока значение месяца в переменной CMDate не совпадет со значением текущего месяца.

Заявление о выходе

Вы можете использовать оператор Exit Do, чтобы выйти из цикла. Как только код выполняет строку «Exit Do», он выходит из цикла Do While и передает управление следующей строке сразу после цикла.

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

Код ниже сделает это:

Sub EnterCurrentMonthDates () Dim CMDate As Date Dim i As Integer i = 0 CMDate = DateSerial (Год (Дата), Месяц (Дата), 1) Месяц (CMDate) = Месяц (Дата) Диапазон ("A1"). Смещение (i, 0) = CMDate i = i + 1 Если i> = 10, тогда выйти из Do CMDate = CMDate + 1 Loop End Sub

В приведенном выше коде оператор IF используется для проверки того, больше ли значение i 10 или нет. Как только значение «i» становится равным 10, выполняется инструкция Exit Do и цикл завершается.

Пользовательские формы

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

Одним из объектов VBA, объектом визуализации являются UserForm — пользовательские формы — это диалоговые окна интерфейса процедур VBA. С их помощью пользователь может эффективно передавать данные в процедуры и получать результаты их работы. Пользовательские формы дают возможность пользователю создавать диалоговые окна в разрабатываемых приложениях и размещать в окнах элементы управления.

В VBA есть две функции — MsgBox и InputBox, которые позволяют отображать простые диалоговые окна, не создавая пользовательскую форму. Эти окна можно видоизменять, использовать управляющие ими параметры, но они не имеют тех широких и эффективных возможностей опций, которые предоставляют пользовательские формы.

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

Создание пользовательской формы

Чтобы создать форму, откройте редактор Visual Basic для этотого нажмите (Alt + F11) или выберете на ленте вкладку « Разработчик», а на ней Visual Basic

В открывшемся окне Microsoft Visual Basic выбрать на ленте вкладку Insert. В открывшемся меню выбрать UserForm.

На экране появилась пустая форма UserForml, инструментальная панель Toolbox и при нажатии правой кнопки мыши контекстное меню с предложением Properties — свойства формы.

Элементы управления

На инструментальной панели Toolbox расположены следующие элементы управления, которые являются объектами VBA :

  • TextBox — поле,
  • Label — надпись,
  • CommandButton — кнопка,
  • ListBox — список,
  • ComboBox — поле со списком,
  • ScrollBar — полоса прокрутки,
  • SpinButton — счетчик,
  • OptionButton — переключатель,
  • CheckBox — флажок ,
  • ToggleButton — выключатель,
  • Frame — рамка,
  • Image — рисунок,
  • RefEdit — RefEdit,
  • MultiPage — набор страниц.

Любой из этих элементов управления, объектов можно разместить на форме.

Например, можно поместить кнопку. Для этого мышью перетаскиваем на форму объект или элемент управления под названием CommandBatton, расположенный вторым слева в третьем ряду панели Toolbox. На форме появится кнопка CommandBatton1

Свойства элементов управления

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

Наиболее часто используемые свойства объекта UserForm:

  • Name — возвращает имя пользовательской формы,
  • Caption — возвращает текст, отображаемый в строке заголовка формы,
  • BackColor — возвращает цвет фона формы,
  • BorderStyle — устанавливает тип границы,
  • Picture — указывает рисунок, отображаемый как фон формы.

Связь пользовательской формы с процедурой

После двойного щелчка по кнопке откроется окно редактора VBA, где уже будет создана заготовка вашей процедуры обработки нажатия на кнопку.

Теперь в тело этой процедуры можно вводить команды (операторы), которые будут выполняться, если событие в заголовке — Click мыши — произойдет. Это событие считается стандартным для кнопок, флажков, рисунков, рамок, переключателей и окон отображения текста.

Для остальных элементов — полей ввода текста, полос прокрутки, счетчиков и др. — стандартным считается событие Change, то есть их изменение.

Примеры циклов Do While… Loop

Простейшие циклы

Цикл Do While… Loop с условием до исполняемых операторов:

1
2
3
4
5
6
7

Subtest1()

DimaAsByte

DoWhilea<10

a=a+1

Loop

MsgBoxa

EndSub

Цикл Do While… Loop с условием после исполняемых операторов:

1
2
3
4
5
6
7

Subtest2()

DimaAsByte

Do

a=a+1

LoopWhilea<10

MsgBoxa

EndSub

В обоих случаях окно MsgBox выведет число 10. Когда значение переменной a будет равно 10, проверяемое условие выдаст значение False, и цикл будет остановлен.

Проход по строкам листа

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

Дни Игрок Брошено Попало в цель
1 день Белка 1 15 6
1 день Белка 2 12 7
2 день Белка 1 14 8
2 день Белка 2 16 7
3 день Белка 1 20 9
3 день Белка 2 14 6
4 день Белка 1 26 10
4 день Белка 2 13 5
5 день Белка 1 17 4
5 день Белка 2 21 7

Исходя из этих данных необходимо узнать, сколько шишек осталось у Белки 1 в дупле. Для этого необходимо вычесть из 100 шишек количество выброшенных Белкой 1 и прибавить шишки, заброшенные в ее дупло Белкой 2. Вычисления начинаем со второй строки (в первой заголовки) и в условии для цикла Do While… Loop указываем «первая ячейка текущей строки не является пустой». Таблица должна начинаться с первой ячейки рабочего листа «A1», и под ней, как минимум, одна строка должна быть пустой, точнее, первая ячейка этой строки.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Subtest3()

DimiAsLong,nAsLong

i=2

n=100

DoWhileCells(i,1)<>»»

IfCells(i,2)=»Белка 1″Then

n=n-Cells(i,3)

Else

n=n+Cells(i,4)

EndIf

i=i+1

Loop

MsgBoxn

EndSub

Результат, выведенный в информационном сообщении MsgBox, будет равен 40. Вы можете скопировать таблицу на рабочий лист книги Excel и поэкспериментировать с кодом VBA.

Бесконечный цикл и Exit Do

Пример бесконечного цикла:

1
2
3
4
5
6
7
8
9

Subtest4()

DimaAsByte

DoWhilea<10

a=a+1

Ifa=9Then

a=

EndIf

Loop

EndSub

При запуске этой процедуры цикл Do While… Loop начинает выполняться бесконечно. Мне приходилось останавливать бесконечные циклы VBA в Excel 2000 и Excel 2016. В Excel 2000 помогло сочетание клавиш Ctrl+Break, а в Excel 2016 при закрытии редактора VBA крестиком появляется окно:

Информационное окно «Microsoft Excel не отвечает»

Ожидать отклика программы нет смысла, поэтому нажимаем «Перезапустить программу» или «Закрыть программу».

Пример использования оператора Exit Do:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Subtest5()

DimaAsByte,nAsLong

DoWhilea<10

a=a+1

n=n+1

Ifa=9Then

a=

EndIf

Ifn=1000Then

ExitDo

EndIf

Loop

MsgBoxn

EndSub

Когда число итераций цикла дойдет до 1000, он будет завершен, и информационное сообщение MsgBox выведет на экран число повторений цикла Do While… Loop из этого примера.

Циклы с условием (неопределенные циклы)

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

  • Четыре вида циклов Do..Loop, которые различаются типом проверяемого условия и временем выполнения этой проверки.
  • Непрерываемый цикл While … Wend.

Цикл Do While … Loop — типичный цикл с предусловием. Условие проверяется до того, как выполняется тело цикла. Цикл продолжает свою работу, пока это <условие> выполняется (т.е. имеет значение True). Так как проверка выполняется в начале, то тело цикла может ни разу не выполниться. Формат цикла Do While … Loop:

Do While <условие> <блок операторов> Loop 

Листинг 10. Цикл Do While … Loop

' ЗАДАЧА: Составить программу, которая предусматривает ввод пользователем ' произвольной последовательности чисел. Ввод должен быть прекращен ' только после того, как сумма введенных нечетных чисел превысит 100. Sub sample8() Dim OddSum As Integer ‘сумма нечетных чисел Dim OddStr As String ‘строка с нечетными числами Dim Num ‘для приема вводимых чисел OddStr = "" ‘инициализация выходной строки OddSum = 0 ‘инициализация суммы OddSum Do While OddSum < 100 ‘начало цикла Num = InputBox("Введите число: ") If (Num Mod 2) <> 0 Then ‘проверка на четность OddSum = OddSum + Num ‘накопление суммы нечетных чисел OddStr = OddStr & Num & " " End If Loop 'вывод строки с нечетными числами MsgBox prompt:="Нечетные числа: " & OddStr End Sub 

Оператор Do … Loop While предназначен для организации цикла с постусловием. Условие проверяется после того, как тело цикла, будет выполнено хотя бы один раз. Цикл продолжает свою работу, пока <условие> остается истинным. Формат цикла Do … Loop While:

Do <блок операторов> Loop While<условие> 

Листинг 11. Цикл с постусловием

' ЗАДАЧА: Составить программу игры "Угадай число". Программа должна случайным ' образом генерировать число в диапазоне от 1 до 1000, пользователь должен ' угадать это число. Программа на каждое вводимое число выводит подсказку ' "больше" или "меньше". Sub sample8() Randomize Timer ' инициализация генератора случайных чисел Dim msg As String ' строка сообщения Dim SecretNumber As Long, UserNumber As Variant Begin:	SecretNumber = Round(Rnd * 1000) ' число, сгенерированное компьютером UserNumber = Empty ' число, вводимое пользователем Do ' игровой процесс Select Case True Case IsEmpty(UserNumber): msg = "Введите число" Case UserNumber > SecretNumber: msg = "Слишком много!" Case UserNumber < SecretNumber: msg = "Слишком мало!" End Select UserNumber = InputBox(prompt:=msg, Title:="Угадай число") Loop While UserNumber <> SecretNumber ' проверка If MsgBox("Играть еще? ", vbYesNo + vbQuestion, "Вы угадали!") = vbYes Then GoTo Begin End If End Sub 

Циклы Do Until … Loop и Do … Loop Until являются инверсиями ранее рассмотренных циклов с условием. В общем случае они работают аналогично, за исключением того, что тело цикла выполняется при ложном условии (т.е. <условие>=False). Формат цикла Do Until … Loop:

Do Until <условие> <блок операторов> Loop 

Формат цикла Do … Loop Until:

Do <блок операторов> Loop Until<условие> 

Практическое задание: Перепишите программы из листингов 10 и 11 с использованием инвертированных операторов цикла.

Цикл While … Wend также относится к циклам с условием. Данный оператор полностью соответствует структуре Do While … Loop. Формат цикла While … Wend:

While <условие> <блок операторов> Wend 

Отличительной особенностью этого оператора является невозможность принудительного завершения (прерывания) тела цикла (оператор Exit Do не работает в цикле While … Wend).

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Вадлейд
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: