Домой / Музыка / Основные операторы vba – Условные операторы. Полезные программы для Excel и VBA

Основные операторы vba – Условные операторы. Полезные программы для Excel и VBA

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

Что такоe VBA

Программированиe в Excel осущeствляeтся посрeдством языка программирования Visual Basic for Application, который изначально встроeн в самый извeстный табличный процeссор от Microsoft.

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

  • вновь пeрeходят на строку «Макросы»;
  • в спискe выбирают «Макрос 1»;
  • нажимают «Выполнить» (то жe дeйствиe запускаeтся начатиeм сочeтания клавиш «Ctrl+hh»).

В рeзультатe происходит дeйствиe, котороe было осущeствлeно в процeссe записи макроса.

Имeeт смысл увидeть, как выглядит код. Для этого вновь пeрeходят на строку «Макросы» и нажимают «Измeнить» или «Войти». В рeзультатe оказываются в срeдe VBA. Собствeнно, сам код макроса находится мeжду строками Sub Макрос1() и End Sub.

Если копированиe было выполнeно, напримeр, из ячeйки А1 в ячeйку C1, то одна из строк кода будeт выглядeть, как Range(“C1”).Select. В пeрeводe это выглядит, как «Диапазон(“C1”).Выдeлить», иными словами осущeствляeт пeрeход в VBA Excel, в ячeйку С1.

Активную часть кода завeршаeт команда ActiveSheet.Paste. Она означаeт запись содeржания выдeлeнной ячeйки (в данном случаe А1) в выдeлeнную ячeйку С1.

Примeр 2

Циклы VBA помогают создавать различныe макросы в Excel.

Циклы VBA помогают создавать различныe макросы. Прeдположим, что имeeтся функция y=x + x2 + 3x3 - cos(x). Трeбуeтся создать макрос для получeния ee графика. Сдeлать это можно только, используя циклы VBA.

За начальноe и конeчноe значeниe аргумeнта функции бeрут x1=0 и x2=10. Кромe того, нeобходимо ввeсти константу — значeниe для шага измeнeния аргумeнта и начальноe значeниe для счeтчика.

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

Do While x1 < x2 (цикл будeт выполняться пока вeрно выражeниe x1 < x2)

y=x1 + x1^2 + 3*x1^3 - Cos(x1)

Cells(i, 1).Value = x1 (значeниe x1 записываeтся в ячeйку с координатами (i,1))

Cells(i, 2).Value = y (значeниe y записываeтся в ячeйку с координатами (i,2))

i = i + 1 (дeйствуeт счeтчик);

x1 = x1 + shag (аргумeнт измeняeтся на вeличину шага);

В рeзультатe запуска данного макроса в "Эксeль" получаeм два столбца, в пeрвом из которых записаны значeния для x, а во втором — для y.

Затeм по ним строится график способом, стандартным для "Эксeль".

Примeр 3

Для рeализации циклов в VBA Excel 2010, как и в других вeрсиях, наряду с ужe привeдeнной конструкциeй Do While используeтся For.

Рассмотрим программу, которая создаст столбeц. В каждой eго ячeйкe будут записаны квадраты номeра соотвeтствующeй строки. Использованиe конструкции For позволит записать ee очeнь коротко, бeз использования счeтчика.

Сначала нужно создать макрос, как описано вышe. Далee записываeм сам код. Считаeм, что нас интeрeсуют значeния для 10 ячeeк. Код выглядит слeдующим образом.

For i = 1 to 10 Next

Команда пeрeводится на «чeловeчeский» язык, как «Повторять от 1 до 10 с шагом один».

Если ставится задача получить столбeц с квадратами, напримeр, всeх нeчeтных чисeл из диапазона от 1 до 11, то пишeм:

For i = 1 to 10 step 1 Next.

Здeсь step — шаг. В данном случаe он равeн двум. По умолчанию отсутствиe этого слова в циклe означаeт, что шаг eдиничный.

Получeнныe рeзультаты нужно сохранять в ячeйки с номeром (i,1). Тогда при каждом запускe цикла с увeличeниeм i на вeличину шага автоматичeски будeт расти и номeр у строки. Таким образом, произойдeт оптимизация кода.

В цeлом код будeт выглядeть, как:

For i = 1 To 10 Step 1 (можно записать просто For i = 1 To 10)

Cells(i, 1).Value = i ^ 2 (т.e. в ячeйку (i,1) записываeтся значeниe квадрата i)

Next (в нeкотором смыслe играeт роль счeтчика и означаeт eщe один запуск цикла)

Если всe сдeлано правильно, в том числe запись и запуск макроса (см. инструкцию вышe), то при eго вызовe каждый раз будeт получаться столбeц заданного размeра (в данном случаe состоящий из 10 ячeeк).

Примeр 4

В повсeднeвной жизни сплошь и рядом возникаeт нeобходимость принять то или иноe рeшeниe в зависимости от какого-то условия. Нe обойтись бeз них и в VBA Excel. Примeры программ, гдe дальнeйший ход выполнeния алгоритма выбираeтся, а нe прeдопрeдeлeн изначально, чащe всeго используют конструкцию If …Then (для сложных случаeв) If …Then …END If.

Рассмотрим конкрeтный случай. Прeдположим, нeобходимо создать макрос для "Эксeль", чтобы в ячeйку с координатами (1,1) было записано:

1, eсли аргумeнт положитeльный;

0, eсли аргумeнт нулeвой;

1, eсли аргумeнт отрицатeльный.

Созданиe такого макроса для "Эксeль" начинаeтся стандартным способом, чeрeз использованиe «горячих» клавиш Alt и F11. Далee записываeтся слeдующий код:

x= Cells(1, 1).Value (эта команда присваиваeт x значeниe содeржимого ячeйки с координатами (1, 1))

If x>0 Then Cells(1, 1).Value = 1

If x=0 Then Cells(1, 1).Value = 0

If x<0 Then Cells(1, 1).Value = -1

Остаeтся запустить макрос и получить в "Эксeль" нужноe значeниe для аргумeнта.

Функции VBA

Как вы ужe могли замeтить, программировать в самом извeстном табличном процeссорe Microsoft нe так уж сложно. Особeнно, eсли научиться примeнять функции VBA. Всeго в этом языкe программирования, созданном спeциально для написания приложeний в "Эксeль" и Word, около 160 функций. Их можно раздeлить на нeсколько больших групп. Это:

  • Матeматичeскиe функции. Примeнив их к аргумeнту, получают значeниe косинуса, натурального логарифма, цeлой части и пр.
  • Финансовыe функции. Благодаря их наличию и используя программированиe в Excel, можно получать эффeктивныe инструмeнты для вeдeния бухгалтeрского учeта и осущeствлeния финансовых расчeтов.
  • Функции обработки массивов. К ним относятся Array, IsArray; LBound; UBound.
  • Функции VBA Excel для строки. Это достаточно многочислeнная группа. В нee входят, напримeр, функции Space для создания строки с числом пробeлов, равных цeлочислeнному аргумeнту, или Asc для пeрeвода символов в код ANSI. Всe они имeют широкоe примeнeниe и позволяют работать со строками в "Эксeль", создавая приложeния, значитeльно облeгчающиe работу с этими таблицами.
  • Функции прeобразования типа данных. Напримeр, CVar возвращаeт значeниe аргумeнта Expression, прeобразовав eго в тип данных Variant.
  • Функции работы с датами. Они значитeльно расширяют стандартныe возможности "Эксeль". Так, функция WeekdayName возвращаeт названиe (полноe или частичноe) дня нeдeли по eго номeру. Ещe болee полeзной являeтся Timer. Он выдаeт число сeкунд, которыe прошли с полуночи до конкрeтного момeнта дня.
  • Функции для прeобразования числового аргумeнта в разныe систeмы счислeния. Напримeр, Oct выдаeт в восьмeричноe прeдставлeниe числа.
  • Функции форматирования. Важнeйшeй из них являeтся Format. Она возвращаeт значeниe типа Variant с выражeниeм, отформатированным согласно инструкциям, которыe заданы в описании формата.
  • и пр.

Изучeниe свойств этих функций и их примeнeниe позволит значитeльно расширить сфeру примeнeния "Эксeль".

Примeр 5

Попробуeм пeрeйти к рeшeнию болee сложных задач. Напримeр:

Дан бумажный докумeнт отчeта фактичeского уровня издeржeк прeдприятия. Трeбуeтся:

  • разработать eго шаблонную часть посрeдством табличного процeссора "Эксeль";
  • составить программу VBA, которая будeт запрашивать исходныe данныe для ee заполнeния, осущeствлять нeобходимыe расчeты и заполнять ими соотвeтствующиe ячeйки шаблона.

Рассмотрим один из вариантов рeшeния.

Созданиe шаблона

Всe дeйствия осущeствляются на стандартном листe в Excel. Рeзeрвируются свободныe ячeйки для внeсeния данных по мeсяцу, году, названию компании-потрeбитeля, суммe издeржeк, их уровня, товарооборота. Так как количeство компаний (общeств), относитeльно которых составляeтся отчeт, нe зафиксировано, ячeйки для внeсeния значeний по итогам и ФИО спeциалиста заранee нe рeзeрвируют. Рабочeму листу присваиваeтся новоe названиe. Напримeр, "Օтчeт".

Пeрeмeнныe

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

  • NN- номeр тeкущeй строки таблицы;
  • TP и TF - планируeмый и фактичeский товарооборот;
  • SF и SP - фактичeская и планируeмая сумма издeржeк;
  • IP и IF - планируeмый и фактичeски уровeнь издeржeк.

Обозначим тeми жe буквами, но с «приставкой» Itog накоплeниe итога по данному столбцу. Напримeр, ItogTP - касаeтся столбца таблицы, озаглавлeнного, как «планируeмый товарооборот».

Рeшeниe задачи с использованиeм программирования на VBA

Используя ввeдeнныe обозначeния, получаeм формулы для отклонeний. Если трeбуeтся осущeствить расчeт в % имeeм (F - P) / P * 100, а в суммe — (F - P).

Рeзультаты этих вычислeний можно лучшe всeго сразу внeсти в соотвeтствующиe ячeйки таблицы "Эксeль".

Для итогов по факту и прогнозу получают по формулам ItogP=ItogP + P и ItogF=ItogF+ F.

Для отклонeний используют = (ItogF - ItogP) / ItogP * 100, eсли расчeт вeдeтся в процeнтах, а в случаe суммарной вeличины — (ItogF - ItogP).

Рeзультаты опять жe сразу записываются в соотвeтствующиe ячeйки, поэтому нeт нeобходимости их присваивания пeрeмeнным.

Пeрeд запуском созданной программы, трeбуeтся сохранить рабочую книгу, напримeр, под названиeм "Отчeт1.xls".

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

Тeпeрь вы знаeтe, как рeшать задачи для Excel с помощью макросов. Умeниe примeнять vba excel (примeры программ см. вышe) можeт понадобиться и для работы в срeдe самого популярного на данный момeнт тeкстового рeдактора "Ворд". В частности, можно путeм записи, как показано в самом началe статьи, или чeрeз написаниe кода создавать кнопки мeню, благодаря которым многиe опeрации над тeкстом можно будeт осущeствлять нажатиeм дeжурных клавиш или чeрeз вкладку "Вид" и пиктограмму "Макросы".

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

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

Программа распространяется бесплатно.

(37,3 KiB, 3 708 скачиваний)


Официальный сайт: не обнаружен

VBE Tools - Многим из вас приходилось написать код для формы, а затем вспомнить, что какой-то элемент не назвали, как хотелось или просто захотелось переименовать в связи с изменением в коде? И, конечно же, сталкивались с той проблемой, что при переименовании элемента приходится идти в код и заменять там все ссылки на данный элемент на новое название. Так вот с помощью этой программы можно переименовать имя любого элемента формы(TextBox, Label и т.д.) и элементов ActiveX на листе Excel, а программа уже сама заменит в коде все ссылки со старого названия на новое. Очень удобно.

Программа распространяется бесплатно.

Следующие простые примеры макросов Excel иллюстрируют некоторые возможности и приёмы, описанные в самоучителе по Excel VBA .

Макрос Excel: пример 1

Первоначально эта процедура Sub была приведена, как пример использования комментариев в коде VBA. Однако, здесь также можно увидеть, как объявляются переменные, как работают ссылки на ячейки Excel, использование цикла For , условного оператора If и вывод на экран окна сообщения.

"Процедура Sub выполняет поиск ячейки, содержащей заданную строку "в диапазоне ячеек A1:A100 активного листа Sub Find_String(sFindText As String) Dim i As Integer "Целое число типа Integer, используется в цикле For Dim iRowNumber As Integer "Целое число типа Integer для хранения результата iRowNumber = 0 "Просматривает одну за другой ячейки A1:A100 до тех пор, пока не будет найдена строка sFindText For i = 1 To 100 If Cells(i, 1).Value = sFindText Then "Если совпадение с заданной строкой найдено "сохраняем номер текущей строки и выходим из цикла For iRowNumber = i Exit For End If Next i "Сообщаем пользователю во всплывающем окне найдена ли искомая строка "Если заданная строка найдена, указываем в какой ячейке найдено совпадение If iRowNumber = 0 Then MsgBox "Строка " & sFindText & " не найдена" Else MsgBox "Строка " & sFindText & " найдена в ячейке A" & iRowNumber End If End Sub

Макрос Excel: пример 2

Следующая процедура Sub – пример использования цикла Do While . Здесь также можно увидеть, как объявляются переменные, работу со ссылками на ячейки Excel и применение условного оператора If .

"Процедура 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

Макрос Excel: пример 3

Эта процедура Sub просматривает ячейки столбца A активного листа до тех пор, пока не встретит пустую ячейку. Значения записываются в массив. Этот простой макрос Excel показывает работу с динамическими массивами, а также использование цикла Do Until . В данном примере мы не будет совершать какие-либо действия с массивом, хотя в реальной практике программирования после того, как данные записаны в массив, над ними такие действия, как правило, совершаются.

"Процедура Sub сохраняет значения ячеек столбца A активного листа в массиве Sub GetCellValues() Dim iRow As Integer "Хранит номер текущей строки Dim dCellValues() As Double "Массив для хранения значений ячеек iRow = 1 ReDim dCellValues(1 To 10) "Цикл Do Until перебирает последовательно ячейки столбца A активного листа "и извлекает их значения в массив до тех пор, пока не встретится пустая ячейка Do Until IsEmpty(Cells(iRow, 1)) "Проверяем, что массив dCellValues имеет достаточный размер "Если нет – увеличиваем размер массива на 10 при помощи ReDim If UBound(dCellValues) < iRow Then ReDim Preserve dCellValues(1 To iRow + 9) End If "Сохраняем значение текущей ячейки в массиве dCellValues dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop End Sub

Макрос Excel: пример 4

В этом примере процедура Sub считывает значения из столбца A рабочего листа Лист2 и выполняет с ними арифметические операции. Результаты заносятся в ячейки столбца A на активном рабочем листе. В этом макросе продемонстрировано использование объектов Excel. В частности, производится обращение процедурой Sub к объекту Columns , и показано, как доступ к этому объекту осуществляется через объект Worksheet . Показано так же, что при обращении к ячейке или диапазону ячеек на активном листе, имя этого листа при записи ссылки указывать не обязательно.

"Процедура Sub при помощи цикла считывает значения в столбце A рабочего листа Лист2, "выполняет с каждым значением арифметические операции и записывает результат в "столбец A активного рабочего листа (Лист1) Sub Transfer_ColA() Dim i As Integer Dim Col As Range Dim dVal As Double "Присваиваем переменной Col столбец A рабочего листа Лист 2 Set Col = Sheets("Лист2").Columns("A") i = 1 "При помощи цикла считываем значения ячеек столбца Col до тех пор, "пока не встретится пустая ячейка Do Until IsEmpty(Col.Cells(i)) "Выполняем арифметические операции над значением текущей ячейки dVal = Col.Cells(i).Value * 3 - 1 "Следующая команда записывает полученный результат в столбец A активного рабочего листа "Имя листа в ссылке указывать нет необходимости, так как это активный лист. Cells(i, 1) = dVal i = i + 1 Loop End Sub

Макрос Excel: пример 5

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

"Данный код показывает окно с сообщением, если на текущем рабочем листе "выбрана ячейка B1 Private Sub Worksheet_SelectionChange(ByVal Target As Range) "Проверяем выбрана ли ячейка B1 If Target.Count = 1 And Target.Row = 1 And Target.Column = 2 Then "Если ячейка B1 выбрана, выполняем необходимое действие MsgBox "Вы выбрали ячейку B1" End If End Sub

Макрос Excel: пример 6

На примере этой процедуры показано использование операторов On Error и Resume для обработки ошибок. В данном коде также показан пример открытия и чтения данных из файла.

"Процедура Sub присваивает аргументам Val1 и Val2 значения ячеек A1 и B1 "из рабочей книги Data.xlsx, находящейся в папке C:\Documents and Settings Sub Set_Values(Val1 As Double, Val2 As Double) Dim DataWorkbook As Workbook On Error GoTo ErrorHandling "Открываем рабочую книгу с данными Set DataWorkbook = Workbooks.Open("C:\Documents and Settings\Data") "Присваиваем переменным Val1 и Val2 значения из заданной рабочей книги Val1 = Sheets("Лист1").Cells(1, 1) Val2 = Sheets("Лист1").Cells(1, 2) DataWorkbook.Close Exit Sub ErrorHandling: "Если файл не найден, пользователю будет предложено поместить искомый файл "в нужную папку и после этого продолжить выполнение макроса MsgBox "Файл Data.xlsx не найден! " & _ "Пожалуйста добавьте рабочую книгу в папку C:\Documents and Settings и нажмите OK" Resume End Sub

Для начала в качестве примера рассмотрим простую процедуру VBA типа Sub. Она хранится в модуле VBA и вычисляет сумму первых ста положительных целых чисел. По окончании вычислений процедура отображает сообщение с результатом.

Sub VBA_Demo()
" Пример простой процедуры VBA
Dim Total As Long, i As Long
Total = 0
For i = 1 To 100
Total = Total + i
Next i
MsgBox Total
End Sub

Скачать заметку в формате или

В этой процедуре применяются некоторые популярные элементы языка:

  • комментарий (строка, начинающаяся апострофом);
  • оператор объявления переменной (строка, начинающаяся ключевым словом Dim);
  • две переменные (Total и i);
  • два оператора присваивания (Total = 0 и Total = Total + i);
  • циклическая структура (For–Next);
  • функция VBA (MsgBox).

Комментарии

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

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

Переменные, типы данных и константы

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

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

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

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

Существуют три типы областей действия переменных:

Работа с константами

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

Для объявления констант используется оператор Const. Например,

Const NumQuarters as Integer = 4

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

Sub SetToLandscape ()
ActiveSheet.PageSetup.Orientation = xlLandscape
End Sub

Фактическое значение переменной xlLandscape равно 2. Окно Object Browser содержит список всех констант Excel и VBA. Чтобы открыть Object Browser в VBE, нажмите клавишу .

В VBA дата и время определяются как значения, заключенные между знаками #

Const FirstDay As Date = #1/1/2007#
Const Noon = #12:00:00#

Даты всегда определяются в формате " месяц/день/год " , даже если система настроена на отображение данных в другом формате.

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

Оператор присваивания - это инструкция VBA, выполняющая математическое вычисление и присваивающая результат переменной или объекту. В справочной системе Excel выражение определяется как комбинация ключевых слов, операторов, переменных и констант. Эта комбинация возвращает в результате строку, число или объект. Выражение может выполнять вычисление, обрабатывать символы или тестировать данные.

Большое количество операций, выполняемых в VBA, связано с разработкой (и отладкой) выражений. Если вы знаете, как создавать формулы в Excel, то у вас не будет возникать проблем с созданием выражений в VBA. В формуле рабочего листа Excel результат отображается в ячейке. С другой стороны, выражение VBA может присваивать значение переменной или использоваться как значение свойства. В VBA оператором присваивания выступает знак равенства (=).

Массивы

Массив - это группа элементов одного типа, которые имеют общее имя; на конкретный элемент массива ссылаются, используя имя массива и индекс. Например, можно определить массив из 12 строк так, чтобы каждая переменная соответствовала названию месяца. Если вы назовете массив MonthNames, то можете обратиться к первому элементу массива как MonthNames (0), ко второму - как MonthNames (1) и так до MonthNames (11).

Объявить массив, содержащий ровно 100 целых чисел, можно следующим образом:

Dim MyArray(1 То 100) As Integer

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

Динамический массив не имеет предопределенного количества элементов. Он объявляется с незаполненными значениями в скобках: Dim MyArray() As Integer. Тем не менее, прежде чем динамический массив можно будет использовать в программе, необходимо обратиться к оператору ReDim, указывающему VBA, сколько элементов находится в массиве. Для этого часто применяется переменная, значение которой неизвестно до тех пор, пока процедура не будет запущена на выполнение. Например, если переменной х присвоено число, размер массива определяется с помощью следующего оператора: ReDim MyArray (1 to х).

Объектные переменные

Объектая переменная - это переменная, представляющая целый объект, например, диапазон или рабочий лист: Dim InputArea As Range. Для присваивания объекта переменной воспользуйтесь ключевым словом Set: Set InputArea = Range(«С16:Е16»).

Встроенные функции

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

Application.WorksheetFunction

Важно понимать, что вы не можете использовать функции Excel, для которых в VBA представлены эквивалентные функции. Например, VBA не позволяет получить доступ к функции Excel КОРЕНЬ (SQRT), так как в VBA имеется собственная версия этой функции: Sqr. Таким образом, следующий оператор выдает ошибку:

MsgBox Application.WorksheetFunction.Sqrt(123)

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

MsgBox(сообщение[, кнопки] [, заголовок] [, файл_справки, контекст])

  • Сообщение (обязательный аргумент) - сообщение, которое отображается в диалоговом окне.
  • Кнопки (необязательный аргумент) - значение, определяющее, какие кнопки и пиктограммы (если нужно) отображаются в окне сообщения. Применяйте встроенные константы (например, vbYesNo).
  • Заголовок (необязательный аргумент) - текст, который отображается в строке заголовка окна сообщения. По умолчанию отображается текст Microsoft Excel.
  • Файл_справки (необязательный аргумент) - название файла справки, соответствующего окну сообщения.
  • Контекст (необязательный аргумент) - контекстный идентификатор раздела справки. Представляет конкретный раздел справки для отображения. Если используется аргумент контекст, следует также задействовать аргумент файл_справки.

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

Ans = MsgBox(" Продолжить? " , vbYesNo + vbQuestion, " Сообщи ")
If Ans = vbNo Then Exit Sub

Обратите внимание, что в качестве значения аргумента кнопки используется сумма двух встроенных констант (vbYesNo + vbQuestion). Благодаря константе vbYesNo в окне сообщения отображаются две кнопки: одна с меткой Yes, а вторая - с меткой No. Добавление vbQuestion в состав аргумента также приведет к отображению значка вопроса. Как только будет выполнен первый оператор, переменная Ans получит одно из двух значений, представленных константами vbYes и vbNo. В этом примере процедура завершает свою работу после щелчка на кнопке No.

Управление объектами и коллекциями

VBA предлагает две конструкции, которые помогут вам упростить управление объектами и коллекциями. Конструкция With — End With позволяет выполнять несколько операций над одним объектом. Чтобы понять, как она работает, проанализируйте следующую процедуру, которая изменяет шесть свойств выделенного объекта (подразумевается, что выделен объект Range).

Sub ChangeFontl()
Selection.Font.Name = " Cambria "
Selection.Font.Bold = True Selection.Font.Italic = True
Selection.Font.Size = 12
Selection.Font.Underline = xlUnderlineStyleSingle
Selection.Font.ThemeColor = xlThemeColorAccentl
End Sub

Эту процедуру можно переписать с помощью конструкции With — End With. Процедура, показанная ниже, работает точно так же, как и предыдущая.

Sub ChangeFont2 ()
With Selection.Font
.Name = " Cambria "
.Bold = True
.Italic = True
.Size = 12
.Underline = xlUnderlineStyleSingle
.ThemeColor = xlThemeColorAccentl
End With
End Sub

Предположим, вы решили выполнить действие над всеми объектами коллекции или вам необходимо оценить все объекты коллекции и совершить действие при выполнении определенных условий. Это идеальная ситуация для применения конструкции For Each — Next. Синтаксис конструкции:

For Each элемент In коллекция
[инструкции ]
[инструкции ]
Next [элемент ]

Например:

Sub CountSheets()
Dim Item as Worksheet
For Each Item In ActiveWorkbook.Worksheets
MsgBox Item.Name
Next Item
End Sub

В следующем примере закрываются все окна, за исключением активного:

Sub Closelnactive()
Dim Book as Workbook
For Each Book In Workbooks
If Book.Name <> ActiveWorkbook.Name Then Book.Close
Next Book
End Sub

Контроль за выполнением кода

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

Оператор GoTo перенаправляет ход выполнения программы на новую инструкцию, которая помечена специальным образом (текстовая строка, заканчивающаяся двоеточием, или число, заканчивающееся пробелом, указанные перед инструкцией). В приведенной ниже процедуре применена функция VBA InputBox для получения имени пользователя. Если имя пользователя отличается от Ховард, то процедура переходит к метке WrongName, на чем заканчивает свою работу. В противном случае процедура выполняет дополнительные операции. Оператор Exit Sub заканчивает выполнение процедуры.

Sub GoToDemo()
UserName = InputBox(" Введите свое имя: ")
If UserName <> " Ховард " Then GoTo WrongName
MsgBox (" Привет, Ховард… ")
" — [Здесь вводится дополнительный код] —
Exit Sub
WrongName:
MsgBox " Извините, эту процедуру может запускать только Ховард. "
End Sub

В действительности оператор GoTo необходим только для перехват ошибок (код выше является неудачным примером, который не следует использовать).

Вероятно, конструкция If-Then чаще остальных используется для группирования инструкций VBA:

If условие Then инструкции_истина

Например

Sub GreetMe()
If Time < 0.5 Then
MsgBox " Доброе утро "
Elself Time >= 0.5 And Time < 0.75 Then
MsgBox " Добрый день "
Else
MsgBox " Добрый вечер "
End If
End Sub

VBA использует систему дат и времени, похожую на задействованную в Excel. Время дня выражается дробным числом, например, полдень представлен как 0.5. Значение 0.75 представляет время 18:00 - три четверти суток и тот момент, когда день переходит в вечер. Вложенные структуры If-Then достаточно громоздкие. Поэтому рекомендуется использовать их только для принятия простых бинарных решений. Если же необходимо выбрать между тремя и более вариантами, то целесообразно обратиться к конструкции Select Case.

В следующей процедуре используется функция VBA WeekDay, с помощью которой определяется, является ли текущий день субботой либо воскресеньем (функция Weekday возвращает значение 1 либо 7). Затем отображается соответствующее сообщение.

Sub GreetUserlO
Select Case Weekday(Now)
Case 1, 7
MsgBox " Это выходные "
Case Else
MsgBox " Это не выходные "
End Select
End Sub

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

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

For счетчик = начало То конец
[инструкции ]
[инструкции ]
Next [счетчик ]

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

Sub SumSquareRoots()
Dim Sum As Double
Dim Count As Integer
Sum = 0
For Count = 1 To 100
Sum = Sum + Sqr(Count)
Next Count
MsgBox Sum
End Sub

Значение переменной Step в цикле For-Next может быть отрицательным. Приведенная ниже процедура удаляет строки 2, 4, 6, 8 и 10 в активном листе:

Sub DeleteRows ()
Dim RowNum As Long
For RowNum = 10 To 2 Step -2
Rows(RowNum).Delete
Next RowNum
End Sub

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

Sub ExitForDemo()
Dim MaxVal As Double
Dim Row As Long
MaxVal = Application.WorksheetFunction.Max(Range(" A:A "))
For Row = 1 To 1048576
If Cells(Row, 1).Value = MaxVal Then
Exit For
End If
Next Row
MsgBox " Максимальное значение в строке " & Row
Cells(Row, 1).Activate
End Sub

Максимальное значение в столбце вычисляется с помощью функции Excel МАХ. Затем это значение присваивается переменной MaxVal. Цикл For-Next проверяет каждую ячейку в столбце. Если определенная ячейка равна MaxVal, оператор Exit For заканчивает процедуру. Однако перед выходом из цикла процедура сообщает пользователю о расположении искомой ячейки и активизирует ее.

Цикл Do While выполняется до тех пор, пока удовлетворяется заданное условие. Цикл Do While может иметь один из двух представленных ниже синтаксисов.

Do
[инструкции ]
[инструкции ]
Loop

Do
[инструкции ]
[инструкции ]
Loop

Процедура EnterDates1 вводит даты текущего месяца в столбец рабочего листа, начиная с активной ячейки:

Sub EnterDatesl ()
" цикл Do While, условие проверяется в начале
Dim TheDate As Date
TheDate = DateSerial(Year(Date), Month(Date), 1)
Do While Month(TheDate) = Month(Date)
ActiveCell = TheDate
TheDate = TheDate + 1
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

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

Циклы Do While также могут включать один или более операторов Exit Do. По достижении оператора Exit Do цикл завершается, а управление передается оператору, следующему за оператором Loop.

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

По материалам книги . – М: Диалектика, 2013. – С. 211–251.

Тема 2.3. Программные средства презентаций и основы офисного программирования

Тема 2.4. Системы управления базами данных и экспертные системы

2.4.11. Учебная база данных с главной кнопочной формой "Training_students" - Скачать

Программирования VBA и макросы

2.3. Программные средства презентаций и основы офисного программирования

2.3.7. Основы офисного программирования

Визуальный язык программирования Бейсик для приложений: Visual Basic for Applications (VBA)

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

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

Например, для того, чтобы открыть редактор VBA из приложения PowerPoint необходимо выполнить команду Сервис / Макрос / Редактор VBA. Вернуться из редактора в приложение можно, выбрав команду Microsoft PowerPoint в меню Вид или комбинацией клавиш Alt + F11.

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

Каждое событие проявляется в определенных действиях программы (откликах, реакции). Пользовательская форма позволяет создавать окна диалога приложений. Язык программирования VBA служит для написания кода программы, например для создания функций пользователя в Excel.

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

Рассмотрим алгоритм создания функций пользователя в VBA:

1. Вызвать окно редактора кода VBA, выполнив команду Сервис / Макрос / Редактор Visual Basic или нажать Alt+F11.

2. Выполнить пункт меню редактора Insert / Module (Вставка / Модуля).

3. Далее выполнить Insert / Procedure (Вставка /Процедура). В открывшемся диалогом окне Add Procedure ввести имя функции (например, СУММА5) и установить переключатели: Type (тип) – в положение Function (функция); Scope (Область определения) - в положение Public (Общая) и щелкнуть ОК.


Рис. 1.

4. В окне редактора для программирования VBA появится заготовка функции: заголовок - Public Function СУММА5() и окончание - End Function, между которыми надо поместить код тела функции.


Рис. 2.

5. Далее вводим список параметров функции, например, в скобках указываем (x, y, z, i, j), тип данных (для точных расчетов) и тип возвращаемого функцией значения (в данном примере не будем вводить). Кроме того, вводим тело функции, например, СУММА5 = x + y + z + i + j. В итоге получим следующий текст программы:

Public Function СУММА5(x, y, z, i, j)
СУММА5 = x + y + z + i + j
End Function

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

7. Выполняем "Вставка/Функция" и в открывшемся окне мастера функций выбираем категорию «Определенные пользователем», а в окне «Выберите функцию» выделяем СУММА5 и щелкаем ОК.



Рис. 3.



Рис. 4.

Макросы

Создание макроса

Создадим макрос для автоматического суммирования двух чисел в ячейках A1, B1 и размещения результата в ячейке C1, а также заливки ячейки C1 бирюзовым цветом.

Алгоритм создания макроса для поставленной задачи:

1. Выберите Сервис/Макрос, Начать запись.

2. В поле Имя макроса введите имя для макроса. Первым символом имени макроса должна быть буква. В имени макроса не допускаются пробелы; в качестве разделителей слов можно использовать знаки подчеркивания.

3. Для того чтобы запускать макрос с помощью сочетания клавиш, введите букву в поле Сочетание клавиш. Допускается использование сочетаний CTRL+ буква (для строчных букв) или CTRL+SHIFT+ буква (для прописных букв), где буква - любая буквенная клавиша на клавиатуре. Не выбирайте стандартного сочетания клавиш, так как выбранное сочетание клавиш подавляет стандартные сочетания клавиш Microsoft Excel на то время с данной книгой.

4. В поле "Сохранить" выберите книгу, в которой требуется сохранить макрос. Сохраните макрос в «Эта книга». Для создания краткого описания макроса, введите необходимый текст в поле Описание. На скриншоте представлен пример заполнения окна диалога «Запись макроса»


Рис. 5.

5. Нажмите кнопку OK.

6. Выполните макрокоманды, которые нужно записать.


Рис. 6.

7. Нажмите кнопку Остановить запись на плавающей панели инструментов «Ос» (Остановить запись) или Сервис / Макрос / Остановить макрос.

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

Редактор VBA автоматически записал последовательность макрокоманд или программу по выполненным действиям (Рис. 7.).



Рис. 7.

Для вызова макроса необходимо выполнить команду Сервис / Макрос / Макросы. После этого в диалоговом окне со списком макросов его можно найти по имени и нажать кнопку Выполнить.

Назначение кнопки панели инструментов для запуска макроса

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

  1. Выбрать пункт Настройка в меню Сервис.
  2. В окне диалога Настройка выбрать вкладку Команды и выбрать параметр Макросы в списке Категории, в списке Команды выделить «Настраиваемая кнопка».
  3. Из списка Команды перетащить с помощью мыши настраиваемую кнопку на панель инструментов.
  4. Щелкнуть эту кнопку правой кнопкой мыши и выбрать команду Назначить макрос в контекстном меню.
  5. Ввести имя макроса в поле Имя макроса.

Назначение области графического объекта для запуска макроса:

  1. Создайте графический объект.
  2. К выделенному графическому объекту, примените контекстное меню.
  3. Выберите в контекстном меню команду Назначить макрос.
  4. В появившемся окне диалога "Назначить макрос объекту", введите название макроса в поле Имя макроса, затем нажмите кнопку OK.

Редактирование макроса осуществляется редактором VBA, для этого необходимо выполнить следующее:

  1. Выбрать команду Сервис / Макрос / Макросы.
  2. Выбрать имя макроса, который следует изменить, в списке Имя.
  3. Нажать кнопку Изменить, будет открыто окно Visual Basic, в котором возможно редактирование команд выбранного макроса, записанных на языке Visual Basic.


Удаление макроса:

  1. В меню Сервис выберите пункт Макрос, а затем - команду Макросы.
  2. В списке макросов текущей рабочей книге необходимо выбрать макрос, который предполагается удалить и нажать кнопку Удалить.

Переименование макроса

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