Основы программирования на VBA. Написание простой процедуры на Visual Basic for Application. Вызов VBA процедуры «Sub» из другой процедуры

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

К циклам VBA относятся:

  • Цикл For
  • Цикл Do While
  • Цикл Do Until

Оператор цикла «For» в Visual Basic

Структура оператора цикла For в Visual Basic может быть организована в одной из двух форм: как цикл For … Next или как цикл For Each .

Цикл «For … Next»

Цикл For … Next использует переменную, которая последовательно принимает значения из заданного диапазона. С каждой сменой значения переменной выполняются действия, заключённые в теле цикла. Это легко понять из простого примера:

For i = 1 To 10 Total = Total + iArray(i) Next i

В этом простом цикле For … Next используется переменная i , которая последовательно принимает значения 1, 2, 3, … 10, и для каждого из этих значений выполняется код VBA, находящийся внутри цикла. Таким образом, данный цикл суммирует элементы массива iArray в переменной Total .

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

For d = 0 To 10 Step 0.1 dTotal = dTotal + d Next d

Так как в приведённом выше примере задан шаг приращения равный 0.1 , то переменная dTotal для каждого повторения цикла принимает значения 0.0, 0.1, 0.2, 0.3, … 9.9, 10.0.

Для определения шага цикла в VBA можно использовать отрицательную величину, например, вот так:

For i = 10 To 1 Step -1 iArray(i) = i Next i

Здесь шаг приращения равен -1 , поэтому переменная i с каждым повторением цикла принимает значения 10, 9, 8, … 1.

Цикл «For Each»

Цикл For Each похож на цикл For … Next , но вместо того, чтобы перебирать последовательность значений для переменной-счётчика, цикл For Each выполняет набор действий для каждого объекта из указанной группы объектов. В следующем примере при помощи цикла For Each выполняется перечисление всех листов в текущей рабочей книге Excel:

Dim wSheet As Worksheet For Each wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Next wSheet

Оператор прерывания цикла «Exit For»

Оператор Exit For применяется для прерывания цикла. Как только в коде встречается этот оператор, программа завершает выполнение цикла и переходит к выполнению операторов, находящихся в коде сразу после данного цикла. Это можно использовать, например, для поиска определённого значения в массиве. Для этого при помощи цикла просматривается каждый элемент массива. Как только искомый элемент найден, просматривать остальные нет необходимости – цикл прерывается.

Применение оператора Exit For продемонстрировано в следующем примере. Здесь цикл перебирает 100 записей массива и сравнивает каждую со значением переменной dVal . Если совпадение найдено, то цикл прерывается:

For i = 1 To 100 If dValues(i) = dVal Then IndexVal = i Exit For End If Next i

Цикл «Do While» в Visual Basic

Цикл Do While выполняет блок кода до тех пор, пока выполняется заданное условие. Далее приведён пример процедуры Sub , в которой при помощи цикла Do While выводятся последовательно числа Фибоначчи не превышающие 1000:

"Процедура Sub выводит числа Фибоначчи, не превышающие 1000 Sub Fibonacci() Dim i As Integer "счётчик для обозначения позиции элемента в последовательности Dim iFib As Integer "хранит текущее значение последовательности Dim iFib_Next As Integer "хранит следующее значение последовательности Dim iStep As Integer "хранит размер следующего приращения "инициализируем переменные i и iFib_Next i = 1 iFib_Next = 0 "цикл Do While будет выполняться до тех пор, пока значение "текущего числа Фибоначчи не превысит 1000 Do While iFib_Next < 1000 If i = 1 Then "особый случай для первого элемента последовательности iStep = 1 iFib = 0 Else "сохраняем размер следующего приращения перед тем, как перезаписать "текущее значение последовательности iStep = iFib iFib = iFib_Next End If "выводим текущее число Фибоначчи в столбце A активного рабочего листа "в строке с индексом i Cells(i, 1).Value = iFib "вычисляем следующее число Фибоначчи и увеличиваем индекс позиции элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

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

Другой способ реализовать цикл Do While – поместить условие не в начале, а в конце цикла. В этом случае цикл будет выполнен хотя бы раз, не зависимо от того, выполняется ли условие.

Схематично такой цикл Do While с проверяемым условием в конце будет выглядеть вот так:

Do ... Loop While iFib_Next < 1000

Цикл «Do Until» в Visual Basic

Цикл Do Until очень похож на цикл Do While : блок кода в теле цикла выполняется раз за разом до тех пор, пока заданное условие выполняется (результат условного выражения равен True ). В следующей процедуре Sub при помощи цикла Do Until извлекаются значения из всех ячеек столбца A рабочего листа до тех пор, пока в столбце не встретится пустая ячейка:

IRow = 1 Do Until IsEmpty(Cells(iRow, 1)) "Значение текущей ячейки сохраняется в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

В приведённом выше примере условие IsEmpty(Cells(iRow, 1)) находится в начале конструкции Do Until , следовательно цикл будет выполнен хотя бы один раз, если первая взятая ячейка не пуста.

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

Do ... Loop Until IsEmpty(Cells(iRow, 1))

Урок подготовлен для Вас командой сайта office-guru.ru
Источник: /> Перевел: Антон Андронов

Правила перепечаткиЕще больше уроков по Microsoft Excel

Цикл For Loop в VBA – один из самых популярных циклов в Excel. Данный цикл имеет две формы – For Next и For Each In Next. Данные операторы используются для последовательного перемещения по списку элементов или чисел. Для завершения цикла мы можем в любой момент использовать команду выхода. Давайте подробнее рассмотрим каждый из этих циклов.

VBA цикл For Next

Цикл For Next имеет следующий синтаксис:

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

Пример цикла

счетчик будет равным 11

VBA обратный цикл For Loop с инструкцией STEP

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

Последнее значение переменной счетчик будет равным 1.

Как вы могли заметить, мы можем использовать инструкцию Step n для работы цикла как вперед, так и в обратном направлении. По умолчанию значение Step равно 1, но оно может быть изменено, если необходимо пропускать какие-либо значения, тогда значение n будет больше одного, или перемещаться в обратном направлении, тогда n будет отрицательным.

VBA цикл For Each … Next

Цикл For Each … Next имеет следующий цикл:

Здесь переменная элемент_группы принадлежит к группе_элементов (железная логика!!!). Я имею в виду, что объект группа_элементов должен быть коллекцией объектов. Вы не сможете запустить цикл For Each для отдельно объекта (Microsoft сразу оповестит вас об этом 438-й ошибкой).

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

Ниже представлен пример, как можно воспользоваться циклом For Each для просмотра всех листов книги:

… либо всех сводных таблиц на листе

Прерывание цикла VBA

Если вам необходимо выйти из цикла до момента, как будет достигнуто условие завершения цикла, воспользуйтесь командой End For в связке с инструкцией IF . В примере, приведенном ниже, мы выйдем из цикла до момента достижения условия завершения, в данном цикле выход будет осуществлен при условии, когда переменная счетчик будет равна 3.

Пропуск части цикла в For Each

Пропускать часть цикла, а затем возвращаться назад – плохая практика. Тем не менее, давайте рассмотрим пример:

Здесь мы пропустили одну итерацию (когда j = 3). Как вы думаете, какой результат выдаст программа? 3? 5? Ну… на самом деле, ни один из вариантов не верный. Цикл будет выполняться бесконечно, пока память компьютера не переполнится.

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

Но опять же, это плохая практика написания кода, и может привести к нежелательным последствиям при написании кода в будущем. Вместо этого, при необходимости пропуска некоторых итераций, попробуйте использовать функцию If или Select Case.

Excel VBA. Цикл в макросе

Создадим самый простой цикл используя VBA в Excel.

В этот раз напишем всё своими руками:

Sub Заполнение() "Запускаем цикл от 1 до 10 "Начало цикла For i = 1 To 10 "В первый столбец записываем порядковый номер Cells(i + 1, 1) = i "Во второй столбец записываем произведение порядкового номера и значения указанного в ячейке "B1" Cells(i + 1, 2) = i * Range("b1").Value "Конец цикла Next End Sub

Расшифрую, приведённый выше код VBA:

  • Весь код макроса заключается между Sub и End Sub, после Sub пишется название макроса.
  • Текст после ‘ означает комментарий
  • Цикл заключается между For … to и Next
  • i - в моём случае переменная, Вы можете выбрать любую другую, в том числе поддерживаются и русские обозначения (например: For переменная=1 To 10 …)
  • Cells(строка, столбец) – ячейка в которую хотим что-то записать или из которой хотим извлечь информацию, в нашем случае столбец мы указали константу (1 и 2), а строку сделали переменной (i+1).
  • Range(“b1”) возвращает значение ячейки “B1”

А ещё, можно сразу дописать минимакрос по очистке диапазона от значений

Sub Очистка() Range("A2:B11").ClearContents End Sub

Доброго времени суток! Данную статью я решил посвятить рубрике по основам программирования в Visual Basic for Application . И сегодня мы поговорим о циклах в VBA, разберём их синтаксис и рассмотрим несколько примеров, которые часто встречаются программисту.

Сначала напомню, что цикл - процесс повторения части кода, выполняемый, пока не будет выполнено или нарушено заданное нами условие.

В данной статье мы разберём синтаксис и примеры следующих циклов в VBA :

  • For each
  • While
  • Until

Цикл For в VBA

Цикл for в VBA обычно используется при зацикливании фрагмента кода, если нам известно конечное значение counter - счетчика, при котором мы выйдем из цикла.
Возьмём для примера самый распространённый пример:

Сгенерировать массив из 5 целых значений

Dim mas(5) As Integer For i% = 0 To 4 mas(i) = Int((10 * Rnd) + 1) Next i

Обратите ваше внимание, что в этом примере используется неявное объявление при работе с циклами в VBA. i% - означает неявное объявление переменной i в формате integer. Такая конструкция по сути заменяет следующую: dim i as integer . Это используется для сокращения кода и для удобства написания и чтения. В старых версиях VBA необходимо указывать знак формата после каждого использования неявной переменной. В более поздних версиях достаточно всего один раз.

VBA для цикла for даёт возможность использовать функцию Step . Как ясно из перевода, это шаг, с которым мы будем проходить наш интервал. По умолчанию, он равен 1. Популярный вариант использования встречается в случаях, когда counter связан с переменной, используемой внутри цикла. Например, при написании программ, связанных с функциями.

Найти пересечение графика функции y = 5*x + 5 с осью ординат

Function expr(x As Integer) As Integer expr = 5 * x + 5 End Function Sub CodeTown() Dim i As Integer For i = -10 To 10 Step 1 If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i) Next i End Sub

Теперь представим, что у нас достаточно большой диапазон и мы не хотим заставлять компьютер считать лишние итерации. На этот случай существует команда Exit For . Перепишем наш последний пример с новой командой.

Function expr(x As Integer) As Integer expr = 5 * x + 5 End Function Sub CodeTown() Dim i As Integer For i = -10 To 10 Step 1 If expr(i) = 0 Then MsgBox "При Y = 0, Х = "+ CStr(i) Exit For End If Next i End Sub

C помощью команды Exit можно закончить выполнение любого цикла в VBA. Достаточно указать после Exit название используемого цикла. Также им возможно завершить работу любой процедуры или функции.

Цикл For Each в VBA


For Each в VBA основан на переборе всех элементов, указанного типа в массиве, объекте или группе.
Самый популярный вариант его использования - перебор страниц в рабочей книге.

Вывести названия всех листов в рабочей книге

For Each ws In ThisWorkbook.Worksheets MsgBox ws.Name Next ws

И ещё один интересный пример:

Изменить размер шрифта и выравнить по центру текст в label

For Each element In UserForm1.Controls If InStr(1, UserForm1.Controls.Item(i%).Name, "Label") > 0 Then UserForm1.Controls.Item(i%).TextAlign = fmTextAlignCenter UserForm1.Controls.Item(i%).Font.Size = 20 i% = i% + 1 End If Next element

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

Цикл While в VBA


Циклы в VBA, которые используют структуру Do..Loop (это while и until циклы) можно записывать с разным расположением фрагмента условия. Как видите на картинке выше, условие может проверяться после выполнения одной итерации, а может перед запуском цикла.
Самый популярный пример:

Отсортируйте по возрастанию сгенерированный массив методом пузырька

Dim mas(5) As Integer For i% = 0 To 4 mas(i%) = Int((10 * Rnd) + 1) Next i Dim count As Integer, temp As Integer count = 1 Do While count > 0 count = 0 For i% = 0 To 3 If mas(i) > mas(i + 1) Then temp = mas(i) mas(i) = mas(i + 1) mas(i + 1) = temp count = count + 1 End If Next i% Loop

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

Цикл Until в VBA


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

Заставить пользователя ввести число

Dim temp As Variant Do temp = InputBox("Введите число") Loop Until IsNumeric(temp)

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

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

Цикл For…Next в VBA Excel, его синтаксис и описание отдельных компонентов. Примеры использования цикла For…Next.

Цикл For…Next в VBA Excel предназначен для выполнения группы операторов необходимое количество раз, заданное управляющей переменной цикла - счетчиком. При выполнении цикла значение счетчика после каждой итерации увеличивается или уменьшается на число, указанное выражением оператора Step, или, по умолчанию, на единицу. Когда необходимо применить цикл к элементам, количество которых и индексация в группе (диапазон, массив, коллекция) неизвестны, следует использовать цикл For Each… Next.

  1. Синтаксис цикла For…Next
  2. Компоненты цикла For…Next
  3. Примеры циклов For…Next
    • Простейший цикл
    • Простейший цикл с шагом
    • Цикл с отрицательными аргументами
    • Вложенный цикл
    • Выход из цикла
    • Цикл с дробными аргументами

Синтаксис цикла For…Next

For counter = start To end Next For счетчик = начало To конец Next

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

Компоненты цикла For…Next

Компонент Описание
counter Обязательный атрибут. Числовая переменная, выполняющая роль счетчика, которую еще называют управляющей переменной цикла.
start Обязательный атрибут. Числовое выражение, задающее начальное значение счетчика.
end Обязательный атрибут. Числовое выражение, задающее конечное значение счетчика.
Step* Необязательный атрибут. Оператор, указывающий, что будет задан шаг цикла.
step Необязательный атрибут. Числовое выражение, задающее шаг цикла. Может быть как положительным, так и отрицательным.
statements Необязательный** атрибут. Операторы вашего кода.
Exit For Необязательный атрибут. Оператор выхода из цикла до его окончания.
Next Здесь counter - необязательный атрибут. Это то же самое имя управляющей переменной цикла, которое можно здесь не указывать.

*Если атрибут Step отсутствует, цикл For…Next выполняется с шагом по умолчанию, равному.

**Если не использовать в цикле свой код, смысл применения цикла теряется.

Примеры циклов For…Next

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

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

Заполняем десять первых ячеек первого столбца активного листа цифрами от 1 до 10:

Sub test1() Dim i As Long For i = 1 To 10 Cells(i, 1) = i Next End Sub

Простейший цикл с шагом

В предыдущий цикл добавлен оператор Step со значением 3, а результаты записываем во второй столбец:

Sub test2() Dim i As Long For i = 1 To 10 Step 3 Cells(i, 2) = i Next End Sub

Цикл с отрицательными аргументами

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

Sub test3() Dim i As Long For i = 0 To -9 Step -1 Cells(i + 10, 3) = i + 10 Next End Sub

Увеличиваем размер шага до -3 и записываем результаты в четвертый столбец активного листа:

Sub test4() Dim i As Long For i = 0 To -9 Step -3 Cells(i + 10, 4) = i + 10 Next End Sub

Вложенный цикл

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

Sub test5() Dim i1 As Long, i2 As Long For i1 = 1 To 10 "Пятой ячейке в строке i1 присваиваем 0 Cells(i1, 5) = 0 For i2 = 1 To 4 Cells(i1, 5) = Cells(i1, 5) + Cells(i1, i2) Next Next End Sub

Выход из цикла

В шестой столбец активного листа запишем названия десяти животных, конечно же, с помощью цикла For…Next:

Sub test6() Dim i As Long For i = 1 To 10 Cells(i, 6) = Choose(i, "Медведь", "Слон", "Жираф", "Антилопа", _ "Крокодил", "Зебра", "Тигр", "Ящерица", "Лев", "Бегемот") Next End Sub

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

Sub test7() Dim i As Long For i = 1 To 10 If Cells(i, 6) = "Крокодил" Then Cells(i, 7) = "Он съел галоши" Exit For Else Cells(i, 7) = "Здесь был цикл" End If Next End Sub

Результат работы циклов For…Next из примеров:

Результат работы циклов For…Next

Такие данные на активном листе Excel вы получите, если последовательно запустите на выполнение в редакторе VBA все семь подпрограмм из примеров, демонстрирующих работу циклов For…Next.

Цикл с дробными аргументами

Атрибуты start, end и step могут быть представлены числом, переменной или числовым выражением:

For i = 1 To 20 Step 2 For i = a To b Step c For i = a - 3 To 2b + 1 Step c/2

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

"Значения атрибутов до округления For i = 1.5 To 10.5 Step 2.51 "Округленные значения атрибутов For i = 2 To 10 Step 3

Старайтесь не допускать попадания в тело цикла For…Next неокругленных значений аргументов, чтобы не получить непредсказуемые результаты его выполнения. Если без дробных чисел не обойтись, а необходимо использовать обычное округление, применяйте функцию рабочего листа WorksheetFunction.Round для округления числа перед использованием его в цикле For…Next.

VBA в Excel

Программирование в Excel с помощью VBA.

Язык VBA позволяет писать макросы в Excel. Как это делать рассматривается ниже.

Application

Application - это объект, занимающий вершину иерархии объектов в Excel. Application – это и есть Excel. Вот примеры использования Application:

окно нормальных размеров

Application.WindowState = xlNormal

окно максимальных размеров

Application.WindowState = xlMaximized

Workbooks

Workbooks - это коллекция рабочих книг, которые открыты. Каждая рабочая книга представлена объектом Workbook. Узнать сколько рабочих книг сейчас в коллекции можно так:

Dim bookCount As Integer
bookCount = Workbooks.Count
MsgBox ("Opened books = " & bookCount)

Обатиться к нужной рабочей книге в коллекции Workbooks можно обратиться по его номеру или по имени:

Workbooks.Item(2).Activate

здесь мы активизировали второй элемент коллекции Workbooks.

Другие примеры мы увидим ниже.

Workbook

Workbooks.Item(1).Save

И где же в этом примере рабочая книга Workbook? Здесь: Workbooks.Item(1), это выражение возвращает первый элемент коллекции Workbooks, а это и есть Workbook.

Закрыть рабочую книгу:

Workbooks.Item(1).Close

Sheets

Sheets - это все листы рабочей книги. Листы рабочей книги представлены двумя типами: рабочие листы - это обычные листы Excel и второй тип - это листы диаграмм. Те и другие и составляют коллекцию Sheets.

Charts

Charts - это только диаграммы рабочей книги.

Chart

Chart - это объект, представляющий одину диаграмму. Если диаграмма содержится в обычном рабочем листе, то она объектом Chart не является.

Worksheets

Worksheets - это только рабочие листы рабочей книги.

Добавим рабочий лист в коллекцию Worksheets:

Worksheet

Worksheet - это один лист рабочей книги Excel.

Все ячейки рабочего листа Worksheet:

Worksheets("Лист1").Cells

Range. Работа с ячейками в Excel

Range - это одна ячейка листа или несколько ячеек. Этот объект рассмотрим подробнее. Установим кнопку на рабочий лист Excel. Откройте панель инструментов «Элементы управления» (правой кнопкой по свободному полю панели инструментов и выбираем из выпавшего меню). В этой панели выбираем кнопку и устанавливаем её на свободное место рабочего листа, в его правой части. Правой кнопкой мыши по нашей кнопке - > Свойства. Установите значение свойства Name - CommandButton, а свойства Caption - Range Test.

Получаем:

Закройте окно свойств кнопки, и кликаем по нашей кнопке правой кнопкой мыши, из выпавшего меню выбираем «Исходный текст». Открывается окно редактора VBA, оно называется Microsoft Visual Basic. В нём уже есть заготовка обработчика нажатия на кнопку CommandButton:

Кстати, помотрите на эту заготовку, ключевое слово Sub говорит, что это процедура, а слово Private указывает, что эта процедура видна лишь в данном модуле.

Всё у нас готово для начала изучения работы с ячейками рабочего листа Excel.

Как задать активную ячейку?

Сделаем активной ячейку A2:A2:

Private Sub CommandButton_Click()
Range("A2:A2").Activate
End Sub

6.1. Объекты, методы, свойства

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

VBA является объектно-ориентированной средой, содержащей большой набор объектов, каждый из которых обладает множеством свойств и методов. Объекты и инструменты относятся к определенному классу (например, класс TextBox).

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

Объекты (аналог существительному)

Объектом считается любой элемент приложения ─ ячейка, лист, рабочая книга, диаграмма. Фактически объектом является и само приложение Excel. Объекты могут включать области ячеек, рамки ячеек, окна, сценарии, стили и т.д. Каждый класс объектов имеет свое множество свойств, функций и событий.

Методы (аналог глаголу)

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

Синтаксис вызова: Объект.Метод – указываются имя вызывающего метод объекта и имя самого метода, разделенные точкой.

Пример: Ball.Kick или Мяч.Ударить; Вода.Пить

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

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

Пример 1: защита листа Лист1 от внесения изменения (метод Protect)

Sheets(“Лист1”).Protect

Пример 2: добавление нового рабочего листа

Worksheet.Add Before:=Worksheets(1)

Свойство (аналог прилагательному)

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

Для присваивания свойству нового значения, необходимо создать оператор присваивания, в котором слева от знака равенства будут указаны имя и свойство объекта (разделенные точкой), а справа ─ новое значение.

Синтаксис вызова: Объект.Свойство

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

Пример 1: переименование Лист1 на Счета:

Sheets(“Лист1”).Name =”Счета”

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

Аргументы

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

Предоставляется два способа передачи аргументов методу:

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

Пример: ActiveCell.BorderAround LineStyle. Weight. ColorIndex. Color

Действие метода BorderAround объекта Range задает новые атрибуты рамки вокруг указанной области. При его использовании требуется задать аргументы для определения стиля линии, ее толщины и цвета. Причем свойство ColorIndex позволяет определить цвет с помощью числа, а свойство Color ─ с помощью константы VisualBasic.

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

Пример: Range(“A1:C7”).Border Around Color Index:=3, Weight:=xlThick

Тип аргументов:

– обязательные аргументы (для редактирования параметров ЭТ)

– необязательные аргументы (Для редактирования объектов (изменение цвета, размера, рамки))

6.2. Структура, используемая в VBA

На высшем уровне иерархии стоит приложение, далее идут проекты, связанные с фактическими документами этого приложения. На третьем уровне находятся модули (модули приложения, модули пользователя, модули класса, модули форм и модули ссылок), а на последнем – их процедуры и функции.

Иерархия, используемая в VBA, представлена на рис. 6.1.

Рис. 6.1. Иерархия, используемая в VBA

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

Процедурой называется фрагмент кода (минимальная семантически законченная программная конструкция), заключенный между операторами Sub и End Sub.

Синтаксис определения процедуры:

Sub имя_процедуры(аргумент_1, аргумент_2,_, аргумент_n)

оператор VBA

оператор VBA

оператор VBA

Private – задает область видимости для процедуры – модуль, в котором она описана. Ее могут вызывать только процедуры этого же модуля

Public – процедура становится доступной для всех модулей (устанавливается по умолчанию)

Friend – процедура видима только в том проекте, где описан класс, членом которого она является.

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

На рис. 6.2 представлен интерфейс VBA.

Рис. 6.2. Интерфейс VBA

6.3. Типы данных, используемые в VBA

6.3.1. Переменные

Переменная – это поименованная область памяти, используемая для хранения данных в течение работы процедуры.

Для использования переменной ее необходимо описать (объявить).

Синтаксис оператора описания переменной:

Dim переменная

Dim – ключевое слово, свидетельствующая о том, что объявляется переменная (dimension – размер);

Переменная – имя объявляемой переменной;

As – ключевое слово, используемое при задании типа данных (as – как);

Тип – тип данных для объявляемой переменной

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

Dim i As Byte, j As Integer, k As Integer

В таблице 6.1. представлены основные типы данных, используемые для задания переменных.

Таблица 6.1. Типы данных

Тип данных

Значения переменной

Boolean (логический)

логические переменные, принимающие одно из двух значений: Истина или Ложь

Byte (короткий целый беззнаковый)

целое число из диапазона от 0 до 255

Integer (целый)

целые числа из диапазона от -32 768 до 32 767

Long (длинный целый)

целые числа из диапазона от -2 147 483 648 до 2 147 483 647

Currency (денежный)

переменные для денежных вычислений с фиксированным количеством разрядов после десятичной запятой; позволяют избежать накопления погрешностей при округлении

Date (дата)

переменные для хранения даты и времени

Single (с плавающей точкой одинарной точности)

числа с дробной частью от -3,40282310 38 до -1,40129810 -45

для отрицательных чисел и от 1,40129810 -45 до 3,40282310 38 для положительных чисел

Double (с плавающей точкой двойной точности)

числа с дробной частью от -1,7976931348623110 308 до -4,9406564584124710 -324

для отрицательных чисел и от 4,9406564584124710 -324 до 1,7976931348623110 308 для положительных чисел

String (строковой переменной длины)

переменные для хранения строк символов длиной от 0 до 64 Кбайт

Variant (универсальный)

Автоматическое подстраивание под данные

Object (объект)

переменные для хранения ссылок на объекты

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

Пример: Dim i, j As Integer

Это эквивалентно следующей записи: Dim i As Variant, j As Integer

Для записи одинакового формата необходимо:

Dim i As Integer, j As Integer

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

Области видимости переменной – это область программ, где имя переменной считается допустимым (видимым), а, следовательно, возможен доступ к ее значению (рис. 6.3).

Рис. 6.3. Области видимости переменной VBA

Существуют три уровня видимости переменной и пять способов ее объявления.

1Ур. – Процедура (областью видимости является процедура, в которой переменная объявлена).

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

*** Static (аналогичен Dim) – но! объявляет статическую переменную. После выхода из процедуры память не освобождается и значение не теряется.

2 Ур. – Модуль

*** оператор Private объявляет переменную в разделе описаний Declaration (вне процедур модуля)

*** оператор Dim (в данном случае) полностью аналогичен оператору Private

3 Ур. – Приложение

*** оператор Public объявляет переменную в разделе описаний Declaration

6.3.2. Константы

Разделяются на пользовательские и встроенные.

Пользовательские константы требуют объявления. Для этого используется оператор вида:

Const константа = значение

Const – ключевое слово, которое показывает, что объявляется константа;

As – ключевое слово, с которого начинается задание типа данных;

Константа – имя объявляемой константы;

Тип – тип данных для константы;

Значение – значение, присваиваемое константе.

Const pi As Double = 3.141592654

Const e As Double = 2.718281828

Const Message = “Завершение работы”

Можно объявлять несколько констант через запятую:

Const min = 0, max = 1000

Встроенные константы не требуют объявления. Имена встроенных констант начинаются с префикса vb, например, vbFriday.

6.4. Использование стандартных окон операционной системы Windows

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

Для ввода пользователем информации в код программы и вывод данных из него, а также для создания пользовательских диалоговых окон используются функции MsgBox и InputBox.

6.4.1. Функция MsgBox

MsgBox (“сообщение”, [кнопки, заголовок]) - эта функция отображает диалоговое окно, содержащее сообщение длиной до 1024 символов, в которое с помощью операции конкатенации можно включить значение переменных, а также (необязательно) кнопки для реакции на отображения окна (по умолчанию только кнопка ОК).

При задании сложного диалогового окна, при помощи функции MsgBox используются следующие константы:

1) Для задания внешнего вида окна сообщения (рис. 6.4):

vbCritical, vbQuestion, vbExclamation, vbInformation.

Рис. 6.4. Внешний вид окон

2) Для задания кнопок в окне сообщения:

vbOkCancel, vbAbortRetryIgnore, vbYesNOCancel, vbYesNO, vbRetryCancel.

3) Для задания дальнейших действий после нажатия на соответствующую кнопку:

vbOk, vbCancel, vbAbort, vbRetry, vbIgnore, vbYes, vbNO.

Пример процедуры 1:

Private Sub Пример_1()

y = MsgBox("Закрыть окно", vbQuestion + vbYesNoCancel, "Сообщение Windows")

Код процедуры 1 в VBA и результат выполнения программы представлен на рис. 6.5.

Рис. 6.5. Пример процедуры 1

Пример процедуры 2:

Sub Привет()

y = MsgBox("Закрыть окно", vbQuestion + vbYesNoCancel, "Сообщение Windows")

If y = vbYes Then MsgBox ("VVVVVVVVVVVVVVVVVVVV") Else

If y = vbNo Then ActiveCell = "Привет"

Код процедуры 2 в VBA и результат выполнения программы представлен на рис. 6.6.

Рис. 6.6. Пример процедуры 2

6.4.2. Функция InputBox

InputBox (“сообщение”[, заголовок] [, значение по умолчанию] [, координата x] [, координата y]) - функция, применяемая для ввода значений переменных в программу. Эта функция отображает диалоговое окно, содержащее окно ввода, кнопки ОК и Отмена, сообщение (подсказку для ввода) и (необязательно) заголовок окна, значение, вводимое по умолчанию, координаты окна по горизонтали и вертикали.

Так ввод числа можно задать командой:

a = InputBox ("первое число")

Рис. 6.7. Вид функции InputBox

6.4.3. Совместное использование функций MsgBox и InputBox

На практике для создания процедур функции MsgBox и InputBox используются совместно. Кроме того, в дополнение к ним может использоваться условный оператор If, который позволяет проверять введенные пользователем условия и на основе его выводов выдавать результат.

Условный оператор If - это оператор позволяющий задавать выполнение тех или иных действий в зависимости от заданных условий. Основными составляющими для этого служат:

1) if (если)

2) then (тогда)

3) else (иначе)

Так выражение - если a>1 то b= a+1 иначе b=a-1 будет иметь вид

If a>1 then b= a+1 else b=a-1.

Пример процедуры 3:

Компьютер должен перемножить два числа, результат вывести в одну из ячеек таблицы. Если их произведение больше 2000, то компьютер должен выдать дополнительное сообщение "Полученное значение больше 2000".

Sub пример_2()

Dim a, b, y As Long

a = InputBox("первое число")

b = InputBox("второе число")

If y < 2000 Then Range("A4") = y Else MsgBox ("Полученное значение больше 2000")

Код процедуры 3 в VBA и результат выполнения программы с разными условиями представлен на рис. 6.8.



Рис. 6.8. Пример процедуры 3

Рассмотрим программу, которая включает в себя сложную функцию MsgBox и оператор If.

Пример процедуры 4:

Вводятся два произвольных числа. Затем задаётся вопрос “Вы уверены что хотите их перемножить?” и варианты ответов: “да”, “нет”. Если ответ “да” - то числа перемножаются, и выдается сообщение с результатом, иначе действие не производится.

Sub Пример()

Dim a, b, d As Double

a = InputBox("первое число")

b = InputBox("второе число")

y = MsgBox("Вы уверены, что хотите их перемножить? ", vbCritical + vbYesNo, "Вопрос")

If y = vbYes Then d = a * b Else MsgBox ("Действие отменено")

If y = vbYes Then MsgBox (d)

Код процедуры 3 в VBA и результат выполнения программы с разными условиями представлен на рис. 6.9.



Рис. 6.9. Пример процедуры 4

6.5. Управляющие конструкции VBA

Управляющие конструкции языка программирования – это инструкции и группы инструкций, применение которых позволяет изменять по мере необходимости последовательность выполнения других инструкций программы. Данные конструкции подразделяются на ветвления и циклы. Ветвлением называется управляющая конструкция, позволяющая пропускать при выполнении те или иные группы инструкций в зависимости от значения условия. Цикл – это управляющая конструкция, представляющая возможность многократно выполнять группы инструкций до наступления какого-либо события.

6.5.1. Ветвление

Конструкция If…Then

Конструкция If…Then дает VBA указание принять простейшее из решений: если условие, идущие после оператора If, истинно, нужно выполнить следующие за ними оператор (или операторы); если же условие ложно, нужно перейти к строке, расположенной непосредственно за условной конструкцией. Однострочная конструкция:

If условие Then оператор[ы]

При использовании нескольких операторов (блок If):

If условие Then

оператор

[операторы]

Пример однострочной конструкции:

Age = InputBox("укажите свой возраст.", "Возраст")

If Age < 21 Then MsgBox "Вы не можете покупать алкогольные напитки.", "несовершеннолетний"

Рис. 6.10 Пример конструкции If then

Конструкция If…Then…Else

С помощью данной конструкции можно выбрать одно направление деятельности, если условие истинно, и другое – если оно ложно. Например, можно использовать для работы с окнами, содержащими две кнопки.

Синтаксис конструкции:

If условие Then

операторы_1

операторы_2

Если условие истинно, VBA выполняет первую группу операторов – операторы_1, если же оно ложно, осуществляется переход к строке Else, а затем выполняется вторая группа операторов – оператор_2.

Sub vozrast()

Age = InputBox("укажите свой возраст.", "Возраст")

If Age < 21 Then

MsgBox "Вы не можете покупать алкогольные напитки.", "несовершеннолетний"

Vkus = InputBox("что Вы хотите приобрести?", "Вкус")

Рис. 6.11. Пример конструкции If Then Else

Конструкция If…Then…ElseIf…Else

С помощью данной конструкции можно выбрать одно из нескольких направлений действий. Можно использовать любое количество строк с ElseIf в зависимости от сложности программы.

Синтаксис конструкции:

If условие_1 Then

операторы_1

ElseIf условие_2 Then

операторы_2

ElseIf условие_3 Then

операторы_3

операторы_4

Целесообразно использовать данную конструкцию с числом операторов ElseIf не больше 5. В этом случае лучше использовать конструкцию Select Case.

Конструкция Select Case

Вместо нескольких операторов ElseIf можно применить конструкцию Select Case для более сжатого вида программы.

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

Повторяемое выражение сравнивается с выражениями, находящимися после Case. Если они совпадают, то выполняется соответствующий оператор, иначе проверяются другие выражения. В случае несовпадения ни одного из выражений, выполняются операторы, следующие за Case Else.

Синтаксис конструкции:

Select Case повторяемое_выражение

Case выражение_1

операторы_1

Case выражение_2

операторы_2

операторы

6.5.2. Циклы

Существует три типа циклов: с управляющим условием, со счетчиком и циклы по структуре данных.

В циклах с управляющим условием оператор или группа операторов повторяется, пока условие не будет выполнено. Такие циклы называются циклами Do.

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

В циклах со счетчиком используется специальная переменная – счетчик , значение которой при каждом повторении тела цикла увеличивается или уменьшается на заданную величину – шаг цикла . Цикл завершается после того, как значение счетчика достигнет (или превысит) конечное значение счетчика цикла.

Синтаксис:

For счетчик = начальное_значение To конечное_значение Step шаг_цикла

<тело цикла>

Next счетчик

Пример вычисления суммы значений, содержащихся в нечетных ячейках первого столбца первого листа (в пределах первых 10 ячеек):

Dim I As Integer

S= 0

For I = 1 To 10 Step 2

S = S + Application.Worksheets(1).Cells(I, 1).Value

Рис. 6.12. Пример цикла 1

В циклах по структуре данных тело цикла поочередно повторяется для всех однородных объектов, составляющих массив или семейство. В этом случае в роли счетчика выступает объектная переменная.

Синтаксис:

For Each элемент In структура_данных

<тело цикла>

Next элемент

Пример последовательного вывода на экран окон сообщений с именами всех рабочих листов текущей книги:

Dim S As Worksheet

For Each S In Application.Worksheets

Рис. 6.13. Пример цикла 2

6.6. Использование элементов управления для запуска макроса и ввода данных

Для использования элементов управления на рабочем листе необходимо для каждого из элементов написать код в VBA. Для этого предварительно необходимо перейти в режим конструктора. Также в этом режиме изменяются свойства объекта в окне Properties.

Для записи программного кода элемента управления необходимо дважды щелкнуть мышью на этом элементе (рис. 6.14 а) и он автоматически перейдет в режим VBA и сформирует «операторные скобки» с учетом события пользовательской формы (рис. 6.14 б).

Рис. 6.14. Формирование операторных скобок элемента управления

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

Событие - это сигнал, подаваемый, если с объектом что-то происходит. Например, кнопка может генерировать событие в ответ на щелчок мышкой по ней, строка ввода – в ответ на ввод чего-то, на щелчок мыши по ней, и т.д.

Рис. 6.15 События пользовательской формы

Некоторые виды событий:

    События мыши - одинарное (двойное) щелканье левой кнопкой мыши на объекте; нажатие (отпускание) кнопки мыши; передвижение курсора мыши по элементу управления.

    События клавиатуры - нажатие простого символа, функциональных клавиш или какого-то сочетания символов на клавиатуре.

    События формы - загрузка (Load), выгрузка (Unload) формы и пр.

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

Формат процедуры-обработчика события

Private Sub Form_Click()

Private Sub object_Click()

где object – имя объекта, к которому относится этот обработчик.

Пример:

Private Sub Form_Click()

MsgBox “Click”

Рис. 6.17. Пример создания кнопки

Написание кода программы для ЭУ

Программирование элемента управления происходит по тем же принципам, что программирование макроса.

Программирование кнопки :

Пример 1 : Написание Привет после нажатия кнопки:

Private Sub Кнопка_Click()

MsgBox "Привет:)"

Рис. 6.18. Пример 1 создания элемента управления

Пример 2: Проверка условий: пересчет таблицы

Рис. 6.19. Исходная таблица

Создаем кнопку (рис. 6.20)

Рис. 6.20. Создание кнопки для реализации примера 2

Двойной щелчок переводит в окно создания процедуры (рис. 6.21):

Рис. 6.21. Окно создания процедуры

Создаем код:

Private Sub sum_Click()

Dim I As Integer

For I = 2 To 8 Step 1

N = Cells(I, 2) * Cells(I, 3)

S = S + Cells(I, 4).Value

Cells(I + 2, 4) = S

Где Cells(I, 4) – номер ячейки, где I – строка, 4 – столбец (D).

Код рассматриваемого примера в VBA и результат выполнения программы с разными условиями представлен на рис. 6.22.




Рис. 6.22. Реализация рассматриваемого примера

6.7. Пользовательские формы, создаваемые в VBA

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

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

Формы являются объектами, которые могут вызываться другими модулями приложения.

К формам можно добавлять пользовательские методы и свойства. Для создания в форме нового метода надо добавить процедуру, объявленную со словом Public:

Public Sub UserMethod()

операторы

Стили интерфейса:

1) однодокументный (SDI) – можно открыть только один документ, при этом нужно закрыть активный документ, чтобы открыть другой;

2) многодокументный (MDI) – поддерживает несколько форм внутри основной формы-контейнера; имеет в меню Window элементы для переключения между окнами или документами;

3) стиль explorer – окно, имеющее две панели, или области, обычно, состоящие из иерархического представления уровней информации слева и области отображения справа.

Этапы создания формы:

1. На форму помещаются нужные элементы управления и красиво размещаются.

Результат: имеем форму с элементами управления, но надписи на них стандартные: Command1, Label1, и т.д.

2. Задаются свойства формы и элементов управления

Результат: форма имеет нужный вид, на всех ЭУ понятные надписи, нужные картинки и т.д. Запуск ее невозможен в связи отсутствия кода программы.

3. Пишутся обработчики событий элементов управления.

Результат: выполнение действий в соответствии с заданием.

Д
ля вставки пользовательской формы необходимоInsert (Вставка) – UserForm (Пользовательская форма).

При отсутствии окна свойства его можно открыть, выполнив: View (Вид) Properties Window (Окно свойств).

Рис. 6.23. Интерфейс создания формы

Пример 1: Создать форму для расчета функции
, содержащую:

    место для вывода (из программы) результата расчета;

    текстовое поле для ввода исходных данных;

    кнопку для запуска программы и отмены.

После задания вида формы (рис. 6.24) следует задание кода программы.

Рис. 6.24. Создание формы для примера 1

Двойной щелчок по кнопке «Вычислить» переведет форму в редактирование кода.

Private Sub Calc_Click()

1: a = TextBox_a.Value

2: b = TextBox_b.Value

3: c = Sqr(a ^ 2 + b ^ 2)

4: Label1.Caption = "c = " & Str(c)

Private Sub Cancel_Click()

Рис. 6.25. Иллюстрация работы формы примера 1

Пользовательская форма может быть выведена из любого модуля. Для ее вывода используется метод Show. Name.Show

Private Sub VSch_Click()

Рис. 6.26. Использование метода Show

Пример 2. Создание формы для ввода пользователем переменных и управляющих выключателей с суммированием и вычитанием с отображение результата.


Рис. 6.27. Создание формы и ее код в VBA для примера 2

Private Sub CommandButton1_Click()

Dim first As Long, second As Long

first = tb1.Value

second = tb2.Value

"Если выбрана первая кнопка, складываем переменные

If ob1.Value = True Then

lab4.Caption = first + second

"Если выбрана вторая кнопка, вычитаем переменные

If ob2.Value = True Then

lab4.Caption = first - second


Рис. 6.28. Иллюстрация работы формы примера 2

Пример 3. Создание формы для ввода пользователем данных и вывода их в строки таблицы



Рис. 6.29. Создание формы для примера 3

Private Sub CB_Cancel_Click()

Private Sub CB_ok_Click()

Dim LastRow As Long

LastRow = Worksheets("Лист3").Range("A65536").End(xlUp).Row + 1

Cells(LastRow, 1).Value = tb1.Value

Cells(LastRow, 2).Value = tb2.Value

Cells(LastRow, 3).Value = tb3.Value


Рис. 6.30. Иллюстрация работы формы примера 3

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

    Что такое VBA?

    Что такое объекты, методы и свойства в VBA ?

    Опишите иерархию в вVBA?

    Что такое процедура?

    Что такое элемент управления?

    Опишите синтаксис переменной?

    Какие типы констант используются в VBA?

    Для чего используются функция MsgBox и InputBox?

    Какие управляющие конструкции используются в VBA?

    Что такое событие пользовательской формы?

    Что такое пользовательская форма?

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

Глоссарий

VBA (Visual Basic for Applications) - это объектно-ориентированный язык макропрограммирования высокого уровня, встроенный во все программы пакета Microsoft Office.

Макрос (или макрокоманда) - последовательность команд и функций, записанных в модуле VBA, позволяющая автоматизировать выполнение основных операций.

Элемент управления - размещаемые на рабочих листах и в диалоговых окнах объекты, предназначенные для отображения, ввода и вычисления данных.

Режим конструктора переводит Excel в режим отключения всех элементов управления на рабочем листе.

Объектом считается любой элемент приложения ─ ячейка, лист, рабочая книга, диаграмма. Объекты могут включать области ячеек, рамки ячеек, окна, сценарии, стили и т.д. Каждый класс объектов имеет свое множество свойств, функций и событий

Метод ─ это действие, которое может быть выполнено над объектом.

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

Событие – взаимодействие пользователя с определенным объектом на рабочем листе.

Модуль – это часть программы, оформленная в таком виде, при котором допускается ее независимая трансляция.

Процедурой называется фрагмент кода (минимальная семантически законченная программная конструкция), заключенный между операторами Sub и End Sub.

Переменная – это поименованная область памяти, используемая для хранения данных в течение работы процедуры

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

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

InputBox - функция, применяемая для ввода значений переменных в программу.

Оператор If - это оператор позволяющий задавать выполнение тех или иных действий в зависимости от заданных условий.

Управляющие конструкции языка программирования – это инструкции и группы инструкций, применение которых позволяет изменять по мере необходимости последовательность выполнения других инструкций программы

Ветвлением называется управляющая конструкция, позволяющая пропускать при выполнении те или иные группы инструкций в зависимости от значения условия.

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

Событие элемента управления - это сигнал, подаваемый, если с объектом что-то происходит.

7. Обмен данными в Электронной таблице

Подробнее о том, что можно сделать в VBA

Выше, в разделе Зачем мучиться с VBA?, я уже упоминал о том, как с помощью VBA можно усовершенствовать имеющиеся приложения. Пришло время обсудить это подробнее, чтобы вам стало ясно, наконец, что же все-таки можно получить от VBA.

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

Настройка пользовательского интерфейса

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

(На всякий случай замечу, что пользовательский интерфейс означает то, как программа выглядит на экране, как в ней работают мышь, клавиатура и другие всевозможные средства, предоставленные программой вам, пользователю, для взаимодействия с программным обеспечением.) Во многих приложениях VBA позволяет изменять элементы пользовательского интерфейса так, как это удобно. С помощью всего нескольких строчек программного кода вы можете добавлять, удалять или изменять взаимное расположение кнопок на панелях инструментов, создавать новые панели инструментов, переопределять раскладку клавиатуры или модифицировать структуру меню. На рис. 1.1 показано окно Microsoft Word с любезно измененным VBA пользовательским интерфейсом.

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

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

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

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

До сих пор я говорил об изменении пользовательского интерфейса VBA приложения, но не о создании пользовательского интерфейса самой VBA программы. Хотя многие VBA-программы и представляют собой автоматы, выполняющие работу безо всякого вмешательства с вашей стороны, неизбежно наступит момент, когда вам понадобится создавать свои диалоговые и другие окна (для них в VBA используется обобщающий термин формы).

Из книги Давайте создадим компилятор! автора Креншоу Джек

Из книги Разгони свой сайт автора Мациевский Николай

Рассматриваем подробнее Рис. 3.1. Диаграмма работы pre-check и post-checkКогда к браузеру поступает запрос на открытие ресурса, который находится в кэше, и при этом кэш содержит расширения Cache-Control (отправленные с сервера как часть заголовка HTTP-ответа), тогда IE использует эти

Из книги Win2K FAQ (v. 6.0) автора Шашков Алексей

(1.13) Можно ли из W2kPro сделать W2kServer, и зачем это надо? Можно. Хотя и нельзя:-) Для этого служит программка под названием NTSwitch. Всё что она делает, это сохраняет копию вашего реестра, редактирует его, и восстанавливает его обратно. Благодаря тому, что различные версии

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

(5.4) В 1С Бухгалтерия 6 вместо русских букв показываются закорючки, что можно с этим сделать? Это происходит потому, что Microsoft заменил название шрифта MS SANS SERIF на MICROSOFT SANS SERIF, в результате чего 1С Бухгалтерия не может его найти. Для решения проблемы достаточно поменять

Из книги Добавьте в корзину. Ключевые принципы повышения конверсии веб-сайтов автора Айзенберг Джеффри

Из книги AutoCAD 2009. Учебный курс автора Соколова Татьяна Юрьевна

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

Из книги AutoCAD 2008 для студента: популярный самоучитель автора Соколова Татьяна Юрьевна

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

Из книги Раскрутка: секреты эффективного продвижения сайтов автора Евдокимов Николай Семенович

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

Из книги Графика DirectX в Delphi автора Краснов Михаил

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

Из книги Цифровой журнал «Компьютерра» № 197 автора Журнал «Компьютерра»

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

Три вывода, которые можно сделать после обсуждения причин различий между людьми по цвету их кожи Дмитрий Шабанов Опубликовано 31 октября 2013 Две общем-топредыдущие колонки были посвящены анализу одного, в, весьма простого признака человека -

Из книги C++ для начинающих автора Липпман Стенли

4.1.4. Подробнее об идентификаторах потоков Иногда в программе возникает необходимость определить, какой поток выполняет ее в данный момент. Функция pthread_self() возвращает идентификатор потока, в котором она вызвана. Для сравнения двух разных идентификаторов предназначена

Из книги Как тестируют в Google автора Уиттакер Джеймс

9.3.1. Подробнее о точном соответствии Самый простой случай возникает тогда, когда типы фактических аргументов совпадают с типами формальных параметров. Например, есть две показанные ниже перегруженные функции max(). Тогда каждый из вызовов max() точно соответствует одному

Из книги автора

Из книги автора

Из книги автора

Немного подробнее о Buganizer Самый старый баг, зарегистрированный в Google, создан 18 мая 2001 года в 15:33 и существует до сих пор. Он называется «Test Bug», а его описание выглядит как «First Bug!». Смешно, что этот баг до сих пор случайно всплывает, когда разработчики привязывают

Написание кода Ваших процедур и редактирование макросов производится в редакторе Visual Basic, который доступен с вкладки «Разработчик». Данная вкладка по умолчанию скрыта. Для ее отображения необходимо выполнить следующие действия:

Для Excel 2007 . Зайдите в параметры Excel, используя кнопку Office, и в «основных параметрах работы с Excel» установите галочку на пункте «Показывать вкладку Разработчик на ленте».

Для Excel 2010 и 2013 . В параметрах Excel нужно выбрать пункт «Настроить ленту» и в категории основные вкладки установить галочку для вкладки «Разработчик».

Знакомство с редактором Visual Basic в Excel

Чтобы попасть в редактор кода, кликните на вкладке разработчика в области «Код» по кнопке «Visual Basic».

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

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

№3 на изображении . Окно управления проектами VBA открытых книг (Project Explorer) и кнопка, отображающая это окно.

№4 на изображении . Кнопка, отображающая окно свойств объектов (Properties Window), выбранных в окне №3, и элементов пользовательских форм (работа с объектами, их свойствами и методами будет рассмотрена в отдельной статье этой категории).

№5 на изображении . Кнопка вызова окна объектов (Object Browser). В нем описаны все доступные для работы объекты, их свойства и методы.

Кнопки №3, №4 и №5 так же доступны на вкладке «View» главного меню редактора. Там же можно вызвать другие полезные для работы окна, которые не будут рассмотрены в этом материале.

Написание простой процедуры на Visual Basic for Application

Код любой процедуры (подпрограммы) располагается в модуле, поэтому необходимо его добавить, чтобы приступить к программированию. Выберите пункт «Module» на вкладке «Insert» основного меню редактора VBA. В основной области редактора (на изображении имеет серый фон) должно появиться новое окно кода – Имя_книги – имя_модуля (Code), а в окне управления проектами (№3) к дереву выбранного проекта добавится вновь созданный модуль.

Добавьте в модуль следующий код:

Sub Моя_процедура() MsgBox "Привет пользователь!" End Sub

Данная процедура выводит на экран диалоговое окно с сообщением «Привет пользователь!». Протестируйте ее работу, нажав кнопку Rub Sub (№2 на изображении) или вызвав как обычный макрос.

Теперь более подробно разберем приведенный код.

Любая процедура начинается со строки объявления, состоящей из оператора Sub (сокращение от Subprogram), после которого следует имя подпрограммы. За именем следует перечень аргументов, заключенный в скобки.

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

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

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

Последняя строка содержит оператор End с последующим ключевым словом Sub и сообщает о завершении процедуры.

Учимся пользоваться Object Browser

Выше была упомянута функция MsgBox , но ее возможности полностью не рассмотрены. Это хороший случай, чтобы научиться использовать браузер объектов (№5 на изображении окна редактора VBA).

Нажмите кнопку на панели или клавишу F2, чтобы отобразить Object Browser:

Выпадающий список №1 содержит перечень всех подключенных библиотек. Используйте его только в том случае, если точно знаете, к какой библиотеке относится изучаемый класс, функция и т.д. (подключить или отключить любую из доступных библиотек можно, выбрав пункт «References» на вкладке «Tools» главного меню редактора VBA).

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

Поле №2 предназначено для поиска свойств, методов, классов подключенных библиотек.

Результаты поиска отображаются в поле №3 и представляют из себя таблицу с тремя столбцами: библиотека, класс и член класса.

Поле №4 содержит перечень всех классов, выбранных в поле №1 библиотек.

В области №5 содержится список всех членов класса, выбранного в поле №4.

Поле №6 содержит краткую справку о выделенном результате поиска, классе или члене класса.

Примечание: библиотеки, классы, функции и процедуры (методы), свойства и т.п. в Object Browser имеют различные обозначения, представленные набором пиктограмм. Краткая справка (поле №6) всегда указывает какой тип элемента выделен. Обращайте на это внимание, чтобы в дальнейшем лучше ориентироваться в работе с объектами.

Примечание: Понятие объекта не относится к теме данной статьи и будет рассмотрено в следующих материалах.

Теперь найдем функцию MsgBox с помощью браузера объектов. В поле поиска (№2) впишите ее название и кликните по кнопке с изображением бинокля. В поле результатов поиска выделите строку со значением MsgBox в столбце «Member». В поле №6 появилась краткая информация, сообщающая нам, что выбранный член является функцией, имеет перечень аргументов, возвращает результат типа VbMsgBoxResult, относиться в классу Interaction библиотеки VBA.

Для получения полной справки кликните по кнопке с изображением вопросительного знака. В зависимости от версии Excel, Вас перенаправить на файл справки или сайт с документацией от Microsoft.

Изучите самостоятельно возможности функции MsgBox.

Ссылка на процедуру VBA

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

Для лучшего понимая рассмотрим пример (в примере используется псевдокод):

Начало_Процедуры Любой код Первая строка дублирующего кода Любой код Последняя строка дублирующего кода Любой код Первая строка дублирующего кода Любой код Последняя строка дублирующего кода Любой код Конец_Процедуру

Выносите дублирующие участки кода в отдельные процедуры и указывайте ссылки на них из главной процедуры:

Начало_Главной_Процедуры Любой код Ссылка на Процедуру_дублирующегося_кода Любой код Ссылка на Процедуру_дублирующегося_кода Любой код Конец_Главной_Процедуру Начало_Процедуры_дублирующегося_кода Любой код Конец_Процедуры_дублирующегося_кода

Call Макрос1 "Следующая строка идентична предыдущей Макрос1

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

У Вас недостаточно прав для комментирования.