Сводим всё вместе
В этом уроке мы попробуем написать нашу первую программу на Visual Basic — программу для решения квадратных уравнений. Может быть эта программа и не очень полезна в хозяйстве, но она хорошо вас ознакомит с принципами программирования на VB. Итак, приступим. Всмомним из урока 5 основные этапы разработки приложение на Visual Basic:
- Продумывание программы
- Проектирование интерфейса
- Написание программного кода
- Отлаживание программы
- Окончательная компиляция
Программу будем писать согласно этим пунктам:
1. Продумывание программы.
Что должна делать наша программа? — решать квадратные уравнения. Вспомним, как решаются квадратные уравнения.
Чтобы решить такое уравнение, нужно найти его дискриминант и затем, корни. Дискрименант ищется по формуле:
Если дискриминант > 0, то
X1 = (b + (корень из D)) / 2*a
X2 = (b — (корень из D)) / 2*a
Если дискриминант = 0, то
Если дискриминант Назначение элемента управления
Остальные элементы переименовывать не обязательно, т.к. мы к ним не будем обращаться в коде программы. Но, если хотите, можете переименовать. Приучайтесь к этому.
Интерфейс готов. Он конечно не претендует на звание самого удобного и красивого интерфейса года ;), но для начала сойдёт. Всё равно, в дальнейшем, уже после написания кода программы, вы сможете изменить интерфейс по вашему вкусу.
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, то можете, также как и в Бейсик, вообще не описывать предварительно переменные, используемые в программе, чего Вы не можете сделать, например, в Паскале.
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
Видео:Использование макросов VBA в MS Word для решения квадратного уравненияСкачать
Решатель 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.
💡 Видео
Решение системы уравнений в ExcelСкачать
Функции в VBA - (Серия VBA 19 - Часть 1: Теоретический базис)Скачать
VBA для начинающих - Первые шаги - Новый курс VBA (2)Скачать
Формулы в VBA - Три совета (Серия VBA 16)Скачать
Программирование на VBA Задачи 1-4Скачать
СЛАУ в VBA метод обратной матрицыСкачать
VBA. Программирование алгоритмов линейной структурыСкачать
Excel. Урок 65. Создаем форму на VBA. Добавляем данные из формы в конец таблицыСкачать
Актуальность и возможности макросов VBAСкачать
Как включить редактор VBA в ExcelСкачать
Что такое VBAСкачать
Цикл Do Loop (While/Until) - (Серия VBA 10)Скачать
Топ 3 худших программиста на YouTube! #код #айти #программистСкачать
Цикл For … Next - Новый курс VBA (8)Скачать
Ячейки в VBA: Как использовать Cells в VBA (Серия VBA 6)Скачать