Макрос можно также назначить какому-нибудь объекту, например, формуле Microsoft Equation 3.0 – через контекстное меню. В результате формула превращается в кнопку, щелчок по которой вызывает макрос.
Проверяю расчет путем изменения исходных данных. Автоматически получаю расчет силы тока по формуле и с помощью функции. Щелчок по кнопке-формуле вычисляет силу тока с помощью макроса.
Мы реализовали базовый алгоритм Линейная последовательность.
Который отобразим в виде блок схемы в Word-документе.
Рисовать удобнее по линиям сетки – отобразим сетку через кнопку Рисование – Сетка (панель инструментов Рисование).
На панели выбираем Автофигуры – Блок-схема.
- Начинаем со знака Завершение (он же знак Начало). Через контекстное меню вписываем текст «Начало». Текст выравниваем По центру. - Следующий блок – Данные – для ввода исходных данных. - Блок Процесс для отображений вычислений. - Для вывода результата используется тот же блок, что и для ввода исходных данных. - Для создания копии блока (Начало/Конец), удерживаем Ctrl. |
Проведу линию. Чтобы линия шла строго по вертикали, удерживаю Shift. Чтобы линия перемещалась не скачками (с привязкой к линиям сетки), а плавно, удерживаю Alt. Через контекстное меню Порядок перемещаю линию на задний план.
Корректирую Полотно (угловой маркер).
Убираю сетку (кнопка Рисование - Сетка).
Готово.
Блок-схема алгоритма Линейная последовательность, на основе которого вычислили силу тока тремя способами.
kr07. Вычисление Сопротивления резистора (Базовый алгоритм Условный переход)
Рассчитываем Сопротивление резистора.
Первый способ – по формуле: Показание вольтметра поделить на разницу между Показанием амперметра и Силой тока через вольтметр.
С помощью функции.
В Редакторе VBA создаем процедуру-функцию Сопротивление. В неё передаем исходные данные через аргументы, которые перечисляем в скобках через запятую: это Показание вольтметра U, Показание амперметра Ia, Сила тока через вольтметр i.
Обратите внимание. Если Показание амперметра обозначить большой буквой I, а Силу тока через вольтметр маленькой буквой I (как в постановке задачи), то, согласно правилам VBA, эти две переменные будут считаться одной и той же переменной, что приведет к ошибке. Поэтому Показание амперметра я обозначил Ia.
На основе исходных данных рассчитывается сопротивление r. r присваивается переменной Сопротивление, имя которой совпадает с именем функции. Благодаря этому функция способна возвращать значение, и мы можем её вставить в ячейку рабочего листа.
На рабочем листе вызываем Мастер функций.
Категория Определенные пользователем. Функция Сопротивление.
Указываем, где (в каких ячейках) брать исходные данные. Ок. Готово.
С помощью макроса.
В Редакторе VBA создаем Sub-процедуру Сопротивление_. Исходные данные в неё передаются с помощью функции Range, которая обращается к ячейкам рабочего листа по их обозначениям. Вычисляю r, и r записываю в ячейку с помощью Range.
На рабочем листе созданный макрос, то есть Sub-процедуру назначаем формуле Microsoft Equation 3.0 (через контекстное меню). Теперь щелчок по формуле вызывает макрос. Готово.
Таким образом мы вычислили Сопротивление резистора на основе алгоритма, который назваться Линейная последовательность.
Обращаю ваше внимание на ситуацию, которая возникает, если Показание вольтметра будет равно 850. В этом случае разница между Показанием амперметра и Силой тока через вольтметр будет равна 0, что приведет к ошибке. И в соответствующие ячейки выдается стандартное сообщение об ошибке #ДЕЛ/0.
Посмотрим (через контекстное меню) справку по этой ошибке. Среди прочего здесь говорится: «Чтобы ошибка не отображалась, используйте функцию листа ЕСЛИ. Последуем этому совету.
Вставим (в ячейку с формулой для Сопротивления) – из категории Логические – функцию ЕСЛИ. Первый аргумент функции – Логическое выражение: если Показание амперметра минус Сила тока через вольтметр равно нулю, то (второй аргумент Значение_если_истина) функция должна вернуть пустое значение – две кавычки без пробела: "". Иначе (третий аргумент Значение_если_ложь) функция должна вернуть значение по формуле: Показание вольтметра поделить на разницу между Показанием амперметра и Силой тока через вольтметр.
Готово. Теперь вместо стандартного сообщения об ошибке выдается пустое значение.
Подкорректируем функцию Сопротивление (в Редакторе VBA).
Вместо оператора присваивания вставим оператор условного перехода If. Это аналог функции рабочего листа ЕСЛИ.
Читаем. Если (If) разница между Показанием амперметра и Силой тока через вольтметр равна нулю, то (Then) r присвоить пустое значение. Иначе (Else) r присвоить значение, вычисляемое по формуле.
На рабочем листе повторно вставляем функцию Сопротивление (входим в режим редактирования ячейки сдвоенным щелчком по ней и завершаем редактирование клавишей Enter0. Получилось. Вместо стандартного сообщения об ошибке выдается пустое значение.
Запусти макрос (щелчком по кнопке-формуле). В этом случае также выдается сообщение об ошибке (в диалоговом окне) – Деление на ноль (Division by zero). Кнопка End приведет к завершению процедуры. При нажатии кнопки Debug (нажимаем) – процедура будет продолжаться выполняться в пошаговом режиме.
В этом режиме подсвечивается ошибочная команда.
Наводя курсор на переменную, можно увидеть её значение. А если выделить подвыражение, то можно узнать значение этого подвыражения. У нас получилось в знаменателе 0, что и привело к ошибке.
Остановим выполнение программы (кнопкой Stop на панали инструментов). И внесем изменение в тексте процедуры.
Вместо оператора присваивания вставляем оператор условного перехода If, точно такой же, как в функции.
Поэкспериментируем: вместо пустого значения "" пусть функция возвращает текст "Ошибка!"
Запускаем макрос (на рабочем листе щелчком по формуле-кнопке). Готово.
Проверим (путем изменения значений исходных параметров). Работает.
Мы реализовали алгоритм, который называется Алгоритм условного перехода.
Блок-схема алгоритма условного перехода (в Word-документе):
- Начало процедуры. - Ввод исходный данных. - Проверка условия: если условие выполняется, идем по ветке Да, и переменной r присваивается текст Ошибка; если условие не выполняется – по ветке Нет, переменной r присваивается значение, вычисляемое по формуле. - Далее в обоих случаях осуществляется вывод r из программы. - Конец процедуры. |
При построении блок-схемы использовались Автофигуры – Блок-схема.
Для создания надписей Да и Нет использовался элемент, который так и называется Надпись.
После вставки Надписи в Формате (вызванном через контекстное меню) задаем: Нет заливки и Нет линии.
Итак, это был алгоритм условного перехода, на основе которого мы вычислили Сопротивление резистора.
kr08. Построение таблицы зависимости i и R от U и запись таблицы в файл VAR11.txt
Теперь необходимо получить таблицу. Первый столбец таблицы содержит циклически изменяемый параметр, в нашем варианте это U – показания вольтметра. U меняется от 500 до 0 с шагом 10. 500, 0, 10 – значения, которые будут вводиться с клавиатуры, и, в принципе, можно будет вводить другие. Для каждого значения U надо рассчитать значение i – сила тока через вольтметр и R – сопротивление резистора.
Переходим в Редактор VBA и создаем процедуру ТаблицаФайл.
С помощью стандартной функции InputBox вводится с клавиатуры начальное и конечное значение U и шаг изменения U. Введенные значения присваиваются переменным n, k, s.
С помощью стандартной функции Val текстовые значения n, k, s преобразуются в числовые.
Значения других исходных параметров (кроме U) возьмем из ячеек рабочего листа с помощью стандартной функции Range: из ячейки H7 показание амперметра Ia, из H8 сопротивление вольтметра r.
Командой Open открываем файл с именем Var11.txt для записи в него данных (режим Output). Файлу присваивается № 1, в дальнейшем по этому номеру будет осуществляться обращение к этому файлу.
Поскольку мы не указали, в какой папке сохранить файл, он будет сохранен в системной папке Мои документы.
Командой Write в 1-ый файл выводятся заголовки таблицы (текст, заключенный в кавычки).
Далее начинается оператор цикла типа Цикл со счетчиком. Роль счетчика здесь играет переменная U. Цикл начинается командой For и заканчивается командой Next. Между ними – тело цикла.
Буквально читаем.
Для U, изменяющегося от n до k с шагом s вычислить силу тока и сопротивление путем вызова ранее созданных функций. В скобках перечисляются фактические параметры – исходные данные для этих функций. Возвращаемые значения присваиваются переменным i и RR.
Затем по команде Write в 1-ый файл выводятся значения U, i, RR.
По команде Next U к старому значению U прибавляется шаг S.
Далее новое значение U сравнивается с k. И если U<=k, то цикл повторяется: для нового значения U рассчитываются значения i и RR и выводятся в файл – в новую строку таблицы.
По окончании цикла командой Close закрывается файл № 1 и выводится сообщение о том, что таблица записана в файл.
Блок-схема процедуры ТаблицаФайл на базе алгоритма цикла со счетчиком:
- Начало процедуры - Ввод с клавиатуры n, k, s. - Ввод в программу значений Ia, r из ячеек рабочего листа. - Открыть файл. - Вывод заголовков таблицы в файл. - Начало цикла: переменной U присваивается начальное значение n, и сравнивается с конечным значение k. - Если U<=k, вычисляется i и RR и значения U, i, RR выводятся в файл. - Затем к старому значению U прибавляется шаг S. - И новое значение U опять сравнивается с k. И если U<=k, цикл повторяется. - Если U>k, выходим из цикла. - Файл закрывается. - Выдается сообщение «Таблица записана в файл». - Конец процедуры. | |
Специально для обозначения на блок-схеме цикла со счетчиком предусмотрен элемент , который уже включает в себя, подразумевает: - Начальное присваивание U=n. - Проверку условия U<=k. - И переход к новому значению счетчика U=U+S. Таким образом, с этим элементов блок-схема выглядит компактней. |
Выполним процедуру ТаблицаФайл в пошаговом режиме. Этот режим используется для проверки правильности выполнения алгоритма и для поиска и исправления ошибок.