Как записать уравнение в макросе

Пример простейших макросов

Простейшие макросы

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

Язык программирования Бейсик, вернее, один из его диалектов или версий является частью VBA.

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

VBA – это разновидность VB для приложений. VBA встроен в Application Word, Excel, Power Point, Access.

Для каждого приложения есть свои нюансы VBA.

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

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

Лучше всего для сервера подходит Excel, а для клиента – Word.

Переменные, описанные с помощью оператора Dim, являются локальными, и действуют лишь внутри объявляемого модуля.

Переменные, объявленные как Public, действуют во всех программных модулях и доступны из любого модуля.

Значения Public не надо передавать другим модулям, так как они всегда доступны по их имени. Локальные переменные можно передавать другим модулям при их вызове.

Если вы работаете в Excel, то есть одна тонкость при обработке вещественных (с десятичной точкой) чисел.

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

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

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

Эту задачу средствами VBA в EXCEL можно решить минимум тремя или четырьмя способами.

Первый способ использует ввод и вывод данных на самом листе Excel.

Sub koren1()

Dim a As Integer

Dim b As Integer

Dim c As Integer

Dim d As Integer

Dim x1 As Integer

Dim x2 As Integer

‘ Тип данных можно сделать Long для больших целых чисел

‘ или Double для вещественных чисел

‘ или Variant для чисел любого типа

‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

‘ читаем значения чисел в переменные

i = 2 ‘Задаем номер строки

a = Cells(i, 1)

b = Cells(i, 2)

c = Cells(i, 3)

d = b * b – 4 * a * c ‘Вычисляем дискриминант

‘Выводим его значение в строку 2, столбец 4

Cells(i, 4) = d

‘Применяем условие для решения квадратных уравнений

If d >= 0 Then

MsgBox “Решение есть”

x1 = (-b – Sqr(d)) / (2 * a)

x2 = (-b + Sqr(d)) / (2 * a)

Cells(i, 5) = x1

Cells(i, 6) = x2

Else

MsgBox “Решений нет”

End If

End Sub

Решим задачу вторым способом, задавая сами значения непосредственно в программе.

Dim a As Integer

Dim b As Integer

Dim c As Integer

Dim d As Integer

Dim x1 As Integer

Dim x2 As Integer

‘ Тип данных можно сделать Long для больших целых чисел

‘ или Double для вещественных чисел

‘ или Variant для чисел любого типа

‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

‘ Заносим значения чисел в переменные

MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c)

d = b * b – 4 * a * c ‘Вычисляем дискриминант

‘Выводим его значение в строку 2, столбец 4

MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c) + vbCr + _

Дискриминант D=B*B-4*A*C= + CStr(d)

‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

‘ Значение надо преобразовать в строковый тип данных

‘Применяем условие для решения квадратных уравнений

MsgBox “Решение есть”

x1 = (-b – Sqr(d)) / (2 * a)

x2 = (-b + Sqr(d)) / (2 * a)

MsgBox “Корень x1=” + CStr(x1) + vbCr + “Корень x2=” + CStr(x2)

MsgBox “Решений нет”

Решим задачу 3-м способом, получая значения путем их ввода в интерактивном режиме непосредственно в программу.

Dim a As Integer

Dim b As Integer

Dim c As Integer

Dim d As Integer

Dim x1 As Integer

Dim x2 As Integer

Dim a1 As String

‘ Тип данных можно сделать Long для больших целых чисел

‘ или Double для вещественных чисел

‘ или Variant для чисел любого типа

‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

‘ Вводим значения в переменные

a1 = InputBox(“Введите значение коэф.А”, “Ввод коэффициента”, 1)

a1 = InputBox(“Введите значение коэф.B”, “Ввод коэффициента”, 2)

a1 = InputBox(“Введите значение коэф.C”, “Ввод коэффициента”, -35)

If a = 0 Then MsgBox “Уравнение имеет одно решение”

‘MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c)

d = b * b – 4 * a * c ‘Вычисляем дискриминант

‘Выводим его значение в строку 2, столбец 4

MsgBox “Коэф. A=” + CStr(a) + vbCr + “Коэф. B=” + CStr(b) + vbCr + “Коэф. C=” + CStr(c) + vbCr + _

Дискриминант D=B*B-4*A*C= + CStr(d)

‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

‘ Значение надо преобразовать в строковый тип данных

‘Применяем условие для решения квадратных уравнений

MsgBox “Решение есть”

x1 = (-b – Sqr(d)) / (2 * a)

x2 = (-b + Sqr(d)) / (2 * a)

MsgBox “Корень x1=” + CStr(x1) + vbCr + “Корень x2=” + CStr(x2)

MsgBox “Решений нет”

Решим задачу 4-м способом, получая значения путем их ввода в форму пользователя непосредственно в программе.

Создаем форму пользователя Userform1

В форме располагаем несколько меток и текстовых окон, а также две командные кнопки.

По каждой кнопке вызывается исполняемый модуль

Текстовые окна имеют имена Koef_A, Koef_B, Koef_C, Disk_D, Koren_x1 и Koren_x2

Командные кнопки имеют имена cmdRun и cmdExit.

Private Sub cmdExit_Click()

Private Sub CmdRun_Click()

Dim a As Double

Dim b As Double

Dim c As Double

Dim d As Double

Dim x1 As Double

Dim x2 As Double

Dim a1 As Double

‘ Тип данных можно сделать Long для больших целых чисел

‘ или Double для вещественных чисел

‘ или Variant для чисел любого типа

‘ Изменяя тип переменных, можно решать задачу в разных диапазонах данных

‘ Вводим значения в переменные

If Trim(UserForm1.Koef_A) = “” Or Trim(UserForm1.Koef_B) = “” Or Trim(UserForm1.Koef_C) = “” Then

MsgBox “Введите значения коэффициентов”

If a = 0 Then MsgBox “Уравнение имеет одно решение”

d = b * b – 4 * a * c ‘Вычисляем дискриминант

‘Выводим его значение в строку 2, столбец 4

UserForm1.Disk_D = UserForm1.Koef_B + “*” + UserForm1.Koef_B + “-” + _

4* + UserForm1.Koef_A + ” *” + UserForm1.Koef_C + “=” + CStr(d)

‘Обращаю внмание на вывод нестроковых значений в операторе Msgbox

‘ Значение надо преобразовать в строковый тип данных

‘Применяем условие для решения квадратных уравнений

Как записать макрос в Excel? Пошаговая инструкция.

Что такое макрос?

Для начала немного о терминологии.

Макрос — это код, написанный на встроенном в Excel языке VBA (Visual Basic for Application). Макросы могут создаваться как вручную, так и записываться автоматически с помощью так называемого макрорекодера.

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

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

Теперь давайте погрузимся и посмотрим, как записать макрос в Excel.

Отображение вкладки «Разработчик» в ленте меню

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

  1. Щелкните правой кнопкой мыши по любой из существующих вкладок на ленте и нажмите «Настроить ленту». Он откроет диалоговое окно «Параметры Excel».
  2. В диалоговом окне «Параметры Excel» у вас будут параметры «Настроить ленту». Справа на панели «Основные вкладки» установите флажок «Разработчик».
  3. Нажмите «ОК».

В результате на ленте меню появится вкладка «Разработчик»

Запись макроса в Excel

Теперь давайте запишем очень простой макрос, который выбирает ячейку и вводит в нее текст, например «Excel».

Вот шаги для записи такого макроса:

  1. Перейдите на вкладку «Разработчик».
  2. В группе «Код» нажмите кнопку «Запись макроса». Откроется одноименное диалоговое окно.
  3. В диалоговом окне «Запись макроса» введите имя для своего макроса, например «ВводТекста». Есть несколько условий именования, которые необходимо соблюдать при назначении макроса. Например, вы не можете использовать пробелы между ними. Обычно я предпочитаю сохранять имена макросов как одно слово, с разными частями с заглавным первым алфавитом. Вы также можете использовать подчеркивание для разделения двух слов — например, «Ввод_текста».
  4. Если вы хотите, то можете задать сочетание клавиш. В этом случае мы будем использовать ярлык Ctrl + Shift + N. Помните, что сочетание, которое вы указываете, будет отменять любые существующие горячие клавиши в вашей книге. Например, если вы назначили сочетание Ctrl + S, вы не сможете использовать это для сохранения рабочей книги (вместо этого, каждый раз, когда вы его используете, он выполняет макрос).
  5. В поле «Сохранить в» убедитесь, что выбрана опция «Эта книга». Этот шаг гарантирует, что макрос является частью рабочей книги. Он будет там, когда вы сохраните его и снова откроете, или даже если вы поделитесь файлом с кем-то.
  6. Введите описание при необходимости. Обычно я этого не делаю, но если у вас много макросов, лучше указать, чтобы в будущем не забыть что делает макрос.
  7. Нажмите «ОК». Как только вы нажмете OK, Excel начнет записывать ваши действия. Вы можете увидеть кнопку «Остановить запись» на вкладке «Разработчик», которая указывает, что выполняется запить макроса.
  8. Выберите ячейку A2.
  9. Введите текст «Excel» (или вы можете использовать свое имя).
  10. Нажмите клавишу Enter. Вы попадете на ячейку A3.
  11. Нажмите кнопку «Остановить запись» на вкладке «Разработчик».

Поздравляем! Вы только что записали свой первый макрос в Excel. Хотя макрос не делает ничего полезного, но он поможет нам понять как работает макрорекордер в Excel.

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

  1. Удалите текст в ячейке A2. Это нужно, чтобы проверить будет ли макрос вставлять текст в ячейку A2 или нет.
  2. Выберите любую ячейку — кроме A2. Это нужно проверить, выбирает ли макрос ячейку A2 или нет.
  3. Перейдите на вкладку «Разработчик».
  4. В группе «Код» нажмите кнопку «Макросы».
  5. В диалоговом окне «Макрос» щелкните макрос «ВводТекста».
  6. Нажмите кнопку «Выполнить».

Вы увидите, что как только вы нажмете кнопку «Выполнить», текст «Excel» будет вставлен в ячейку A2 и выбрана ячейка A3. Это происходит за миллисекунды. Но на самом деле макрос последовательно выполнил записанные действия.

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

Что записывает макрос?

Теперь перейдем к редактору кода и посмотрим что у нас получилось.

Вот шаги по открытию редактора VB в Excel:

  1. Перейдите на вкладку «Разработчик».
  2. В группе «Код» нажмите кнопку «Visual Basic».

Вы также можете использовать комбинацию клавиш Alt + F11 и перейти в редактор кода VBA.

Рассмотрим сам редактор кода. Далее коротко опишем интерфейс редактора.

  • Панель меню: содержит команды, которые можно использовать во время работы с редактором VB.
  • Панель инструментов — похожа на панель быстрого доступа в Excel. Вы можете добавить к ней дополнительные инструменты, которыми часто пользуетесь.
  • Окно проектов (Project Explorer) — здесь Excel перечисляет все книги и все объекты в каждой книге. Например, если у нас есть книга с 3 рабочими листами, она появится в Project Explorer. Здесь есть несколько дополнительных объектов, таких как модули, пользовательские формы и модули классов.
  • Окно кода — собственно сам код VBA размещается в этом окне. Для каждого объекта, указанного в проводнике проекта, есть окно кода, например, рабочие листы, книги, модули и т. д. В этом уроке мы увидим, что записанный макрос находится в окне кода модуля.
  • Окно свойств — вы можете увидеть свойства каждого объекта в этом окне. Я часто использую это окно для обозначения объектов или изменения их свойств.
  • Immediate Window (окно предпросмотра) — На начальном этапе оно вам не пригодится. Оно полезно, когда вы хотите протестировать шаги или во время отладки. Он по умолчанию не отображается, и вы можете его отобразить, щелкнув вкладку «View» и выбрав опцию «Immediate Window».

Когда мы записали макрос «ВводТекста», в редакторе VB произошли следующие вещи:

  • Был добавлен новый модуль.
  • Макрос был записан с именем, которое мы указали — «ВводТекста»
  • В окне кода добавлена новая процедура.

Поэтому, если вы дважды щелкните по модулю (в нашем случае модуль 1), появится окно кода, как показано ниже.

Вот код, который записан макрорекодером:

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

Теперь давайте пробежим по каждой строке кода и опишем что и зачем.

Код начинается с Sub, за которым следует имя макроса и пустые круглые скобки. Sub — сокращение для подпрограммы. Каждая подпрограмма (также называемая процедурой) в VBA начинается с Sub и заканчивается End Sub.

  • Range(«A2»).Select — эта строка выбирает ячейку A2.
  • ActiveCell.FormulaR1C1 = «Excel» — эта строка вводит текст «Excel» в активной ячейке. Поскольку мы выбрали ячейку A2 в качестве первого шага, она становится нашей активной ячейкой.
  • Range(«A3»).Select — выбор ячейки A3. Это происходит, когда мы нажимаем клавишу Enter после ввода текста, результатом которого является выбор ячейки A3.

Надеюсь, что у вас есть некоторое базовое понимание того, как записывать макрос в Excel.

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

Абсолютная и относительная запись макроса

Вы уже знаете про абсолютные и относительные ссылки в Excel? Если вы используете абсолютную ссылку для записи макроса, код VBA всегда будет ссылаться на те же ячейки, которые вы использовали. Например, если вы выберете ячейку A2 и введете текст «Excel», то каждый раз — независимо от того, где вы находитесь на листе и независимо от того, какая ячейка выбрана, ваш код будет вводить текст «Excel» в ячейку A2.

Если вы используете параметр относительной ссылки для записи макроса, VBA не будет привязываться к конкретному адресу ячейки. В этом случае программа будет «двигаться» относительно активной ячейки. Например, предположим, что вы уже выбрали ячейку A1, и вы начинаете запись макроса в режиме относительной ссылки. Теперь вы выбираете ячейку A2, вводите текст Excel и нажмите клавишу Enter. Теперь, если вы запустите этот макрос, он не вернется в ячейку A2, вместо этого он будет перемещаться относительно активной ячейки. Например, если выбрана ячейка B3, она переместится на B4, запишет текст «Excel» и затем перейдет к ячейке K5.

Теперь давайте запишем макрос в режиме относительных ссылок:

  1. Выберите ячейку A1.
  2. Перейдите на вкладку «Разработчик».
  3. В группе «Код» нажмите кнопку «Относительные ссылки». Он будет подсвечиваться, указывая, что он включен.
  4. Нажмите кнопку «Запись макроса».
  5. В диалоговом окне «Запись макроса» введите имя для своего макроса. Например, имя «ОтносительныеСсылки».
  6. В опции «Сохранить в» выберите «Эта книга».
  7. Нажмите «ОК».
  8. Выберите ячейку A2.
  9. Введите текст «Excel» (или другой как вам нравится).
  10. Нажмите клавишу Enter. Курсор переместиться в ячейку A3.
  11. Нажмите кнопку «Остановить запись» на вкладке «Разработчик».

Макрос в режиме относительных ссылок будет сохранен.

Теперь сделайте следующее.

  1. Выберите любую ячейку (кроме A1).
  2. Перейдите на вкладку «Разработчик».
  3. В группе «Код» нажмите кнопку «Макросы».
  4. В диалоговом окне «Макрос» кликните на сохраненный макрос «ОтносительныеСсылки».
  5. Нажмите кнопку «Выполнить».

Как вы заметите, макрос записал текст «Excel» не в ячейки A2. Это произошло, потому что вы записали макрос в режиме относительной ссылки. Таким образом, курсор перемещается относительно активной ячейки. Например, если вы сделаете это, когда выбрана ячейка B3, она войдет в текст Excel — ячейка B4 и в конечном итоге выберет ячейку B5.

Вот код, который записал макрорекодер:

Обратите внимание, что в коде нет ссылок на ячейки B3 или B4. Макрос использует Activecell для ссылки на текущую ячейку и смещение относительно этой ячейки.

Не обращайте внимание на часть кода Range(«A1»). Это один из тех случаев, когда макрорекодер добавляет ненужный код, который не имеет никакой цели и может быть удален. Без него код будет работать отлично.

Что нельзя сделать с помощью макрорекодера?

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

  • Вы не можете выполнить код без выбора объекта. Например, если вы хотите, чтобы макрос перешел на следующий рабочий лист и выделил все заполненные ячейки в столбце A, не выходя из текущей рабочей таблицы, макрорекодер не сможет этого сделать. В таких случаях вам нужно вручную редактировать код.
  • Вы не можете создать пользовательскую функцию с помощью макрорекордера. С помощью VBA вы можете создавать пользовательские функции, которые можно использовать на рабочем листе в качестве обычных функций.
  • Вы не можете создавать циклы с помощью макрорекордера. Но можете записать одно действие, а цикл добавить вручную в редакторе кода.
  • Вы не можете анализировать условия: вы можете проверить условия в коде с помощью макрорекордера. Если вы пишете код VBA вручную, вы можете использовать операторы IF Then Else для анализа условия и запуска кода, если true (или другой код, если false).

Расширение файлов Excel, которые содержат макросы

Когда вы записываете макрос или вручную записываете код VBA в Excel, вам необходимо сохранить файл с расширением файла с поддержкой макросов (.xlsm).

До Excel 2007 был достаточен один формат файла — .xls. Но с 2007 года .xlsx был представлен как стандартное расширение файла. Файлы, сохраненные как .xlsx, не могут содержать в себе макрос. Поэтому, если у вас есть файл с расширением .xlsx, и вы записываете / записываете макрос и сохраняете его, он будет предупреждать вас о сохранении его в формате с поддержкой макросов и покажет вам следующее диалоговое окно:

Если вы выберете «Нет», Excel сохранить файл в формате с поддержкой макросов. Но если вы нажмете «Да», Excel автоматически удалит весь код из вашей книги и сохранит файл как книгу в формате .xlsx. Поэтому, если в вашей книге есть макрос, вам нужно сохранить его в формате .xlsm, чтобы сохранить этот макрос.

Макросы в Excel. Простая математика.

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

Просмотр содержимого документа
«Макросы в Excel. Простая математика.»

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

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

Ну что ж, давайте посмотрим как вычислить элементарное.

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

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

Так вот, наше сложение двух ячеек будет смотреться так:

Cells(1, 1) = Cells(1, 2) + Cells(1, 3)

Это вырвжение говорит о том, что результат сложения ячеек В1 и С1 записывается в ячейке А1.

Сложим несколько ячеек:

Cells(1, 1) = Cells(1, 2) + Cells(1, 3) + Cells(1, 4)

Возможно ли прибавить некоторую цифру к получившейся сумме? Конечно можно:

Cells(1, 1) = Cells(1, 2) + 8

Вычитание аналогично как исложение:

Cells(1, 1) = Cells(1, 2) — Cells(1, 3)

Cells(1, 1) = Cells(1, 2) — Cells(1, 3) — Cells(1, 4)

Cells(1, 1) = Cells(1, 2) — 6

Умножение аналогично как исложение и вычитание:

Cells(1, 1) = Cells(1, 2) * Cells(1, 3)

Cells(1, 1) = Cells(1, 2) * Cells(1, 3) * Cells(1, 4)

Cells(1, 1) = Cells(1, 2) * 4

Деление всё аналогично:

Cells(1, 1) = Cells(1, 2) / Cells(1, 3)

Cells(1, 1) = Cells(1, 2) / Cells(1, 3) / Cells(1, 4)

Cells(1, 1) = Cells(1, 2) / 2

Возникает один вопрос: А можно ли смешать эти действия?
Можно.

Cells(1, 1) = (Cells(1, 2) + Cells(1, 3)) * 2 — Cells(1, 4) / 6

При работе с арифметическими операциями не забываем только это правило:

Ещё один важный момент при работе с переменными — это описание переменных. Об этом в уроке ниже.

Возможно кто-то задумался, а можно ли сразу задать нашей переменной некоторое значение? И это можно, но только называется это уже не переменная, а константа, которая описывается так:

Const A As Integer = 2323

При этом описывать её как переменную не следует. Наш код будет выглядеть, например, так:

Const AConst = 10

Dim B As Integer

Const A As Integer = 10

Dim B As Integer

Существует ещё такой тип описания переменной:

Private A As Integer

Но данное объявление переменной, видимо только в своём модуле.

Private A As Byte

Dim B As Integer

Без логики никуда. Всё программирование это логика. В VBA-Excel так же есть свои логические операторы. Ниже приведена таблица операторов их синтаксис, описание и таблица истинности.

Теперь рассмотри как они применяются на практике

Естественно если у нас выражение логическое, то и начинаться оно может с условия Если. Вот например:

Private Sub CommandButton1_Click()

If Cells(3, 9) = 1 And Cells(3, 10) = 1 Then

Теперь надо прояснить ситуацию. Если в ячейке Cells(3, 9) и ячейке Cells(3, 10) записана еденица, то в ячейке Cells(3, 11) так же записывается еденица, в противном случае в ячейке Cells(3, 11) прописывается ноль (в примере есть все логические примеры, можете скачать).

Но это не значит, что оно всегда должно начинаться с условия Если то. И не обязательно чтобы в выражении было два входных значения (в данном случае Cells(3, 9) = 1, Cells(3, 10)). Их модет быть столько сколько вы захотите. Например так:

Private Sub CommandButton1_Click()

If Cells(3, 9) = 1 And Cells(3, 10) = 1 And Cells(3, 11) = 1 Then

Тут всё аналогично, начинаем с Если и заканчиваем То. И также входных переменных может быть более двух.

Private Sub CommandButton2_Click()

If Cells(8, 9) = 1 Or Cells(8, 10) = 1 Then

В случае с НЕ нам достаточно одной входной переменной для получения необходимого результата на выходе.

Private Sub CommandButton3_Click()

If Not Cells(13, 9) = 1 Then

В этом случае у нас получается всё в точности противоположно истинне. Если в Cells(13, 9) записана еденица, то получается ноль, в противном случае — еденица (так сказать некий закон подлости).

Это что-то вроде оператора OR (или), но тут нет истинности при одинаковых значениях переменных.

Private Sub CommandButton4_Click()

If Cells(16, 9) = 1 Xor Cells(16, 10) = 1 Then

Данный оператор так же опереирует двумя и более переменными.

Private Sub CommandButton5_Click()

If Cells(21, 9) = 1 Eqv Cells(21, 10) = 1 Then

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

Данный оператор тоже можно записать через условие Если То.

Private Sub CommandButton6_Click()

If Cells(26, 9) = 1 Imp Cells(26, 10) = 1 Then

У кого-то может возникнуть вопрос: А можно ли эти операторы соединить в одном логическом выражении? Конечно можно.

If A = 1 And B = 1 Or C = 1 Then

MsgBox «Истина 1», vbInformation, «Истина»

MsgBox «Ложь 0», vbInformation, «Ложь»

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

Стандартный модуль является самым популярным в VBA, раньше его называли модуль кода. Другими словами в стандартном модуле должны находиться все те процедуры, которые не относятся к событию книги или листа (о событиях книги и листа будет в уроках ниже). Тот код имя которому придумали лично Вы. Например, если вы добавляете на лист кнопку, и щёлкаете по ней два раза ЛКМ вы попадаете именно на тот лист в VBA, на котором находится кнопка (т.е. эта процедура от события листа). И носить она будет например такое название CommandButton1_Click():

Private Sub CommandButton1_Click()

А вот если мы напишем макрос с таким именем:

Dim r As Integer

For i = 1 To 100 Step 1

MsgBox «Сумма чисел от 1 до 100 равняется » & r, vbInformation, «Сумма»

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

Вставить модуль в документ очень просто. Заходим в окно VB и нажимаем на панели управления кнопкуInsert / Module.

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

Если вам не нравится как называется модуль, то вы можете придумать ему своё имя. Нажимаем на пиктограмму показанную ниже на рисунке и у Вас появляется окно, в котором можно изменить имя модуля.

Модуль класса — это специальный тип модуля VBA, который можно добавить в наш проект. Этот модуль позволяет создавать новый класс объектов. При добавлении этого модуля программист уже должен понимать, что это уже управление объектами. Модуль класса позволяет создавать новые объекты, а также соответствующие для них свойства, методы и события.
Добавить этот модуль к себе в проект не сложно. Заходим в Insert / Class Module

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

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

Запуск макроса
Привязка макроса к произвольному объекту

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

Дальше объект редактируем. Придаём ему нужный размер, заливку, оттенки, тени, изменить или добавить текст на объектк и т.п. Красивую настройку можно сделать нажав на правую кнопку мыши на объекте и выбрать пункт Формат фигуры или Формат рисунка. В видеоролике показано как можно сделать красивую кнопку.

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

После этого откроется окно, в котором будет список всех ваших макросов. Указываем необходимый макрос из этого списка и нажимаем ОК. Теперь указанный макрос будет запускаться при нажатии на эту фигуру ЛКМ.

Автоматическая запись макроса
Макрорекордер

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

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

Запись макроса можно включить двумя способами:
1 — Заходим в вкладку разработчик и нажимаем пиктограмму Запись макроса:

2 — это нажимаем пиктограмму в нижнем левом углу окна книги:

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

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

Заполняете поля и нажимаете кнопку ОК. После этого происходит запись макроса, т.е. всё то, что вы будете писать в книге, производить заливку ячеек и т.п. у Вас будет записываться.
Остановить запись возможно так же двумя способами:

Или нажав на пиктограмму в левом нижнем углу книги

Существует два вида записи макросов — это запись с прямыми ссылками и запись с относительными ссылками.
Вот теперь давайте по подробнее.

Запись макроса с прямыми ссылками

Запись макроса с прямыми ссылками означает, что все наши действия, которые мы записали точно так же повторятся при воспроизведении макроса. Например, мы нажали Запись макроса и записали в ячейку А1 слово «Привет», в ячейку В1 «Пока», а в ячейку С1 «Привет». После этого остановили запись. Потом нажали выполнение записанного макроса, перед этим очистив ячеки и убрав курсор на совершенно другую ячйку, и у нас снова в Ячеке А1 появилось слово «Привет», в ячейке В1 «Пока», а в ячейке С1 «Привет». И куда бы мы не перемещли курсор и как бы мы не запускали макрос у нас запись будет производиться только в ячейках A1, B1 и C1.

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

На этом примере видно, что первоначально у нас происходит выделение ячейки и только потом занесение в неё текста. Поэтому как бы мы не старались выполнять макрос на других ячейках и занести в них текст у нас ничего не выйдёт, всё равно будет записываться в тех ячейках, в которых мы заносили текст при выполнении записи макроса. Об этом ярко выражено демонстрируют прямые ссылки (Range(«A1»).Select, Range(«B1»).Select, Range(«C1»).Select) в коде примера.

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

Запись макроса с относительными ссылками

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

При наведении на пиктограмму можно прочитать в подсказке суть этой записи. Но я всё таки попробую объяснить более подробней.
Итак, при включении данной опции записи у нас происходит запись макроса следующим образом. Если при записи прямыми ссылками у нас чётко прописывался адрес ячейки (А1), то в случае с записью относительной ссылки у нас запишется ссылка на начальное положение курсора, относительно которой будет происходить дальнейший отсчёт. Например у нас курсор находится в ячейке А1, мы написали в ней «Привет», затем переместили курсор в ячейку А2 и в ней записали «Пока», после этого переместили курсор на А3 и записали в ней «Привет». После этого мы останавливаем запись макровса и пытаемся его выполнить. Ставим курсор в ячейку А1 и унас автоматически в ячейке А2 записывается «Пока», а в ячейке А3 записывается «Привет». После этого перемещаем курсор в ячейку В1 и снова нажимаем выполнить макрос. При этом у нас в ячейке В1 будет «Привет», в ячейке В2 «Пока», в В3 «Привет». Это всё потому, что макрорекордер записывает относительные ссылки, т.е. ссылки произведённые относительно первоначального состояния курсора. Выглядеть этот код будет например так:

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

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

У некоторых людей наверное сложилось такое впечатление, что можно и не изучать программирование Excel дальше, какие-то операторы, функции и прочую лабуду, если можно просто записать всю последовательность работы прямыми или относительными ссылками и потом это использовать. Может и так. Может кому-то больше и не надо. Но хочу сказать, что запись макроса и придумана для людей, которые не желают учиться. Которым просто нужен быстрый результат. Какую-то полноценную и интересную программу через макрорекордер сделать никогда не получится.
Лично я пользуюсь этой функцией только когда мне необходимо произвести составление какого-то шаблона таблицы и её оформление. Но после этого обязательно произвожу ручное редактирование записанного макроса, потому что мкрорекордер записывает очень много промежуточного, «ненужного», кода, который можно упростить и уменьшить раз в 10.

Определение активных составляющих книги

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

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

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

MsgBox «Активная строка под номером » & s, vbInformation, «Активная строка»

Номер активного столбца

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

MsgBox «Активная столбец под номером » & s, vbInformation, «Активный столбец»

Определяем номер последней заполненной строки

Stroka = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious, _

Stroka = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count — 1

Определяем номер последнего заполненного столбца

Stolbec = ActiveSheet.Cells.Find(What:=»*», SearchDirection:=xlPrevious, _

Stolbec = ActiveSheet.UsedRange.Column + ActiveSheet.UsedRange.Columns.Count — 1

Определяем активную ячейку

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

MsgBox «Активная ячейка имеет координаты Cells(» & sk & «,» & st & «)», _

vbInformation, «Активная ячейка»

Адрес активной ячейки

Многие думали, а как получить адрес активной ячейки? Очень просто, делается это так:

MsgBox «Абсолютный адрес активной ячейки — » & A, vbInformation, «Адрес»

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

A = ActiveCell.Address(0, 0)

MsgBox «Относительный адрес активной ячейки — » & A, vbInformation, «Адрес»

В скобках оператора Address указано какое именно значение должно быть относительным, а какое абсолютным. Если Address(0,0), то и строка и столбец записаны относительными (первый ноль отвечает за строку, второй ноль — это столбец). Если в строке поставить вместо ноля еденицу, то строка будет абсолютным значением, а столбец относительным. Причём значения следующих записей равнозначны:

Address(1, 0) = Address(True, False)

Адрес выделенного диапазона ячеек

Адрес выделенного диапазона можно получить следующим образом

a = Selection.Rows.Address(0, 0) ‘Через строку

b = Selection.Columns.Address(0, 0) ‘Через столбец

c = Selection.Address(0, 0)

MsgBox «Выделенный диапазон — » & a, vbInformation, «Адрес»

При чём адрес выделенного диапазона можно получить как через столбец, так и через строку. И значения a, b и c в выше приведённом примере абсолютно одинаковые.

Координаты выделенного диапазона

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

K1 = Cells(a, b).Address(0, 0)

aa = a + Selection.Rows.Count — 1

bb = b + Selection.Columns.Count — 1

K2 = Cells(aa, bb).Address(0, 0)

MsgBox «Первая координата выделенного диапазона — » & K1 & vbNewLine & _

«Вторая координата выделенного диапазона — » & K2, vbInformation, «Координаты»

a — Определяет номер первой строки выделенного диапазона;
b — Определяет номер первого столбца выделенного диапазона;
K1 — Определяем первую координату выделенного диапазона;
aa — Определяем номер последней строки выделенного диапазона;
bb — Определяем номер пследнего столбца выделенного диапазона;
K2 — Определяем вторую координату выделенного диапазона;

Selection.Rows.Count — определяет количество строк в выделенном диапазоне;
Selection.Columns.Count — определяет количество столбцов в выделенном диапазоне;

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

Имя активной книги

Имя активной книги возможно вычислить такой записью:

MsgBox «Имя активной книги — » & Name, vbInformation, «Имя активной книги»

Имя активного листа

Имя активного листа можно определить так:

MsgBox «Имя активного листа — » & Name, vbInformation, «Имя активного листа»


источники:

http://micro-solution.ru/excel/vba/first-macros

http://multiurok.ru/index.php/files/makrosy-v-excel-prostaia-matiematika.html