МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Государственное образовательное учреждение высшего профессионального образования
«КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ ЭНЕРГЕТИЧЕСКИЙ УНИВЕРСИТЕТ»
Н.К. ПЕТРОВА, М.М. ВОЛЧЕНКО
ПРОГРАММИРОВАНИЕ НА VBA В ПРИМЕРАХ И ЗАДАЧАХ
ЧАСТЬ I. БАЗОВЫЕ АЛГОРИТМИЧЕСКИЕ СТРУКТУРЫ
Практикум к лабораторным работам, практическим занятиям, расчетному заданию и самостоятельной работе студентов по дисциплинам
«Информатика», «Компьютерные технологии в науке и образовании», «Программные средства информатики», «Новые информационные технологии»
Казань 2010
УДК 681.3 ББК 32.973 П78
Рецензенты:
кандидат физико-математических наук, доцент Татарского государственного педагогического университета И.Н. Голицына;
кандидат физико-математических наук, доцент Казанского государственного энергетического университета Р.А. Ишмуратов
П78 Петрова Н.К., Волченко М.М.
Программирование на VBA. Часть I. Базовые алгоритмические структуры. Практикум / Н.К. Петрова, М.М. Волченко. – Казань: Казан. гос. энерг. ун-т, 2010. – 55 с.
Предлагается своего рода «Задачник» по программированию, ориентированный на обучение студентов основам алгоритмизации математических и инженерных задач средствами языка VBA в приложении к Excel.
Содержание I части охватывает разделы программы, посвященные базовым алгоритмическим структурам: линейные программы, «ветвление», «цикл» — арифметический и итерационный. Изложение материала оформлено в виде отдельных разделов, в которых кратко представлены основные теоретические сведения.
Типовые задачи даются с подробными решениями. Имеется большое количество задач для самостоятельной работы. Задания делятся на три типа: 1 – умение «читать» готовые программы, 2 – разрабатывать программы по шаблонному алгоритму и 3 – разрабатывать программы с неявным алгоритмом.
Практикум предназначен для студентов всех специальностей КГЭУ, изучающих «Информатику».
УДК 681.3 ББК 32.973
© Казанский государственный энергетический университет, 2010
3
Предисловие
Вучебной литературе имеется не так много пособий по практической работе на VBA, ориентированных на решение математических, инженерных задач. Данный практикум разработан с целью восполнить существующий пробел. Он предназначен для обучения – самостоятельно или под руководством преподавателя – основам алгоритмизации с использованием языка VBA (Visual Basic for Application) в приложении к одному из самых популярных приложений MS Office – MS Excel.
Впрактикум включены типовые задачи и даются методы и примеры их решения. Каждому разделу предшествует краткое введение, состоящее из определений и описания операторов языка. Многочисленные примеры демонстрируют разные возможности работы с ячейками рабочего листа Excel, с диалоговыми окнами ввода и вывода. Основной акцент сделан на умение работать с математическими формулами, с числами в формате с плавающей и фиксированной точкой, грамотно сопоставлять фактические и формальные параметры при вызове программ как с листа Excel, так и из программ пользователя.
Втексте практикума приняты такие соглашения:
1.Элементы языка VBA в текстовой части практикума выделены
таким стилем.
2.Курсивом выделены новые термины, имена переменных в текстовой части практикума, в комментариях к операторам программ.
3.Примеры разбираемых программ даются, как правило, с комментариями, при этом текст программы пишется курсивом. Тексты программ для самостоятельного разбора приводятся, как правило, в рамке.
4.При описании структуры операторов[необязательные операнды] взяты в квадратные скобки, альтернативные параметры – Yes | No –
написаны через вертикальную черту.
5. В тексте используются следующие сокращения:
ОП – оперативная память; ПК – компьютер; п/п – программа-процедура; п/ф – программа-функция
При подготовке данного практикума авторы использовали многолетний опыт работы по преподаванию курса информатики в Казанском государственном энергетическом университете и Казанском государственном университете.
4
Общие теоретические сведения по программированию на VBA
I. Структура программ на VBA. Процедуры и функции пользователя
Программа VBA представляет собой совокупность процедур и функций, размещенных в зависимости от особенностей решаемой задачи, в одном или нескольких модулях. Каждый модуль имеет две области: общую область и область подпрограмм. В общей области помещаются операторы описания переменных, которые являются общими для всех процедур и функций этого модуля. В области подпрограмм помещается только код подпрограммы.
В VBA программный код, реализующий какие-либо действия, оформляется в виде процедур и функций. Благодаря этому создаваемые программы имеют хорошую структурированность и наглядность. Разработанные отдельные функции или процедуры можно накапливать в библиотеках и в дальнейшем использовать их по мере необходимости.
Программа-процедура (п/п) на VBA имеет следующую структуру:
[Private|Public] Sub ИмяПроцедуры (СпискиПараметров) <<Тело п/п>>
End Sub
где [Private|Public] – необязательные ключевые слова, определяющие область видимости программы; Sub – ключевое слово, определяющее тип п/п. ИмяПроцедуры – имя п/п (дает сам пользователь). СписокПараметров служит для передачи процедуре исходных данных для вычислений (может отсутствовать). Он состоит из элементов списка, разделенных запятыми.
Этот элемент списка параметров имеет синтаксис:
ИмяЭлемента [As ТипДанных]
где ИмяЭлемента – идентификатор; As – ключевое слово; ТипДанных – тип данных элемента списка (Табл. 1.1).
Процедура пользователя может быть вызвана из другой п/п оператором Call или указанием ее имени.
5
Например: |
|
Private Sub Prog1( ) |
Начало процедуры с именем Prog( ) |
Dim t As Integer |
Описание типа переменной t |
t = 2 |
Присвоение переменной t значения 2 |
Call Prog2 (t) |
Вызов процедуры Prog2 (t) с фактическим |
[Другие операторы] |
параметром t |
Prog2 (t) |
другой способ вызова п/п Prog2 |
[Другие операторы] |
|
End Sub |
Конец процедуры Prog1 |
Public Sub Prog2(x As |
Начало п/п Prog2 с формальным параметром х |
Integer) |
|
MsgBox x |
Выдача значения x в специальном окне |
End Sub |
Конец процедуры Prog2 |
Программа–функция (п/ф) – это программа, которая выполняет действия в пределах своего блока и возвращает единственное значение. Функция пользователя имеет следующий вид:
[Private|Public]Function ИмяФункции([СпискиПараметров])[As ТипДанных]
<<Тело п/ф>>
ИмяФункции = ВозвращаемоеЗначение
End Sub
Function – ключевое слово, указывающее на то, что это функция; остальные параметры те же, что и в Sub. ВозвращаемоеЗначение – значение, возвращаемой функцией.
Обращение к п/ф может производиться из процедуры другой функции. Если в функции предусмотрено рекурсивное обращение, то ее можно вызвать из нее самой. Если функция записана в модуле, то ее можно вызвать из Excel с помощью Мастера функций, так как функция пользователя заносится в библиотеку функций.
Пример:
Private Sub Prog3( ) Dim u,t As Integer
t = 2
y = Func ( t ) [Другие операторы] End Sub
Public Function Func(x As Integer) As Integer
f % = x ^ 2 + x + 5
func = f % End Function
6
Начало вызывающей п/п Задание типа переменным u,t
Присвоение переменной t значения 2 Вызов п/ф Func с фактическим аргументом t
Конец п/п
Начало п/ф Func, имеющей целочисленный тип. Формальный аргумент t имеет целочисленный тип
Вычисление полинома по t и присвоение результата целочисленной переменной f % Присвоение возвращаемого значения Конец п/ф
При работе с обоими типами программ следует аккуратно соблюдать соответствие между фактическими и формальными параметрами, как по количеству их, так и по типу.
II. Типы констант. Представление числовых констант в формате с фиксированной и плавающей десятичной точкой
Константой называется некоторая величина, не изменяющая своего числового или символьного значения в течение выполнения всей программы. Имеются два типа константчисловые и символьные.
Числовые константы: представляют собой положительные или отрицательные числа двух видов:
а) целочисленные, представляющие собой положительные и отрицательные числа и ноль, при их записи не должна использоваться
десятичная запятая: -100 |
2 |
0 +458 ; |
||
б) вещественные константы – все действительные числа, включая и |
||||
целые. Записываются в двух форматах: |
100. |
–0.001 |
+2.563 |
|
с фиксированной точкой, например, |
||||
(вместо десятичной запятой используется при записи точка) |
||||
с плавающей точкой, например, |
2.5·10-2, записываемое как |
|||
2.5Е-02 или 2.5D-02. |
Здесь |
2.5 – |
мантисса, Е, D – |
десятичная |
экспонента одинарной (Е) или двойной (D) точности.
Например: 1,5 10-3 1.5Е-3=0.15Е-02=15Е-04=0.0015,
150000 1.5Е+05,
0,0000254 2.54Е-05.
7
III. Объявление переменных на VBA
Переменные – это объекты, предназначенные для хранения данных. В различные моменты времени переменные могут хранить разные значения. Имена переменных позволяют различать их в программе, осуществлять доступ к различным участкам памяти для записи данных и их извлечения.
Перед использованием переменных в программе их нужно объявить (декларировать). При объявлении переменной необходимо указать, что объявляется переменная, задать имя переменной и указать ее тип. Тип определяет способ представления/хранения переменной в оперативной памяти.
Для эффективного использования памяти и времени ПК необходимо правильно выбрать тип переменной. Объявить переменную – значит заранее сообщить программе о ее существовании. Объявление переменной производится специальным оператором: Dim переменная [As тип]
Одновременно с объявлением переменной после ее имени можно
записать ключевое слово |
As, после которого |
задается |
тип переменной |
(Табл. 1.1). |
Dim power As |
||
Например: оператор |
single |
приписывает |
переменной power вещественный тип одинарной точности.
Задать тип переменной также можно, используя специальный символ в конце имени – постфикс (см. табл. 2) – или, используя инструкцию
DefТип.
Например, если на уровне модуля дана инструкция DefInt I-N, это означает, что всем переменным, имена которых начинаются с букв, лежащих в диапазоне от I до N (и прописных, и строчных), в программах данного модуля будет присвоен тип Integer. Другие значения инструкции DefТип представлены в Табл. 1.2.
8
Таблица 1.1 Некоторые типы переменных VBA
Тип |
Хранимая |
Занимаемая |
Диапазон значений |
|
информация |
память |
|||
Целочисленные типы |
||||
Byte |
Целые числа |
1 байт |
От 0 до 255 |
|
Boolean |
Логические |
2 байт |
True или False |
|
значения |
||||
Integer |
Целые числа |
2 байт |
От -32 768 до 32 767 |
|
Long |
Длинное целое |
4 байт |
От -2 147 483 648 до 2 147 483 |
|
647 |
||||
Типы с плавающей точкой |
||||
От -3,402823E38 до |
||||
Вещественные |
-1,401298E-45 |
|||
Single |
числа с плавающей |
4 байт |
для отрицательных значений; |
|
точкой одинарной |
(7 цифр) |
от 1,401298E-45 до |
||
точности |
3,402823E38 |
|||
для положительных значений |
||||
От -1,79769313486232E308 |
||||
Вещественные с |
до -4,94065645841247E-324 |
|||
8 байт |
для отрицательных значений; |
|||
Double |
плавающей точкой |
|||
(15 цифр) |
от 4,94065645841247E-324 |
|||
двойной точности |
||||
до 1,79769313486232E308 для |
||||
положительных значений |
||||
Строковые типы |
||||
Текстовая |
||||
String |
информация |
10 байт + 1 байт |
От 0 до приблизительно |
|
(строка) переменной |
на каждый символ |
2 миллиардов символов |
||
длины |
||||
String*n |
Строка постоянной |
Длина строки |
От 1 до приблизительно |
|
длины в n символов |
65 400 |
|||
Типы Variant |
||||
Variant |
Значения любого из |
16 байт для чисел; |
Любое числовое или |
|
перечисленных |
22 байт + 1 байт |
строковое значение вплоть до |
||
типов данных |
на каждый символ |
границ диапазона для типа |
||
строки |
Double. |
|||
9
Таблица1.2. ЗначенияинструкцииDefТиписоответствующихпостфиксов
Инструкция |
Тип данных |
Постфикс |
Инструкция |
Тип данных |
Постфикс |
DefBool |
Boolean |
нет |
DefSng |
Single |
! |
DefByte |
Byte |
нет |
DefDbl |
Double |
# |
DefInt |
Integer |
% |
DefStr |
String |
$ |
DefLng |
Long |
& |
DefVar |
Variant |
нет |
IV. Значения и типы переменных по умолчанию
Если в программах модуля операторы описания типа или постфиксы в именах переменных отсутствуют, то работает принцип умолчания
(табл. 1.3), согласно которому все переменные принимают тип Variant и
соответствующие значения. Применение данного типа позволяет выполнять операции, не обращая внимания на тип данных, которые они содержат. Удобен для объявления переменных, тип которых заранее неизвестен. Переменные этого типа могут содержать специальные значения: Empty (пусто), Null (Нуль), Error (ошибка).
Таблица 1.3. Значения и типы переменных разных типов по умолчанию
Тип |
Значение |
Тип |
Значение |
Тип |
Значение |
Boolean |
Ложь/False |
Single |
0,0 |
String |
““ |
Byte |
0 |
Double |
0,0 |
String*n |
“¬ . . . ¬“ |
Integer |
0 |
Long |
0 |
n пробелов |
|
Variant |
Empty, Null, Error |
Из таблицы следует, что если переменная описана как числовая
(любого типа – Byte, Integer, Long, Single, Double) то ее значение по умолчанию равно 0 (ноль). Для символьных переменных типа String значение по умолчанию «» – отсутствие символов, если String*n, то ее значение будет равно n пробелам. Для логических (Boolean) переменных значение по умолчанию будет «ложь»
Несколько правил для корректного использования разных типов данных в одной программе или в одном выражении:
1. Переменные, описанные с помощью DIM на уровне модуля, доступны для всех процедур в данном модуле. Переменные, описанные на уровне п/п, доступны только в данной п/п.
10
2.В операторах присваивания следует иметь в виду, что значение выражения может быть присвоено переменной, только если оно имеет совместимый с этой переменной тип данных. Невозможно присвоить строковое выражение числовой переменной или числовое выражение строковой переменной. Такая попытка приведет к ошибке во время компиляции.
3.Переменным типа Variant могут присваиваться как строковые, так и
числовые выражения. Однако обратное не всегда верно.
4.Присвоение выражения с одним из числовых типов переменной с другим числовым типом данных преобразует значение выражения в тип данных результирующей переменной. Например: если a % = 2.33, то а % будет иметь целое значение 2 (округление с недостатком) или b % = 2.65, то b % = 3 (округление с избытком), таким образом, присвоение вещественного числа целочисленной переменной приводит к округлению его до ближайшего целого (аналогично функции INT).
5.Если присваивается численное выражение типизированной переменной с меньшей точностью (например, Double → Long), VBA
округляет значение выражения для совпадения с точностью переменной, принимающей новое значение.
6. Если переменной типа String присваивается переменная типа Variant, содержащая число, VBA автоматически преобразует это число в строку.
V. Встроенные математические функции
Таблица 1.4. Некоторые стандартные функции VBA
Функция |
Выполняемое действие |
|
Atn(аргумент) |
Возвращение арктангенса угла в радианах |
|
Sin (аргумент) |
Возвращение синуса угла, заданного в радианах |
|
Cos(аргумент) |
Возвращение косинуса угла, заданного в радианах |
|
Tan(аргумент) |
Возвращение тангенса угла, заданного в радианах |
|
Exp(аргумент) |
Возвращение значения ex, где x — значение переменной |
|
или введенное число |
||
Log(аргумент) |
Возвращение натурального ln(x) логарифма числа x |
|
Sqr(аргумент) |
Возвращение квадратного куреня числа |
|
Randomize |
Запуск генератора случайных чисел |
|
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 2 |
|
1 |
|
11.10.2009, 14:56. Показов 13573. Ответов 8
Нужна помощь в решении задач VBA (excel) №1. Поменяйте местами содержимое ячейки А10 (один) и ячейки В10 (два) при нажатии кнопки *замена*. №2. Начиная с ячейки D2, при нажатии кнопки *сумма* просуммируйте содержимое непустых ячеек строки. Результат поместите в пустую ячейку, следующую за ней непустой.
0 |
yaser 134 / 79 / 6 Регистрация: 06.04.2009 Сообщений: 192 |
||||
11.10.2009, 15:50 |
2 |
|||
0 |
0 / 0 / 0 Регистрация: 19.06.2014 Сообщений: 2 |
|
11.10.2009, 20:32 |
3 |
огромное спасибо!!!!
0 |
3 / 3 / 0 Регистрация: 18.12.2012 Сообщений: 49 |
|
30.03.2013, 17:40 |
4 |
Извините что поднимаю такую древнюю тему
0 |
Почетный модератор 28040 / 15771 / 981 Регистрация: 15.09.2009 Сообщений: 67,752 Записей в блоге: 78 |
|
30.03.2013, 17:48 |
5 |
не могли бы объяснить 4 задачу. простите, может я чего то не вижу, но тут только две задачи?
0 |
Igor_Tr 4377 / 661 / 36 Регистрация: 17.01.2010 Сообщений: 2,134 |
||||
30.03.2013, 18:45 |
6 |
|||
Может, пригодится. Меня иногда выручает, что б уйти от цикла и дополнительных переменных. Через Specialcells:
0 |
3 / 3 / 0 Регистрация: 18.12.2012 Сообщений: 49 |
|
31.03.2013, 14:46 |
7 |
простите, может я чего то не вижу, но тут только две задачи? ой. вторую задачу то есть
0 |
971 / 353 / 135 Регистрация: 27.10.2006 Сообщений: 764 |
|
31.03.2013, 21:01 |
8 |
Igor_Tr, по-моему, проще писать цифру 2, вместо [D2].Row
0 |
4377 / 661 / 36 Регистрация: 17.01.2010 Сообщений: 2,134 |
|
01.04.2013, 03:48 |
9 |
to_Pavel55. Что-то совсем не соображаю. Где именно Вы имеете в виду? Вижу только, что в моем выражении не мешало бы подстраховаться вот так …SpecialCells(xlCellTypeConstants, xlNumbers)) А! Дошло. Да, если точно знаем (но такое бывает очень не часто, лучше (!) привыкать к экстриму сразу). Поэтому здесь как Демо и на ходу, хотелось подсказать, что каким-то образом из какого-то выражения вытягиваем номер ряда ([D2].row). А так — Вы правы. И смотрю, так никто и не обяснил Мэри про While. А у меня праздники…
0 |
ВНИМАНИЕ | Для получения программы своего варианта пишите на наш электронный адрес 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 минут. |