Решаем счётные задачи с помощью Excel VBA
Visual Basic for Applications (VBA) – диалект языка Visual Basic, включённый в состав пакета Microsoft Office. Программы на VBA, называемые макросами, могут выполняться прямо из документа Word или Excel, используя при этом в качестве интерфейса пользователя стандартные для Windows кнопки, поля ввода, списки, окна диалога или переключатели.
Изучение языка — тема отдельная, хотя он совсем несложен. В этой заметке я покажу лишь самые очевидные вещи — как ввести данные и вывести результаты работы двумя основными способами — с помощью окон диалога и непосредственно в ячейки рабочего листа Excel.
Перед началом работы:
1. Включите настройку Кнопка Office — Параметры Excel (или Word) — Основные — «Показывать вкладку Разработчик на ленте». В последних версиях офиса настройка может называться иначе, но она там есть
2. На вкладке Разработчик нажмите кнопку Безопасность макросов и разрешите выполнение макросов:
параметры макросов
В противном случае придётся каждый раз разрешать выполнение макросов при открытии документа.
Когда цикл разработки окончен, лучше вернуть настройку на место, чтобы не открыть вирусный документ, полученный откуда-нибудь со стороны.
3. Нажмите вкладку Разработчик – Макросы, дайте новой программе имя и нажмите кнопку Создать:
создание макроса
Откроется редактор Visual Basic, в котором можно писать, отлаживать, выполнять и сохранять программы.
На скрине ниже показана программа, позволяющая вычислить, сколько процентов составляет значение A от B.
пример программы
Вот листинг почти программки такого же типа, только ещё проще.
Sub Project1() Dim A, B, C As Double A = Val(InputBox("Ввод A", "Введите A", 0)) B = Val(InputBox("Ввод B", "Введите B", 0)) C = Sqr(A ^ 2 + B ^ 2) MsgBox "Ответ =" & C End Sub
В простых случаях нам достаточно с помощью окна InputBox
получить значение переменной (третьим аргументом ей можно дать значение по умолчанию),
при необходимости проверить, корректно ли введены данные (так как введённая в InputBox
величина возвращается в виде строки, можно получить её числовое значение функцией Val
или узнать, введено ли вообще числовое значение функцией IsNumeric
), произвести расчёты и
вывести результаты в новом окне сообщения, полученном функцией MsgBox
. Её первым аргументом мы передаём строку, выводимую в окне, её можно получить сложением строк в двойных кавычек и/или числовых значений, которые нужно преобразовать к строковым функцией Str
.
Теперь можно нажать зелёный треугольничек или клавишу F5
в редакторе VBA, чтобы запустить программу.
Если доступно несколько программ или текстовый курсор не установлен внутри программы, компьютер может попросить выбрать нужную по имени:
запуск программы из редактора Visual Basic
Чтобы макросы не пропали, при первом сохранении рабочей книги нужно выбрать пункт меню «Сохранить как» и указать в списке «Тип файла» значение «Книга Excel с поддержкой макросов (*.xlsm)».
Обычно мы хотим запускать программу не из Visual Basic, а прямо из документа, например, нажимая кнопку.
Чтобы встроить кнопку непосредственно в документ Word или Excel, действуем так:
1. На вкладке разработчика нажмём кнопку «Режим конструктора» и выберем нужный элемент управления, например, кнопку:
выбор инструмента «Кнопка»
2. Потом курсором-крестиком «нарисуем» кнопку в документе и нажмём «Создать» в окне «Назначить макрос объекту», чтобы кнопке была назначена пустая процедура-обработчик её основного события (то есть, нажатия):
добавление кнопки на лист
3. После этого можно запрограммировать процедуру обработки нажатия нашей кнопки.
Обращаться к ячейкам Excel из программы VBA тоже очень легко, вот несколько примеров:
Range("B1").Value = 2018 'Поместить в ячейку B1 текущего листа значение 2018 Range("A1:A10").Select Range("A1:A10").Value = "Программа" 'Выделить и заполнить словом "Программа" ячейки A1:A10 Range("C2").Font.Size = 18 'В ячейке С2 установить размер шрифта 18 For N = 1 To 10 Range("D" & N).Value = _ Range("D" & (N + 1)).Value Next 'Сдвинуть вверх ячейки от D1 до D10 (пропадает первое значение) Sheets("Лист1").Cells(1, 1) = 13 ^ 64 'Записать в ячейку A1 листа "Лист1" большое числовое значение
Ну и немного более законченного кода.
Попробуйте скопировать в VBA и выполнить эти 2 несложных программы, и начальный опыт программирования в нём у Вас появится
Первая программа может быть назначена кнопке и позволяет ввести из столбца A текущего рабочего листа столько числовых значений, сколько их там набрано, но не больше 100.
Полученные значения заносятся в массив A, заполнение прекращается по достижении пустой ячейки, ячейки, заполненной не числом или когда набрано 100 элементов.
Затем от введённых чисел рассчитывается сумма и записывается в ячейку B6.
Sub Кнопка5_Щелчок() 'Кнопка Массив Dim A(100) As Double Dim N As Integer N = 0 For I = 1 To 100 V = Range("A" & I).Value If (IsEmpty(V) Or IsNumeric(V) = False Or N > 100) Then MsgBox "Введено чисел : " & N Exit For End If A(I) = V N = N + 1 Next I Dim S As Double S = 0 For I = 1 To N S = S + A(I) Next I Range("B6").Value = S End Sub
Вторая программа предполагает, что в ячейках B12 и B13 рабочего листа записаны 2 даты. Это могут быть строки, интерпретируемые Вашим Excel как даты, например, 01.01.2001
или даты, полученные формулой, скажем, =СЕГОДНЯ()
По нажатию кнопки даты проверяются, если двух дат не найдено, выводится сообщение и программа завершается.
В противном случае мы вычисляем и выводим в ячейку B16 количество дней между датами, а в C12 и C13 — дни недели по русски. Добавьте небольшое оформление и получите простейший калькулятор дат:
Sub Кнопка4_Щелчок() 'Кнопка Вычислить Dim d1, d2 As Date d1 = Range("B12").Value d2 = Range("B13").Value 'Обработка ошибок ввода (IsNumeric для чисел) If (IsDate(d1) = False Or IsDate(d2) = False) Then MsgBox "Введите 2 даты", vbOKOnly, "Ошибка" Exit Sub End If 'Расчёты Days = DateDiff("d", d1, d2, vbMonday) Range("B16").Value = Days 'Прошло дней Dim A(7) As String A(1) = "Пн": A(2) = "Вт": A(3) = "Ср" A(4) = "Чт": A(5) = "Пт": A(6) = "Сб" A(7) = "Вс" wd1 = Weekday(d1, vbMonday) 'Дни недели Range("C12").Value = A(wd1) wd2 = Weekday(d2, vbMonday) Range("C13").Value = A(wd2) End Sub
пример «интерфейса» для макроса VBA
09.05.2018, 10:56 [9943 просмотра]
К этой статье пока нет комментариев, Ваш будет первым
Решатель Excel VBA
Как вы решаете сложные задачи? Если вы не знаете, как решить эти проблемы, вам не о чем беспокоиться; у нас есть решатель в Excel. В нашей предыдущей статье «Решатель Excel» мы узнали, как решать уравнения в Excel. Если вы не знаете, «SOLVER» также доступен с VBA. В этой статье вы узнаете, как использовать «Решатель» в VBA.
Оглавление
- Решатель Excel VBA
- Включить решатель на листе
- Включить решатель в VBA
- Функции решения в VBA
- SolverOk
- СолверДобавить
- Пример решателя в Excel VBA
- То, что нужно запомнить
- Рекомендуемые статьи
Включить решатель на листе
Решатель — это скрытый инструмент, доступный на вкладке «Данные» в Excel (если он уже включен).
Использование SOLVER в excelSOLVER в ExcelРешатель в Excel — это инструмент анализа, который помогает находить решения сложных бизнес-задач, требующих принятия важных решений. Для каждой проблемы определяются цель (задачи), переменные и ограничения. Решатель возвращает оптимальное решение, которое устанавливает точные значения переменных, удовлетворяет всем ограничениям и соответствует цели. читать далее, во-первых, нам нужно включить эту опцию. Выполните следующие шаги.
Шаг 1: Перейдите на вкладку ФАЙЛ. На вкладке ФАЙЛ выберите «Параметры».
Шаг 2: В окне «Параметры Excel» выберите «Надстройки».
Шаг 3: Внизу выберите «Надстройки Excel» и нажмите «Перейти».
Шаг 4: Теперь установите флажок «Надстройка Solver». Нажмите «ОК».
Затем вы должны увидеть «Решатель» на вкладке «Данные».
Включить решатель в VBA
В VBA Solver является внешним инструментом. Итак, нам нужно включить его, чтобы использовать его. Выполните следующие шаги, чтобы включить его.
Шаг 1: Перейдите в Инструменты >>> Справочник в окне редактора Visual Basic.
Шаг 2: В списке ссылок выберите «Решатель» и нажмите «ОК», чтобы использовать его.
Теперь мы можем использовать Solver и в VBA.
Функции решения в VBA
Чтобы написать код VBAНапишите код VBAКод VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи. Подробнее, нам нужно использовать три «решателя». Функции» в VBA: «SolverOk», «SolverAdd» и «SolverSolve».
SolverOk
SolverOk (SetCell, MaxMinVal, ValueOf, ByChange, Engine, EngineDesc)
Сетцелл: Это будет ссылка на ячейку, которую необходимо изменить, т. е. на ячейку «Прибыль».
МаксМинВал: Это необязательный параметр. Ниже приведены числа и спецификаторы:
- 1 = развернуть
- 2 = Свернуть
- 3 = соответствует определенному значению
Значение: Этот параметр необходимо указать, если МаксМинВал аргумент 3.
По изменению: Меняя ячейки, нужно решить это уравнение.
СолверДобавить
Теперь давайте посмотрим параметры СолверДобавить.
CellRef: Чтобы задать критерии для решения задачи, какую ячейку нужно изменить?
Связь: Если логические значения удовлетворены, мы можем использовать числа ниже.
- 1 меньше (<=)
- 2 равно (=)
- 3 больше, чем (>=)
- 4 обязательных конечных значения, которые являются целыми числами.
- 5 обязательных значений от 0 до 1.
- 6 обязательных окончательных значений, которые все разные и являются целыми числами.
Пример решателя в Excel VBA
.free_excel_div{фон:#d9d9d9;размер шрифта:16px;радиус границы:7px;позиция:относительная;margin:30px;padding:25px 25px 25px 45px}.free_excel_div:before{content:»»;фон:url(центр центр без повтора #207245;ширина:70px;высота:70px;позиция:абсолютная;верх:50%;margin-top:-35px;слева:-35px;граница:5px сплошная #fff;граница-радиус:50%} Вы можете скачать этот шаблон Excel для VBA Solver здесь — Шаблон Excel решателя VBA
Посмотрите на приведенный ниже сценарий.
Используя эту таблицу, нам нужно определить сумму «Прибыли», которая должна быть не менее 10 000. Чтобы прийти к этому числу, у нас есть определенные условия.
- Единицы для продажи должно быть целым числом.
- Цена / ед. должно быть от 7 до 15.
Исходя из этих условий, мы должны определить, сколько единиц нужно продать. По какой цене получить прибыль в размере 10 000?
Теперь решим это уравнение.
Шаг 1: Запустите подпроцедуру VBAVBA SubprocedureSUB в VBA — это процедура, которая содержит весь код, который автоматически дает оператор end sub, а средняя часть используется для кодирования. Оператор Sub может быть как общедоступным, так и частным, а имя подпроцедуры является обязательным в VBA. Подробнее.
Код:
Sub Solver_Example() End Sub
Шаг 2: Во-первых, нам нужно установить ссылку на ячейку ObjectiveCell ReferenceCell в Excel, которая отсылает другие ячейки к ячейке, чтобы использовать ее значения или свойства. Например, если у нас есть данные в ячейке A2 и мы хотим использовать их в ячейке A1, используйте =A2 в ячейке A1, и это скопирует значение A2 в A1. SolverOk функция.
Шаг 3: Первый аргумент этой функции — «SetCell», в этом примере нам нужно изменить значение ячейки «Прибыль», ячейка B8.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8») End Sub
Шаг 4: Нам нужно установить значение этой ячейки на 10 000. Таким образом, для МаксМинВал, используйте 3 в качестве значения аргумента.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3 End Sub
Шаг 5: Следующий аргумент Значение значение должно быть 10000.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000 End Sub
Следующий аргумент — ByChange, т. е. заменой каких ячеек нужно решить это уравнение. В этом случае необходимо изменить ячейки «Единицы» на «Продажа» (B1) и «Цена за единицу» (B2).
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») End Sub
Примечание: остальные аргументы здесь не требуются.
Шаг 6: Как только мы установили целевую ячейку, мы должны построить другие критерии. Итак, для этого открываем функцию «SolverAdd».
Шаг 7: Первый Ссылка на ячейку нам нужно изменить, это цена за единицу ячейки, ячейка B2.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2») End Sub
Шаг 8: Эта ячейка должна быть >= 7, поэтому Связь аргумент будет 3.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2»), Relation:= 3 Конец сабвуфера
Шаг 9: Значение этой ячейки должно быть >=7, Fформула Текст = 7.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2»), Relation:= 3, FormulaText:=7 End Sub
Шаг 10: Точно так же эта же ячейка должна быть меньше 15, поэтому для этого связь is <= т.е. 1 в качестве значения аргумента.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2»), Relation:= 3, FormulaText:=7 SolverAdd CellRef:=Range(«B2»), Relation:=1, FormulaText:=15 End Sub
Шаг 11: Первая ячейка «Единицы для продажи» должна быть целым числом. Итак, для этого также установите критерии ниже.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2»), Relation:= 3, FormulaText:=7 SolverAdd CellRef:=Range(«B2»), Relation:=1, FormulaText:=15 SolverAdd CellRef:=Range(«B1″), Relation:=4, FormulaText:=»Integer» End Sub
Шаг 12: На последнем шаге нам нужно добавить функцию SolverSolve.
Код:
Sub Solver_Example() SolverOk SetCell:=Range(«B8»), MaxMinVal:=3, ValueOf:=10000, ByChange:=Range(«B1:B2») SolverAdd CellRef:=Range(«B2»), Relation:= 3, FormulaText:=7 SolverAdd CellRef:=Range(«B2»), Relation:=1, FormulaText:=15 SolverAdd CellRef:=Range(«B1″), Relation:=4, FormulaText:=»Integer» SolverSolve End Саб
Запустите код, нажав клавишу F5, чтобы получить результат.
Когда вы запустите код, вы увидите следующее окно.
Нажмите «ОК». Вы получите результат в виде листа Excel.
Итак, чтобы получить прибыль в размере 10 000, нам нужно продать 5 000 единиц по 7 за каждую цену, где себестоимость равна 5.
То, что нужно запомнить
- Чтобы работать с Solver в Excel и VBA, сначала включите его для рабочего листа, а затем включите его для справки VBA.
- Однажды мы включили его на листах и в VBA; мы можем получить доступ только ко всем функциям Solver.
Рекомендуемые статьи
Эта статья была руководством по VBA Solver. Здесь мы обсудим, как включить и использовать Solver в Excel VBA с помощью примера и загружаемого листа Excel. Вы можете узнать больше из следующих статей: –
- ПОИСК VBA
- Менеджер сценариев в Excel
- Анализ чувствительности в Excel
Цель лабораторной
работы
Лабораторная
работа предназначена для получения
практических навыков создания кодов
VBA в EXCEL,
что предполагает знание свойств и
методов таких объектов EXCEL,
как: Application,
Workbook,
Worksheet,
Range.
Основные
сведения об объектах, методах и свойствах
EXCEL
В модели объектов
Excel
имеются более 100 объектов и семейств.
Однако, практически использование
только небольшого количества объектов
достаточно, чтобы выполнить большинство
всех возможных действий. Наиболее часто
используемыми объектами являются
объекты Application,
Workbook
(Workbooks),
Worksheet
(Worksheets)
и Range.
1)
Application
(приложение) — само приложение MS
EXCEL
в целом. Включает глобальные устанавливаемые
параметры (стиль ссылок, режим проведения
вычислений) и встроенные функции MS
EXCEL.
Объект Application.Excel
имеет свойство-участник (встроенный
объект) Workbooks,
возвращающее Workbooks
— коллекцию всех открытых книг. Каждый
элемент коллекции — рабочая книга —
является объектом класса Workbook.
Свойствами
объекта Application
являются:
ActiveWorkbook
— активная рабочая книга
ActiveWindow
— активное окно
Например:
MsgBox
«имя активной рабочей книги» &
ActiveWorkbook.Name
Методы объекта
Application:
Quit
— завершает работу с EXCEL;
Undo
— отменяет последнее выполненное действие
2) Workbook
(рабочий лист) — объект этого класса
определяет состояние рабочей книги.
Например, не является ли она доступной
только для чтения, или какой из листов
рабочей книги активен в настоящий
момент. К этому классу принадлежит
объект ActiveWorkbook
(активная в настоящий момент рабочая
книга).
Объект Workbook,
представляющий одну рабочую книгу,
имеет свойство Sheets.
При обращении к этому свойству возвращается
объект Sheets
— коллекция листов данной книги. Каждый
элемент коллекции — лист — имеет свой
тип и поэтому является объектом класса
Worksheet
(рабочий лист) или Chart
(диаграмма).
Свойства объект
Workbook:
ActiveSheet
— активный рабочий лист
Name
— имя рабочей книги
Методы объекта
Workbook:
Activate
-активизирует рабочую книгу
Close
— закрывает рабочую книгу
Save
— сохраняет рабочую книгу
3) Worksheet
(рабочий лист) — Объект этого класса
используется при копировании и удалении
рабочих листов, их скрытии и показе,
проведении вычислений для формул
рабочего листа. К этому классу принадлежит
объект ActiveWorksheet
(активный в настоящий момент рабочий
лист).
Свойства объекта
Worksheet:
Name
— имя рабочего листа
Previous
— предыдущий рабочий лист
Visible
— режим видимости рабочего листа (скрыт
или показан)
Методы объекта
Worksheet
Activate
— активизирует рабочий лист
Calculate
— заново вычисляет значения в ячейках
рабочего листа
Delete
— удаляет рабочий лист
Protect
— защищает рабочий лист
Объект Worksheet,
представляющий один рабочий лист, имеет
свойство Cells,
возвращающее объект Range.
Он может задавать как все ячейки рабочего
листа, так и любую ее часть.
4) Range
(интервал). Объект этого класса позволяет
изменять свойства интервала ячеек
(например, шрифт), проверять или изменять
содержимое ячеек, вырезать или копировать
интервал и так
далее.
К основным
свойствам объекта Range
относятся:
Cells,
Columns,
Rows
— возвращают коллекции ячеек, столбцов
или строк, входящие в объект Range.
Column,
Row
— возвращают соответственно номер
первого столбца или первой строки в
области объекта Range
позволяет прочесть или задать формулу
в формате А1
или в формате R1C1.
Value
— значение указанной ячейки. Если она
пуста, то возвращается значение Empty,
что можно проверить, вызвав функцию
IsEmpty.
Font
— используемый в интервале шрифт
Formula
— формула интервала
Name
— имя
интервала
Синтаксис установки
значения объекта:
Объект.Свойство
= значение
Здесь
значение может быть константой или
формулой, возвращающей постоянное
значение, и принадлежит к одному из трех
типов:
1) Числовое значение.
Например, для
установки размера шрифта:
ActiveCell.Font.Size
= 14
2) Строка символов.
Например:
ActiveCell.Font.Name
= «Courier New Cyr»
3)
Логическое
значение:
ActiveCell.Font.Italic
= True
К основным методам
объекта Range
относятся:
Clear
— полностью очищает интервал (в том числе
и форматирование)
ClearContents
— очищает содержимое ячеек интервала
ClearFomats
— очищает форматирование ячеек интервала
Copy
— копирует интервал в буфер обмена
Offset
— возвращает интервал с указанным
смещением относительно первоначального
интервала
Paste
— вставляет содержимое буфера обмена в
интервал
Select
— выделяет интервал
Синтаксис вызова
метода объекта:
Объект.Метод[аргументы]
Например:
Range(«Al:B2″).Select
Содержание
лабораторной работы
Создать 3 таблицы
на разных рабочих листах. Первая таблица
содержит информацию о работающих
(Табельный номер, Фамилия, Разряд), вторая
— справочник по разрядам (Разряд, Оклад).
Третья должна содержать сведения о
начислении зарплаты (Табельный номер,
Фамилия, Коэффициент отработанного
времени, Начислено).
Требуется написать
VBA-код для заполнения таблиц. Ввод
информации в исходные таблицы должен
быть организован с использованием
пользовательских диалоговых окон
(форм).
A |
B |
C |
|
1 |
Таб. номер |
Фамилия |
Разряд |
2 |
1001 |
Иванов |
12 |
3 |
1002 |
Петров |
15 |
4 |
1003 |
Сидоров |
13 |
5 |
1004 |
Марков |
14 |
Таблица 1
A |
B |
|
1 |
Разряд |
Оклад |
2 |
10 |
400 |
3 |
11 |
500 |
4 |
12 |
600 |
5 |
13 |
700 |
6 |
14 |
800 |
7 |
15 |
900 |
Таблица 2
A |
B |
C |
D |
|
1 |
Таб. |
Фамилия |
Коэффициент |
Начислено |
2 |
1001 |
Иванов |
1 |
600 |
3 |
1002 |
Петров |
0,8 |
720 |
4 |
1003 |
Сидоров |
0,9 |
630 |
5 |
1004 |
Марков |
0,7 |
560 |
Таблица 3
Выполнение
лабораторной работы
1. Загрузить EXCEL.
Сохранить рабочую книгу с именем
Lab4.xls.
2. Перейти в редактор
VBA.
(СервисМакросРедактор Visual
Basic).
3. Добавить 3 формы
в проект.
(ВставкаUserForm).
4. Переименовать
формы в «Главная», «Сведения»
и «Справочник», используя окно
свойств каждой формы.
5. В форму «Главная»
добавить 4 кнопки:
Name-cm_1,
Caption —
«Сведения»,
Name
-cm_2. Caption
-«Справочник»,
Name—
cm_3,
Caption
«Обработка»
Name
— cm_4,
Caption
«Выход».
Для
переименования кнопок использовать
окно свойств каждой из этих кнопок.
6. В форму «Сведения»
добавить 3 поля с именами TextBox1,
TextBox2
, TextBox3.
Рядом с этими полями соответственно
добавить три надписи: «Табельный
номер», «Фамилия», «Разряд»
и две кнопки:
Name —
cm_ok. Caption
—
«OK»
Name —
cm_exit, Caption
—
«Выход».
7. В форму «Справочник»
добавить 2 поля с именами TextBox1и
TextBox2.
Рядом с этими полями соответственно
добавить две надписи: «Разряд», »
Оклад».
Две
кнопки:
Name
-cm_ok, Caption
-«OK»
Name
-cm_exit, Caption
-«Выход».
8. Проверить вид
каждой формы (Запуск3апуск
подпрограммы/UserForm)
9. Назначить каждой
кнопке соответствующую процедуру
(VBA-код).
Для этого дважды
щелкнуть по каждой из вставленных в
формы кнопок в режиме конструктора и
ввести в окне редактора VBA текст
соответствующей процедуры.
В форме «Главная»
кнопке cm_1
(«Сведения») назначить процедуру:
Private Sub
cm_l_Click()
Sheets(1).Activate
Range(«A:D»).Clear
ActiveSheet.Cells(1,
1) = «Таб.
номер»
ActiveSheet.Cells(l,
2) = «Фамилия»
ActiveSheet.Cells(l,
3) = «Разряд»
Cells(1,
1).Activate
Сведения.Show
End
Sub
В форме «Главная»
кнопке cm_2
(«Справочник») назначить процедуру:
Private Sub
cm_2_Click()
Sheets(2).Activate
Range(«A:D»).Clear
ActiveSheet.Cells(1,
1) = «Разряд»
ActiveSheet.Cells(1,
2) = «Оклад»
Cells(1,
1).Activate
Справочник.Show
End
Sub
В форме «Главная»
кнопке cm_3
(«Обработка») назначить процедуру:
Private Sub
cm_3_Click()
Calculation
End Sub
В форме «Главная»
кнопке cm_4
(«Выход») назначить процедуру:
Private Sub
cm_4_Click()
End
End Sub
В форме «Сведения»
кнопке cm_OK
(«OK»)
назначить процедуру:
Private Sub
cm_OK_Click()
Dim i As
Integer
Sheets(1).
Activate
ActiveCell.Offset(1,
0).Activate
i =
ActiveCell.Row
‘ вместо предыдущих
двух. строк для записи данных в
‘ ту же книгу можно
использовать оператор:
‘ i =
Range(«Al»).CurrentRegion.Rows.Count+1
ActiveSheet.Cells(i,
1) = TextBox1
ActiveSheet.Cells(i,
2) = TextBox2
ActiveSheet.Cells(i,
3) = TextBox3
i
= ActiveCell.Row + 1
End
Sub
В форме «Сведения»
кнопке cm_exit
(«Выход») назначить процедуру:
Private Sub
cm_exit_Click()
Hide
End
Sub
В форме «Справочник»
кнопке cm_OK
(«OK»)
назначить процедуру:
Private Sub
cm_OK_Click()
Dim i As
Integer
Sheets(2).Activate
ActiveCell.Offset(1,0).Activate
i =
ActiveCell.Row
ActiveSheet.Cells(i,
1) = TextBox1
ActiveSheet.Cells(i,
2) = TextBox2
i
= ActiveCell.Row
+ 1
End
Sub
В форме «Справочник»
кнопке cm_exit
(«Выход») назначить процедуру:
Private Sub
cm_exit_Click()
Hide
End
Sub
10. Вставить в модуль
(Модуль1) процедуру Calculation,
для этого в окне проекта
(ВидОкно проекта)
предварительно выделить Модуль1 и ввести
текст:
Sub
Calculation()
Sheets(3).Activate
Range(«A:D»).Clear
ActiveSheet.Cells(1,
1) = «Таб.номер»
ActiveSheet.Cells(1,
2) = «Фамилия»
ActiveSheet.Cells(1,
3) = «Коэффициент»
ActiveSheet.Cells(1,
4) = «Начислено»
i=2
J=2
Do
While Sheets(1).Cells(j, 1)
<>
«»
ActiveSheet.Cells(i,
1)= Sheets(l).Cells(j, 1)
ActiveSheet.Cells(i,
2) = Sheets(1).Cells(j, 2)
ActiveSheet.Cells(i,
3) = InputBox(«Коэффициент
<=1»,, «1»)
k=2
Do While
Sheets(2).Cells(k, 1) <> «»
If
Sheets(1).Cells(j, 3) = Sheets(2).Cells(k, 1) Then
ok =
Sheets(2).Cells(k, 2)
End If
k=k+1
Loop
ActiveSheet.Cells(i,
4) = ActiveSheet.Cells(i, 3) * ok
J=J+1
i = i+ 1
Loop
End Sub
11. Добавить на
рабочий лист кнопку:
Name
– cm,
Caption
— «Расчет
зарплаты»
и назначить ей в
режиме конструктора процедуру:
Private Sub
cm_Click()
Главная.Show
End Sub
-
Используя
кнопку «Расчет зарплаты» на рабочем
листе, выполнить построенное приложение.
ЛАБОРАТОРНАЯ
РАБОТА №5.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Время на прочтение
7 мин
Количество просмотров 312K
Приветствую всех.
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Появилась вкладка.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Sub FormatPrice()End Sub
Напишем Hello World:
Sub FormatPrice()
MsgBox "Hello World!"
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
' Exit Sub ' Это значит "выйти из процедуры"
MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As Integer) As Integer
' Exit Function
LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
Dim s1 As String, s2 As String
s1 = "str1"
s2 = "str2"
If s1 <> s2 Then
foo "123", "456" ' Скобки при вызове процедур запрещены
End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
' Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ' Конвертация чего угодно в String
If i = 5 Then Exit For
Next iDim x As Double
x = Val("1.234") ' Парсинг чисел
x = x + 10
MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
x = 5 / 0
MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
x = 5 / 0
MsgBox "OK!"
GoTo ne
Err:
MsgBox
"Err!"
ne:
On Error GoTo 0 ' Отключаем обработку ошибок
' Циклы бывает, какие захотите
Do While True
Exit DoLoop 'While True
Do 'Until False
Exit Do
Loop Until False
' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
' Val также умеет возвращать Integer
Select Case LengthSqr(Len("abc"), Val("4"))
Case 24
MsgBox "0"
Case 25
MsgBox "1"
Case 26
MsgBox "2"
End Select' Двухмерный массив.
' Можно также менять размеры командой ReDim (Preserve) - см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8Dim coll As New Collection
Dim coll2 As Collection
coll.Add "item", "key"
Set coll2 = coll ' Все присваивания объектов должны производится командой Set
MsgBox coll2("key")
Set coll2 = New Collection
MsgBox coll2.Count
End Sub
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets("result").Cells.Clear
Sheets("data").Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
- Считали группы из очередной строки.
- Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
- Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
- После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer) As String
GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As Integer) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As Integer) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ' строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Sheets(
"data").Activate
I = 2
Do While True
If GetCell(0, I).Value = "" Then Exit Do
' ...
I = I + 1
Loop
End Sub
Теперь надо заполнить массив Groups:
На месте многоточия
Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Sub AddHeader(Ty As Integer, Name As String)
GetCellS("result", 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub
Теперь надо перенести всякую информацию в result
For I2 = 0 To DataCount - 1
GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets("Result").Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Sub AddHeader(Ty As Integer, Name As String)
Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
' Чтобы не заводить переменную и не писать каждый раз длинный вызов
' можно воспользоваться блоком With
With GetCellS("result", 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
Select Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ' Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub
Уже лучше:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Sub AddHeader(Ty As Integer, Name As String)
With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
.HorizontalAlignment = xlCenterSelect Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ' Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ' строка в data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.
Урок № 15. Сводим всё вместе
Сводим всё вместе
В этом уроке мы попробуем написать нашу первую программу на Visual Basic — программу для решения квадратных уравнений. Может быть эта программа и не очень полезна в хозяйстве, но она хорошо вас ознакомит с принципами программирования на VB. Итак, приступим. Всмомним из урока 5 основные этапы разработки приложение на Visual Basic:
- Продумывание программы
- Проектирование интерфейса
- Написание программного кода
- Отлаживание программы
- Окончательная компиляция
Программу будем писать согласно этим пунктам:
1. Продумывание программы.
Что должна делать наша программа? — решать квадратные уравнения. Вспомним, как решаются квадратные уравнения.
Чтобы решить такое уравнение, нужно найти его дискриминант и затем, корни. Дискрименант ищется по формуле:
Если дискриминант > 0, то
X1 = (b + (корень из D)) / 2*a
X2 = (b — (корень из D)) / 2*a
Если дискриминант = 0, то
Если дискриминант Назначение элемента управления
A: — параметр A
txtParamA
B: — параметр B
txtParamB
C: — параметр C
txtParamC
Кнопка для запуска решения
cmdCalculate
Label, с вычисленным дискриминантом
lblD
Label, с корнем X1
lblX1
Label, с корнем X2
lblX2
Форма, содержащая все эти элементы
frmMain
Остальные элементы переименовывать не обязательно, т.к. мы к ним не будем обращаться в коде программы. Но, если хотите, можете переименовать. Приучайтесь к этому.
Интерфейс готов. Он конечно не претендует на звание самого удобного и красивого интерфейса года ;), но для начала сойдёт. Всё равно, в дальнейшем, уже после написания кода программы, вы сможете изменить интерфейс по вашему вкусу.
3. Написание программного кода.
Теперь самое интересное! Мы будет писать код для нашей программы! Давайте ещё раз продумаем алгоритм работы программы:
-
Вводим исходные данные в тектовые поля (a,b,c). Напомню, что код для этого писать не нужно. За нас всё сделает Visual Basic и Windows. В этом то и заключается прелесть графического интерфейса пользователя (GUI). Мы только считаем введенные значения и всё.
После нажатия на кнопку, производим вычисление дискриминанта и корней.
Нам необходимо написать обработчик события клик (Click) нашей кнопки — cmdCalculate. Что значит обработчик события? Обработчик события — это процедура, которая будет выполняться всякий раз, когда произойдёт то или иное событие. Например собите Click. Оно происходит всякий раз при нажатии на кнопку. Т.е., если запустить программу на выполнение и не нажимать на кнопку cmdCalculate ничего не произойдёт. Но как только вы кликните по кнопке, произойдёт выполнение кода, который написан в процедуре обработки события Click (процедуре с именем cmdCalculate_Click). Он будет выполняться всякий раз, когда пользователь кликнет по кнопке. В этом то и состоит та самая Событийно-Управляемая модель программирования, которая отличается от плоских последовательных программ (Turbo Паскаля, например). Программирование на Visual Basic целиком и полностью базируется на этой Событийно-Управяемой модели.
Надеюсь, что вы уловили мою мысль. Если нет, то не отчаивайтесь, далее всё станет понятно.
Чтобы создать обработчик события Click необходимо сделать двойной клик по нашей кнопке cmdCalculate (при двойном клике, VB создаёт заготовку обработчика события — по-умолчанию. У кнопки, это событие Click, у формы — Load, у таймера — Timer и т.д.). Visual Basic создаст для вас заготовку процедуры, которая будет выглядеть следующим образом:
Private Sub cmdCalculate_Click()
Чтобы создать обработчик для другого события, необходимо выбрать событие в правом списке в окне кода:
В списке довольно много различных событий. В левом списке вы можете выбрать доступные элементы управления, которые помещены на форму. В данном случае в списке вы видите cmdCalculate. Очень удобно.
Так же, как и некоторое свойства элементов управления, события тоже повторяются. Например, событие Click. Оно есть и у элемента кнопки (Command Button), и у элемента метки (Label) и у многих других. Есть оно и у формы. Это очень облегчает процесс программирования. Не нужно тратить много времени на изучение каждого элемента управления, т.к. многое повторяется.
Заметьте также, что у процедуры обработки события Click нет входных параметров, о чём нам говорят пустые скобки. Добавить свои параметры в эту процедуру нельзя. У процедур обработки некоторых других событий могут быть параметры. Например, у события MouseMove (координаты курсора мыши) или KeyUp (код отжатой клавиши). Эти параметры передаются незаметно для программиста, и их можно использовать по своему усмотрению (а можно и вовсе не использовать).
Теперь давайте приступим непосредственно к программированию. Для начала объявим переменные с типом Double (для хранения вещественных чисел):
Private Sub cmdCalculate_Click()
    ’ объявляем переменные
     Dim paramA As Double
    Dim paramB As Double
    Dim paramC As Double
    Dim x1 As Double
    Dim x2 As Double
    Dim D As Double
End Sub
Теперь считаем введённые параметры a, b и с. Для этого присвоим переменным paramA, paramB и paramC значения свойства Text всех 3-х полей для ввода (TextBox’ов). Мы можем это сделать потому, что Visual Basic сам преобразует число в виде строки в обычное число с плавающей точкой.
paramA = txtParamA.Text
paramB = txtParamB.Text
paramC = txtParamC.Text
Доступ к свойству любого элемента управления осуществляется через точку, которая разделяет имя свойства и имя элемента. Обратите внимание на технологию Intellisence. Visual Basic выдает список доступных свойств этого элемента управления. Это очень удобно. Вам не придётся выучивать наизусть длинные и сложные названия свойств. Достаточно выбрать нужное свойство из списка и всё.
Теперь нам нужно рассчитать дискриминант. Для этого присвоим переменной D, которая будет хранить значение дискриминанта, следующее выражение:
D = (paramB * paramB) — (4 * paramA * paramC)
Скобки я поставил для наглядности. Ставить их в данном случае не обязательно, т.к. умножение всё равно выполниться до вычитания. (вспомните, что умножение имеет больший приоритет, чем вычитание).
Теперь, зная значение дискриминанта, нужно сравнить его с нулём. Если он больше нуля, то вычислить оба корня, если равен нулю, то вычислить один корень, ну а если меньше, то ничего не вычислять и выдать сообщение о том, что корней нет. Такое ветвление мы организуем с помощью оператора If:
If D > 0 Then
    x1 = (paramB + Sqr(D)) / (2 * paramA)
    x2 = (paramB — Sqr(D)) / (2 * paramA)
    lblD.Caption = «Дискременант: » & D
    lblX1.Caption = «Корень №1: » & x1
    lblX2.Caption = «Корень №2: » & x2
ElseIf D = 0 Then
    x1 = paramB / (2 * paramA)
    x2 = x1
    lblD.Caption = «Дискременант: » & D
    lblX1.Caption = «Корень №1: » & x1
    lblX2.Caption = «Корень №2 = Корню №1»
ElseIf D Then
    lblD.Caption = «Дискременант: » & D
    lblX1.Caption = «Корней нет!»
    lblX2.Caption = «»
    MsgBox «Дискременант меньше нуля! Корней нет!», vbCritical
End If
Не забывайте про отступы! С ними код намного нагляднее.
Корень мы вычисляем встроенной функцией VB — Sqr (от Square). В выражениях, которые мы присваиваем свойству Caption у меток, мы используем оператор конкатенации (склеивание строк). Им мы склеиваем строку слева от & со строкой справа. Откуда берётся строка справа? Ведь там переменные типа Double!? Как я уже говорил, Visual Basic неявно занимается преобразованием типов. В данном случае перед конкатенацией, числа Double сначала преобразуются в строку.
В принципе, программа уже готова. Давайте проверим её работоспособность. Нажмите кнопку Start. Появится наша форма. Введите значение в поля: a = 3, b = -6, c = 2. Нажмите на кнопку «Решить!». Если вы всё делати правильно, то должны увидеть следующую картину:
Дело в том, что строка для вывода в Label не вписывается в его размеры. Поэтому происходит перенос на следующую строчку. Чтобы этого избежать, закройте программу и установите свойство меток AutoSize в True (Совет: Чтобы не устанавливать это свойство 3 раза для каждой метки, выдели их сразу все 3 и установите свойство.). Свойство AutoSize — подгоняет размер метки так, чтобы текст в свойстве Caption полностью уместился в одну строчку и не переносился на другую. Теперь снова запустите программу, введите те же значения и нажмите на кнопку:
Теперь всё в порядке! Программа работает! Можете поэкперементировать, вводя разные значения коэффициентов.
Но, обратите внимение! Что произойдёт, если мы, не введя значения в поля , нажмём на кнопку? Что тогда присвоиться нашим переменным? Или, что будет, если мы введём нули в качестве коэффициентов? В обоих случаях Visual Basic сгенерирует ошибку. Почему? Ответ на этот вопрос мы разберём на следующем уроке.
Пример простейших макросов
Простейшие макросы
Программирование в 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
‘ Значение надо преобразовать в строковый тип данных
‘Применяем условие для решения квадратных уравнений
Решатель VBA
Решатель Excel VBA
Как вы решаете сложные задачи? Если вы не знаете, как решить эти проблемы, не о чем беспокоиться, у нас есть решение в нашем Excel. В нашей предыдущей статье «Решатель Excel» мы узнали, как решать уравнения в Excel. Если вы не в курсе, «SOLVER» доступен и в VBA. В этой статье мы расскажем вам, как использовать «Решатель» в VBA.
Вы можете использовать это изображение на своем веб-сайте, в шаблонах и т. д. Пожалуйста, предоставьте нам ссылку на авторство Как предоставить атрибуцию? Ссылка на статью должна быть гиперссылкой
Например:
Источник: VBA Solver (wallstreetmojo.com)
Включить решатель на листе
Решатель — это скрытый инструмент, доступный на вкладке данных в Excel (если он уже включен).
Использовать СОЛВЕР в excel ПОИСК В Excel Решатель в Excel — это инструмент анализа, который помогает находить решения сложных бизнес-задач, требующих принятия важных решений. Для каждой проблемы определяются цель (задачи), переменные и ограничения. Решатель возвращает оптимальное решение, которое устанавливает точные значения переменных, удовлетворяет всем ограничениям и соответствует цели.
читать далее во-первых, нам нужно включить эту опцию. Выполните следующие шаги.
Шаг 1: Перейдите на вкладку ФАЙЛ. На вкладке ФАЙЛ выберите «Параметры».
Шаг 2: В окне «Параметры Excel» выберите «Надстройки».
Шаг 3: Внизу выберите «Надстройки Excel» и нажмите «Перейти».
Шаг 4: Теперь установите флажок «Надстройка Solver» и нажмите «ОК».
Теперь вы должны увидеть «Решатель» на вкладке данных.
Включить решатель в VBA
В VBA Solver также является внешним инструментом; нам нужно включить его, чтобы использовать его. Выполните следующие шаги, чтобы включить его.
Шаг 1: Перейдите в Инструменты >>> Справочник в окне редактора Visual Basic.
Шаг 2: В списке ссылок выберите «Решатель» и нажмите «ОК», чтобы использовать его.
Теперь мы можем использовать Solver и в VBA.
Функции решения в VBA
К написать код VBA Напишите код VBA Код VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи. читать далее нам нужно использовать три «функции решателя» в VBA, и это функции «SolverOk, SolverAdd и SolverSolve».
SolverOk
SolverOk (SetCell, MaxMinVal, ValueOf, ByChange, Engine, EngineDesc)
Сетцелл: Это будет ссылка на ячейку, которую необходимо изменить, например, ячейка «Прибыль».
МаксМинВал: Это необязательный параметр, ниже приведены числа и спецификаторы.
- 1 = развернуть
- 2 = Свернуть
- 3 = соответствует определенному значению
Значение: Этот параметр необходимо указать, если МаксМинВал аргумент 3.
По изменению: Меняя ячейки, нужно решить это уравнение.
СолверДобавить
Теперь посмотрим параметры СолверДобавить
CellRef: Чтобы установить критерии для решения проблемы, какая ячейка должна быть изменена.
Связь: При этом, если логические значения удовлетворены, мы можем использовать приведенные ниже числа.
- 1 меньше ( =)
- 4 должен иметь конечные значения, которые являются целыми числами.
- 5 должен иметь значения от 0 до 1.
- 6 должен иметь окончательные значения, которые все разные и целые числа.
Пример решателя в Excel VBA
Для примера посмотрите на приведенный ниже сценарий.
Используя эту таблицу, нам нужно определить сумму «Прибыли», которая должна быть не менее 10000. Чтобы получить это число, у нас есть определенные условия.
- Единицы для продажи должно быть целым числом.
- Цена / ед. должно быть от 7 до 15.
Исходя из этих условий, нам нужно определить, сколько единиц нужно продать по какой цене, чтобы получить прибыль в размере 10000.
Хорошо, давайте сейчас решим это уравнение.
Шаг 1: Начать подпроцедура VBA Подпроцедура VBA SUB в VBA — это процедура, которая содержит весь код, который автоматически дает оператор end sub, а средняя часть используется для кодирования. Оператор Sub может быть как общедоступным, так и частным, а имя подпроцедуры является обязательным в VBA. читать далее .
Код:
Шаг 2: Сначала нам нужно установить цель ссылка на ячейку Ссылка на ячейку Ссылка на ячейку в Excel ссылается на другие ячейки на ячейку, чтобы использовать ее значения или свойства. Например, если у нас есть данные в ячейке A2 и мы хотим использовать их в ячейке A1, используйте =A2 в ячейке A1, и это скопирует значение A2 в A1. читать далее с помощью SolverOk функция.
Шаг 3: Первым аргументом этой функции является «SetCell», в этом примере нам нужно изменить значение ячейки «Прибыль», т.е. ячейки B8.
Код:
Шаг 4: Теперь нам нужно установить значение этой ячейки на 10000, поэтому для МаксМинВал используйте 3 в качестве значения аргумента.
Код:
Шаг 5: Следующий аргумент Значение значение должно быть 10000.
Код:
Следующим аргументом является ByChange, т.е. изменением ячеек, которые необходимо решить для этого уравнения. В этом случае, изменив «Единицы» на «Продажа» (B1) и «Цена за единицу» (B2), необходимо изменить ячейку.
Код:
Примечание: остальные аргументы здесь не требуются.
Шаг 6: После того, как целевая ячейка установлена, теперь нам нужно построить другие критерии. Для этого откройте функцию SolverAdd.
Шаг 7: Первый Ссылка на ячейку нам нужно изменить цену за единицу ячейки, т.е. ячейку B2.
Код:
Шаг 8: Эта ячейка должна быть >= 7, поэтому Связь аргумент будет 3.
Код:
Шаг 9: Значение этой ячейки должно быть >=7, т.е. Текст формулы = 7.
Код:
Шаг 10: Точно так же одна и та же ячейка должна быть меньше 15, поэтому для этого связь is
Шаг 11: Первая ячейка, т.е. Единицы для продажи, должна быть целым числом, для этого также настройте критерии, как показано ниже.
Код:
Шаг 12: В одном последний шаг, нам нужно добавить функцию SolverSolve.
Код:
Хорошо, запустите код, нажав клавишу F5, чтобы получить результат.
Когда вы запустите код, вы увидите следующее окно.
Нажмите Ok, и вы получите результат в виде листа Excel.
Таким образом, чтобы получить прибыль в размере 10 000, нам нужно продать 5 000 единиц по цене 7 за каждую, где себестоимость равна 5.
источники:
http://amcher.ru/2014/11/12/primer-prostejshih-makrosov/
http://voxt.ru/reshatel-vba/