Решаем счётные задачи с помощью 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 [9944 просмотра]
К этой статье пока нет комментариев, Ваш будет первым
Цель лабораторной
работы
Лабораторная
работа предназначена для получения
практических навыков создания кодов
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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Цель работы
Приобретение навыков написания программ на VBA с использованием циклических алгоритмов.
Постановка задания (задача №1)
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
Написать программу вычисления суммы (произведения) конечного числа элементов ряда с использованием цикла с параметром.
Варианты заданий
№ | Сумма (произведение) ряда |
1 |
$S_n = sumlimits_{n = 1}^{50} frac{cos(nx) + sin(nx)}{n + 1}$, |
2 | $P_n = prodlimits_{n = 1}^{10} frac{n cdot sin(n + 2)}{n^2 + 2}$ |
3 | $S_n = sumlimits_{n = 1}^{25} frac{n^3 + 5n^2 — 7n + 14 + 2cos(n)}{n^5 + 2n^3 — 4n + 11}$ |
4 | $P_n = prodlimits_{n = 1}^{20} frac{n^4 + 10n^3 — 8n^2 + 15n — 2n + 7}{3n^5 + 2n^3 — n + 17}$ |
5 | $S_n = sumlimits_{n = 1}^{50} frac{sin(nx) — cos(nx)}{n^3 + 4n + 5}$, $x$ вводится пользователем с клавиатуры |
6 |
$P_n = prodlimits_{n = 1}^{10} frac{a + n}{cos(a^n) cdot n}$, $a$ вводится пользователем с клавиатуры |
7 |
$S_n = sumlimits_{n = 1}^{100} frac{a cdot sin(a^n)}{n + a}$, |
8 |
$P_n = prodlimits_{n = 1}^{10} frac{n^x}{n^{x + 1} + 5n}$, $x$ вводится пользователем с клавиатуры |
9 | $S_n = sumlimits_{n = 1}^{50} frac{n cdot sin(n)}{n cdot sin(n) + 5n + 4}$ |
10 | $P_n = prodlimits_{n = 1}^{5} frac{cosfrac{1}{n} + n}{cosfrac{1}{n} + n + n^2}$ |
Образец выполнения (вариант №1)
Условие задания
$S_n = sumlimits_{n = 1}^{50} frac{cos(nx) + sin(nx)}{n + 1}$,
$x$ вводится пользователем с клавиатуры
Решение задачи с использованием макроса на VBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
‘ процедура (запускается при помощи макроса), вычисляющая конечную сумму ряда Sub Sum() ‘ раздел объявления переменны Dim x As Double ‘ значение, вводимое пользователем в ячейку A2 Dim S As Double ‘ рассчитываемая сумма конечного ряда Dim n As Integer ‘ счетчик цикла с параметром Dim current As Double ‘ значение текущего слагаемого ряда ‘ производим очистку от прошлых выводов Worksheets(«Task1»).Cells(2, «B»).ClearContents S = 0 ‘ перед накоплением суммы необходимое стартовое обнуление ‘ считываем значение переменной х, введенное пользователем в ячейку А2 x = Worksheets(«Task1»).Cells(2, 1) ‘ в цикле от 1 до 50 вычисляем очередной член ряда и добавляем к результирующей сумме For n = 1 To 50 Step 1 ‘ получаем значение текущего члена ряда конечной суммы current = (Cos(n * x) + Sin(n * x)) / (n + 1) ‘ добавляем значение текущего члена к итоговой сумме S = S + current Next n ‘ конец цикла со счетчиком ‘ выводим значение рассчитанной суммы в ячейку B2 Worksheets(«Task1»).Cells(2, 2) = S End Sub |
Решение задачи с использованием функции на VBA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
‘ функция (выбираемая пользователем вручную), вычисляющая конечную сумму ряда ‘ x — входной параметр, значение которого вводит пользователь с клавиатуры в ячейку А2 Function GetSum(x As Double) As Double ‘ раздел объявления переменны Dim S As Double ‘ рассчитываемая сумма конечного ряда Dim n As Integer ‘ счетчик цикла с параметром Dim current As Double ‘ значение текущего слагаемого ряда ‘ производим очистку от прошлых выводов Worksheets(«Task1»).Cells(2, «B»).ClearContents S = 0 ‘ перед накоплением суммы необходимое стартовое обнуление ‘ в цикле от 1 до 50 вычисляем очередной член ряда и добавляем к результирующей сумме For n = 1 To 50 Step 1 ‘ получаем значение текущего члена ряда конечной суммы current = (Cos(n * x) + Sin(n * x)) / (n + 1) ‘ добавляем значение текущего члена к итоговой сумме S = S + current Next n ‘ конец цикла со счетчиком GetSum = S ‘ возвращаем результат из функции End Function |
Результаты работы программы
Поскольку интерфейс программы одинаков, то приведем обобщенные результаты.
➡ Важно понимать, что для одного и того же значения переменной $x$, как макрос, так и функция получит одинаковый результат.
Тестирование через макрос
Тестирование через функцию
ВНИМАНИЕ | Для получения макроса или функции своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Постановка задания (задача №2)
Задание для всех вариантов звучит так (или, возможно, немного изменено, так как могут быть разные издания учебного пособия):
К задаче своего варианта необходимо написать пять программ, используя циклы с предусловием и постусловием.
Варианты заданий
№ | Условие |
1 |
Вычислить произведение вводимых пользователем с клавиатуры чисел, если числа считываются до тех пор, пока не будет введена единица. |
2 |
Вычислять и выводить в ячейки рабочего листа кубы вводимых пользователем с клавиатуры чисел до тех пор, пока не будет введено $3$. |
3 |
Вычислять и выводить в ячейки рабочего листа члены арифметической прогрессии до тех пор, пока очередной член прогрессии не окажется большим $50$. Первый член арифметической прогрессии равен $2$, разность равна $5$. |
4 |
Вычислять и выводить в ячейки рабочего листа члены геометрической прогрессии до тех пор, пока очередной член прогрессии не окажется большим $250$. Первый член геометрической прогрессии равен $3$, знаменатель равен $4$. |
5 |
Общий член последовательности задан формулой: $a_n = frac{n^2}{5}$. Вычислить сумму $n$ первых членов последовательности, меньших $75$. |
6 |
Общий член последовательности задан формулой: $a_n = frac{5n}{n^2 + 1}$. Вычислить сумму $n$ первых членов последовательности, больших $1$. |
7 |
Общий член последовательности задан формулой: $a_n = frac{n}{5} + 2n + 1$. Суммировать первые $n$ членов последовательности, до тех пор, пока сумма не окажется большей $100$. Вывести значение суммы и последнего $n$-го члена последовательности. |
8 |
Общий член последовательности задан формулой: $a_n = frac{n}{3} + n + 4$. Вычислять произведение первых $n$ членов последовательности до тех пор, пока произведение не окажется большим $1000$. Вывести значение произведения и последнего $n$-го члена последовательности. |
9 |
Первый член арифметической прогрессии равен $-50$, разность равна $7$. Вывести на в ячейки рабочего листа все члены данной арифметической прогрессии, меньшие нуля. |
10 |
Первый член арифметической прогрессии равен $90$, разность равна $-8$. Вычислить сумму всех положительных членов данной арифметической прогрессии. |
Образец выполнения (вариант №1)
Условие задания
Вычислить произведение вводимых пользователем с клавиатуры чисел, если числа считываются до тех пор, пока не будет введена единица.
Решение задачи с использованием макросов на VBA
Всего было закодировано $5$ различных макросов для всех видов циклов с пред- и постусловием.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
‘ решение задачи с использование цикла While-Wend Sub While_Wend() ‘ раздел объявления переменных Dim x As Integer ‘ значение, вводимое пользователем с клавиатуры Dim P As Long ‘ накапливаемое произведение вводимых чисел P = 1 ‘ при расчете произведения следует присвоить изначально результату 1 ‘ запрашиваем 1ое число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») ‘ пока пользователь не введет число, равное единице, продолжаем вычисления ‘ цикл выполняется, пока условие в заголовке цикла является ИСТИННЫМ While (x <> 1) P = P * x ‘ запрашиваем очередное число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») Wend ‘ выводим накопленное произведение в соот-щую ячейку листа Excel Worksheets(«Task2»).Cells(5, «B») = P End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
‘ решение задачи с использование цикла Do While-Loop Sub Do_While_Loop() ‘ раздел объявления переменных Dim x As Integer ‘ значение, вводимое пользователем с клавиатуры Dim P As Long ‘ накапливаемое произведение вводимых чисел P = 1 ‘ при расчете произведения следует присвоить изначально результату 1 ‘ запрашиваем 1ое число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») ‘ пока пользователь не введет число, равное единице, продолжаем вычисления ‘ цикл выполняется, пока условие в заголовке цикла является ИСТИННЫМ Do While (x <> 1) P = P * x ‘ запрашиваем очередное число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») Loop ‘ выводим накопленное произведение в соот-щую ячейку листа Excel Worksheets(«Task2»).Cells(6, «B») = P End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
‘ решение задачи с использование цикла Do Until-Loop Sub Do_Until_Loop() ‘ раздел объявления переменных Dim x As Integer ‘ значение, вводимое пользователем с клавиатуры Dim P As Long ‘ накапливаемое произведение вводимых чисел P = 1 ‘ при расчете произведения следует присвоить изначально результату 1 ‘ запрашиваем 1ое число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») ‘ пока пользователь не введет число, равное единице, продолжаем вычисления ‘ цикл выполняется, пока условие в заголовке цикла является ЛОЖНЫМ Do Until (x = 1) P = P * x ‘ запрашиваем очередное число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») Loop ‘ выводим накопленное произведение в соот-щую ячейку листа Excel Worksheets(«Task2»).Cells(7, «B») = P End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
‘ решение задачи с использование цикла Do-Loop While Sub Do_Loop_While() ‘ раздел объявления переменных Dim x As Integer ‘ значение, вводимое пользователем с клавиатуры Dim P As Long ‘ накапливаемое произведение вводимых чисел P = 1 ‘ при расчете произведения следует присвоить изначально результату 1 ‘ пока пользователь не введет число, равное единице, продолжаем вычисления ‘ цикл выполняется, пока условие в заголовке цикла является ИСТИННЫМ Do ‘ запрашиваем очередное число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») ‘ если введенное число не равно 1, то пересчитываем произведение If (x <> 1) Then ‘ пересчитываем произведение P = P * x End If Loop While (x <> 1) ‘ выводим накопленное произведение в соот-щую ячейку листа Excel Worksheets(«Task2»).Cells(8, «B») = P End Sub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
‘ решение задачи с использование цикла Do-Loop Until Sub Do_Loop_Until() ‘ раздел объявления переменных Dim x As Integer ‘ значение, вводимое пользователем с клавиатуры Dim P As Long ‘ накапливаемое произведение вводимых чисел P = 1 ‘ при расчете произведения следует присвоить изначально результату 1 ‘ пока пользователь не введет число, равное единице, продолжаем вычисления ‘ цикл выполняется, пока условие в заголовке цикла является ЛОЖНЫМ Do ‘ запрашиваем очередное число от пользователя x = InputBox(«Введите число х: «, «Сообщение для пользователя») ‘ если введенное число не равно 1, то пересчитываем произведение If (x <> 1) Then ‘ пересчитываем произведение P = P * x End If Loop Until (x = 1) ‘ выводим накопленное произведение в соот-щую ячейку листа Excel Worksheets(«Task2»).Cells(9, «B») = P End Sub |
Результаты работы программы
Программа имеет следующий интерфейс:
Для тестирования задачи необходимо последовательно запустить каждый из созданных нами ранее $5$ макросов:
Покажем результаты работы программы только при запуске макроса «While — Wend», так как результаты для других макросов будут абсолютно аналогичными.
Будем последовательно вводить следующие числа: $2$, $5$, $4$, $3$, $1$. При вводе числа $1$ программа прекратит свое исполнение и отобразит результат в соответствующей ячейке.
Каким должен быть ответ? Наша цель — найти произведение введенных чисел, то есть ответ будет равен — $2 cdot 5 cdot 4 cdot 3 = 120$.
В конечном итоге, после последовательного запуска всех макросов, в ячейки электронной таблицы будет выведен следующий результат:
💡 Делаем вывод, что все макросы отработали успешно и все заданные циклы с пред- и постусловием отработали корректно.
ВНИМАНИЕ | Для получения $5$ процедур своего варианта пишите на наш электронный адрес proglabs@mail.ru |
💡 Время нашего ответа обычно составляет не более 10 минут. |
Вводится последовательность чисел до тех пор, пока не будет введено два равных числа подряд.
Вывести элементы последова-тельности и посчитать их
количество.
Решение показано в Visual Basic ,
VBA (Word),
VBA (Excel)
- Запустить Visual Basic
- Двойным щелчком зайти в программный код, в окне событий выбрать Activate , ввести программу.
Программа , в которой вывод идет на форму Form 1
Private Sub Form_Activate()
Dim A( 1 To 100) As Integer
Dim i As Byte
Dim k As Integer
k = 2
A( 1 ) = Val(InputBox(«», «»))
A(2) = Val(InputBox(«», «»))
i = 1
Do Until A(i + 1) = A(i)
A(i + 2) = Val(InputBox(«», «»))
i = i + 1
k = k + 1
Loop
For i = 1 To k
Form 1 .Print A(i);
Next i
Form1.Print
Form1.Print k
End Sub
Программа , в которой вывод идет в файл C:out.txt
Private Sub Form_Activate()
Dim A(1 To 100) As Integer
Dim i As Byte
Dim k As Integer
Open “c:out.txt” For output as #1
k = 2
A(1) = Val(InputBox(«», «»))
A(2) = Val(InputBox(«», «»))
i = 1
Do Until A(i + 1) = A(i)
A(i + 2) = Val(InputBox(«», «»))
i = i + 1
k = k + 1
Loop
For i = 1 To k
Print #1, A(i);
Next I
Print #1,
Print #1, k
Close #1
End Sub
1.Запустить Microsoft Word 2003
2.Выполнить указанную последовательность команд
1.Запустить Microsoft Word 20 07
2.Выполнить указанную последовательность команд
1.Нажать команду создать
2.Откроется окно программного кода
3.Ввести программу
Sub последовательность()
Dim A(1 To 100) As Integer
Dim i As Byte
Dim k As Integer
k = 2
A(1) = Val(InputBox(«», «»))
A(2) = Val(InputBox(«», «»))
i = 1
Do Until A(i + 1) = A(i)
A(i + 2) = Val(InputBox(«», «»))
i = i + 1
k = k + 1
Loop
For i = 1 To k
Debug.Print A(i);
Next i
Debug.Print
Debug.Print k
End Sub
Примечание .
В Visual Basic
слова Private Sub и End Sub пишутся
автоматически при двойном щелчке
по форме.
В VBA
слова Sub название_макроса()
писать нужно самому.
1.Запустить программу (нажать значок в виде треугольника,
как на магнитофоне «Плэй» или Run;
2.Ответ отобразится в окне Immediate;
3.Алгоритм появления данного окна:
View – Toolbars – Debug – нажать на красный ! знак.
Sub последовательность ()
Dim A(1 To 100) As Integer
Dim i As Byte
Dim k As Integer
k = 2
A(1) = Range(“A1”)
A(2) = Range(“A2”)
i = 1
Do Until A(i + 1) = A(i)
A(i + 2) = Val(InputBox(«», «»))
i = i + 1
k = k + 1
Loop
Debug.Print k
End Sub
1.Запустить Microsoft Excel 20 07
2.Ввести в ячейку А1 число 1,
в ячейку А2 число 2.
3.Нажать Вид – Макрос – ввести
имя макроса – Создать –
написать программу в открытом
окне – запустить программу,
нажатием на Run – ответ
смотреть в окне Immediate.
Предложите, как улучшить StudyLib
(Для жалоб на нарушения авторских прав, используйте
другую форму
)
Ваш е-мэйл
Заполните, если хотите получить ответ
Оцените наш проект
1
2
3
4
5
Урок № 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/