51
Министерство образования и науки Российской Федерации Санкт-Петербургский государственный архитектурно-строительный университет C. Н. НИКИФОРОВ ИНФОРМАТИКА для I курса Часть I Учебное пособие Санкт-Петербург 2011

C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

1

Министерство образования и наукиРоссийской Федерации

Санкт-Петербургский государственныйархитектурно-строительный университет

C. Н. НИКИФОРОВ

ИНФОРМАТИКАдля I курса

Часть I

Учебное пособие

Санкт-Петербург2011

Page 2: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

2 3

УДК 681.3

Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер

Никифоров, С. Н.Информатика для I курса. Ч. I: учеб. пособие по выполнению

лабораторных работ по курсу «Информатика» / С. Н. Никифоров; СПбГАСУ. – СПб., 2011. – 100 с.

ISBN

Учебное пособие предназначено для помощи студентам при выполне-нии лабораторных работ в среде Excel и VBA. Комментируются некоторые особенности программирования, приводятся и поясняются варианты про-грамм.

Предназначено для студентов всех специальностей.

Ил. 51. Библиогр.: 2 назв.

Рекомендовано Редакционно-издательским советом СПбГАСУ в каче-стве учебного пособия.

© С. Н. Никифоров, 2011© Санкт-Петербургский государственныйархитектурно-строительный университет, 2011

ВВЕДЕНИЕ

Настоящее издание предназначено для студентов первого кур-са, выполняющих лабораторные работы по курсу «Информатика».

Осознавая масштабность курса, автор не претендует на всеобъ-емлемость материала, а наоборот, даже не рассматривает некото-рые разделы вообще, полагая, что при необходимости с ними мож-но ознакомиться в любом из фундаментальных учебников, издан-ных в последнее время.

Основная задача – оказать помощь студентам при выполнении лабораторных работ в среде EXCEL и VBA.

Вместе с тем автор считает целесообразным отметить обяза-тельность посещения лекций по курсу «Информатика», в соответ-ствии с которым и формируются тексты программ, усложняющие-ся по мере освоения средств и возможностей VBA.

1. ТАБУЛИРОВАНИЕ ФУНКЦИИ

Выполнение лабораторной работы «Табулирование функции» состоит из двух частей:

табулирование функции в Excel;табулирование функции в VBA.Критерием правильности является совпадение полученных

таблиц.Процесс табулирования функции в Excel описан во многих

монографиях, одной из которых является книга А. Гарнаева «Испо-льзование MS Excel и VBA в экономике и финансах». Но на неко-торые моменты хотелось бы обратить внимание.

Значение первой ячейки таблицы в принципе может быть лю-бым, но, как правило, оно выбирается в соответствии с вариантом задания.

ISBN

Page 3: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

4 5

Главное – оно задается КОНСТАНТОЙ!В рассматриваемом примере (рис. 1.1) такой ячейкой является

А6, а значение константы -2 (минус два).Адрес и значение ячейки, в которой хранится величина шага

изменения аргумента табулируемой функции, также произвольны, но значение обязательно – КОНСТАНТА.

В рассматриваемом примере такой ячейкой является B4, а зна-чение константы 0,25. (Если константа задается дробью, то она должна «прижаться» к правой стенке ячейки, иначе она восприни-мается как символьная константа, а не как цифровая. Достигается это заменой неправильно выбранного знака-разделителя дробной части от целой – точки на запятую.)

Обязательным является получение графика в виде, представлен-ном на рис. 1.1, когда кривая графика начинается от оси Y, а марке-ры кривой графика (если щелкнуть по кривой) совпадают с рисками и подписями оси X (сравните с графиком рис. 1.2).

Чтобы от графика рис. 1.2 перейти к графику рис. 1.1, необ-ходимо в Excel дважды щелкнуть по оси X, в появившемся окне «Формат оси» (рис. 1.3) убрать флажок в разделе «пересечение с осью Y (значений) между категориями» и нажать OK.

Программа табулирования функции в VВА

Private Sub CommandButton1_Click()Dim i As IntegerDim j As IntegerDim x As SingleDim xn As SingleDim xk As SingleDim dx As SingleDim y As Singlexn = InputBox("Xn = ", "Ввод начального значения x", -2, 8000, 2000)xk = InputBox("Xk = ", "Ввод конечного значения x", 2, 8000, 1000)dx = InputBox("dX = ", "Ввод значения шага x”, 0.25, 8000, 2000)i = InputBox("i = ", "Ввод значения начала таблицы, строка i", 5, 8000, 1000)j = InputBox("j = ", "Ввод значения начала таблицы, столбец j", 3, 8000, 2000)x = xn: Cells(i, j) = "X(vba)": Cells(i, j + 1) = "Y(vba)"

Рис.

1.1

Рис.

1.1

Page 4: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

6 7

Рис. 1.2

Рис. 1.3

10 y = Exp(x - 2) * (1 + x ^ 2 + 2 * x) ^ 0.5Cells(i + 1, j) = xCells(i + 1, j + 1) = yx = x + dxi = i + 1If x > xk Then GoTo 20 Else GoTo 1020 End Sub

Некоторые комментарии к программе:объявление простых переменных, строго говоря, в VBA не

требуется, но бывают случаи, когда именно из-за этого программа работает неправильно или не работает вообще;

в операторе InputBox используются пять параметров. Первые два – символьные константы, их использование объясняется при появлении окна InputBox. Третий параметр – предлагаемое значе-ние, которое можно изменить, четвертый и пятый параметры – ко-ординаты левого верхнего угла окна InputBox на экране;

конечно, можно написать более совершенную программу, исключающую применение условного оператора и тем более опе-раторов перехода, применив один из операторов цикла, но пред-полагается, что на данном этапе студенты еще не знакомы с раз-новидностями операторов цикла и поэтому главным критерием качества программного продукта является решение поставлен-ной задачи.

2. ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ ФУНКЦИИ

Выполнение этой лабораторной работы, так же, как и всех по-следующих функций, связанных с табуляцией, целесообразно на-чинать с копирования предыдущей.

СКОПИРОВАТЬ ВЕСЬ ЛИСТ С ЛАБОРАТОРНОЙ РАБОТОЙ «ТАБУЛИРОВАНИЕ ФУНКЦИИ» НА ЧИСТЫЙ ЛИСТ И НА

НЕМ ПРОИЗВЕСТИ НЕОБХОДИМЫЕ ИЗМЕНЕНИЯ.

Page 5: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

8 9

Лабораторная работа «Табулирование разветвляющейся функ-ции» также состоит из двух частей:

табулирование функции в Excel;табулирование функции в VBA.Критерием правильности является совпадение полученных та-

блиц.Однако в связи с условием задачи спектр значений функции G(x)

формируется не как раньше – в одном столбце, а в двух (рис. 2.1).При этом в ячейки В6:B12 вносится арифметическое выражение,

соответствующее первой формуле задания, а в ячейки С13:C26 – арифметическое выражение, соответствующее второй формуле за-дания. Можно отобразить их разным цветом.

Именно эти два столбца ПОЛНОСТЬЮ используются для по-строения графика.

В ячейках D6:D26 записывается логическая функция ЕСЛИ с помощью мастера функций fx .

Выполняется это следующим образом:выбрать ячейку D6;включить мастер функций fx;в появившемся окне рис. 2.2 мастера функций fx выбрать ло-

гическую функцию ЕСЛИ;в окне «Аргументы функции» (рис. 2.3) в первом окне запи-

сать логическое выражение, соответствующее заданию, при этом справа, если выражение написано грамматически правильно, по-является результат «= истина».

В самом деле, значение ячейки А6 равно -3, что меньше нуля. Во второе окно записывается арифметическое выражение, со-ответствующее первой формуле задания, в третье – арифмети-ческое выражение, соответствующее второй формуле задания. Грамматическая правильность записи арифметических выражений подтверждается числовыми результатами, сформированными на основании вычислений арифметических выражений при значении ячейки А6, равном -3. Эти результаты появляются справа от окон:

– нажать ОК;– скопировать формулу ячейки D6 в диапазон D6:D26.

Рис.

2.1

Рис.

2.1

Page 6: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

10 11

Рис. 2.2

Рис. 2.3

Числовые значения ячеек диапазона D6:D26 должны совпадать с числовыми значениями ячеек диапазонов B6:B12 и C13:C26.

Можно не обращаться к мастеру функций fx, а просто записать в ячейку D6 выражение

=ЕСЛИ(A6<=0;SIN(A6);EXP(-A6))

а затем скопировать от D6 до D26 включительно.

ПРОГРАММНЫЙ МОДУЛЬ VBA ИЗ ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ ФУНКЦИИ» СКОПИРОВАТЬ В МОДУЛЬ ОБЪЕКТА CommandButton ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ

ФУНКЦИИ».

Внести соответствующие изменения.

Программа табулирования разветвляющейся функции в VВА

Private Sub CommandButton1_Click()Dim i As IntegerDim j As IntegerDim x As SingleDim xn As SingleDim xk As SingleDim dx As SingleDim g As Singlexn = InputBox("Xn = ", "Ввод начального значения x", -3, 8000, 2000)xk = InputBox("Xk = ", "Ввод конечного значения x", 7, 8000, 1000)dx = InputBox("dX = ", "Ввод значения шага x", 0.5, 8000, 2000)i = InputBox("i = ", "Ввод значения начала таблицы, строка i", 5, 8000, 1000)j = InputBox("j = ", "Ввод значения начала таблицы, столбец j", 5, 8000, 2000)x = xn: Cells(i, j) = "X(vba)": Cells(i, j + 1) = "G1(vba)": Cells(i, j + 2) = "G2(vba)"10 Cells(i + 1, j) = xIf x <= 0 Theng = Sin(x)Cells(i + 1, j + 1) = gElseg = Exp(-x)Cells(i + 1, j + 2) = gEnd Ifx = x + dxi = i + 1If x > xk Then GoTo 20 Else GoTo 1020 End Sub

Page 7: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

12 13

Некоторые комментарии к программе:применен условный оператор, у которого в частях Then и Else

находится по два оператора, поэтому по грамматическим требова-ниям необходим переход на другую строку, и завершается оператор End If.

3. ТАБУЛИРОВАНИЕ ФУНКЦИИ, РАЗВЕТВЛЯЮЩЕЙСЯ БОЛЬШЕ ЧЕМ ОДИН РАЗ

Выполнение этой лабораторной работы, так же, как и всех по-следующих, связанных с табуляцией функций, целесообразно на-чинать с копирования предыдущей.

СКОПИРОВАТЬ ВЕСЬ ЛИСТ С ЛАБОРАТОРНОЙ РАБОТОЙ «ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ ФУНКЦИИ» НА ЧИСТЫЙ ЛИСТ И НА НЕМ ПРОИЗВЕСТИ НЕОБХОДИМЫЕ

ИЗМЕНЕНИЯ.

Лабораторная работа «Табулирование функции, разветвляю-щейся больше чем один раз» также состоит из двух частей:

табулирование функции в Excel;табулирование функции в VBA.Критерием правильности является совпадение полученных

таблиц.Однако в связи с условием задачи спектр значений функции

Z(x) формируется не как раньше – в одном или в двух столбцах, а в трех (рис. 3.1).

При этом в ячейки В6:B12 вносится арифметическое выраже-ние, соответствующее первой формуле задания, в ячейки С13:C19 вносится арифметическое выражение, соответствующее второй формуле задания, а в ячейки D20:D26 вносится арифметическое выражение, соответствующее третьей формуле задания. Можно отобразить их разным цветом.

Именно эти три столбца ПОЛНОСТЬЮ используются для по-строения графика.

Рис.

3.1

Рис.

3.1

Page 8: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

14 15

В ячейках E6:E26 записывается логическая функция ЕСЛИ с помощью мастера функций fx.

Выполняется это следующим образом:выбрать ячейку E6;включить мастер функций fx;в появившемся окне (рис. 3.2) мастера функций fx выбрать

логическую функцию ЕСЛИ;

Рис. 3.2

в окне «Аргументы функции» (рис. 3.3) в первом окне запи-сать логическое выражение, соответствующее заданию, при этом справа, если выражение написано грамматически правильно, по-является результат «= истина».

В самом деле, значение ячейки А6 равно -3, что меньше нуля. Во второе окно записывается арифметическое выражение, со-ответствующее первой формуле задания, в третье – логическая функция

Если(И(A6>0;A6<=3,5);exp(-A6);ln(A6)),

Рис. 3.3

соответствующая второй и третьей частям задания. Грамматическая правильность записи арифметических выражений подтверждается числовыми результатами, сформированными на основании вычис-лений арифметических выражений при значении ячейки А6, рав-ном -3. Эти результаты появляются справа от окон;

нажать ОК;скопировать формулу ячейки E6 в диапазон E6:E26.Числовые значения ячеек диапазона E6:E26 должны совпа-

дать с числовыми значениями ячеек диапазонов B6:B12, C13:C19 и D20:D26.

Можно не обращаться к мастеру функций fx, а просто записать в ячейку E6 выражение

=ЕСЛИ(A6<=0;SIN(A6);ЕСЛИ(И(A6>0;A6<=3,5);EXP(-A6);LN(A6))),

а затем скопировать от E6 до E26 включительно.

Page 9: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

16 17

ПРОГРАММНЫЙ МОДУЛЬ VBA ИЗ ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ ФУНКЦИИ» СКОПИРОВАТЬ В МОДУЛЬ ОБЪЕКТА CommandButton

ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ ФУНКЦИИ, РАЗВЕТВЛЯЮЩЕЙСЯ БОЛЬШЕ ЧЕМ ОДИН РАЗ».

Внести соответствующие изменения.

Программа табулирования в VВАфункции, разветвляющейся больше чем один раз

Private Sub CommandButton1_Click()Dim i As IntegerDim j As IntegerDim x As SingleDim xn As SingleDim xk As SingleDim dx As Singlexn = InputBox("Xn = ", "Ввод начального значения x", -3, 8000, 2000)xk = InputBox("Xk = ", "Ввод конечного значения x", 7, 8000, 1000)dx = InputBox("dX = ", "Ввод значения шага x", 0.5, 8000, 2000)i = InputBox("i = ", "Ввод значения начала таблицы, строка i", 5, 8000, 1000)j = InputBox("j = ", "Ввод значения начала таблицы, столбец j", 6, 8000, 2000)x = xn: Cells(i, j) = "X(vba)": Cells(i, j + 1) = "Z1(vba)": Cells(i, j + 2) = "Z2(vba)": Cells(i, j + 3) = "Z3(vba)"10 Cells(i + 1, j) = xIf x <= 0 Thenz = Sin(x)Cells(i + 1, j + 1) = zEnd IfIf (x > 0) And (x <= 3.5) Thenz = Exp(-x)Cells(i + 1, j + 2) = zEnd IfIf x > 3.5 Thenz = Application.Ln(x)Cells(i + 1, j + 3) = zEnd Ifx = x + dxi = i + 1

If x > xk Then GoTo 20 Else GoTo 1020 End Sub

Некоторые комментарии к программе:по количеству условий задания применены три неполных

условных оператора. Так как у каждого оператора в частях Then находятся по два оператора, то по грамматическим требованиям необходим переход на другую строку, и завершается каждый опе-ратор End If;

можно было воспользоваться вложенными условными опера-торами, но очень часто возникают логические ошибки при оцен-ке уровня вложенности после части ELSE; считается целесообраз-ным при решении подобных задач использовать грамматическую конструкцию, в которой количество неполных условных операто-ров соответствует числу логических условий решаемой задачи;

в программе используется сложное логическое выражение

(x > 0) And (x <= 3.5),

состоящее из двух простых, объединенных логической функ-цией And.

4. ТАБУЛИРОВАНИЕ ДВУХ ФУНКЦИЙ

Лабораторная работа «Табулирование двух функций» отличает-ся от лабораторной работы «Табулирование функции» только чис-лом функций, построенных на одном графике. Поэтому ее целесо-образно выполнять на базе лабораторной работы «Табулирование функции».

СКОПИРОВАТЬ ВЕСЬ ЛИСТ С ЛАБОРАТОРНОЙ РАБОТОЙ «ТАБУЛИРОВАНИЕ ФУНКЦИИ» НА ЧИСТЫЙ ЛИСТ И НА

НЕМ ПРОИЗВЕСТИ НЕОБХОДИМЫЕ ИЗМЕНЕНИЯ.

Лабораторная работа «Табулирование двух функций» также со-стоит из двух частей:

Page 10: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

18 19

табулирование функции в Excel;табулирование функции в VBA.Критерием правильности является совпадение полученных та-

блиц.Поэтому в соответствии с условием задачи спектр значений

функции Y(x) необходимо заменить на спектр значений функции V(x), диапазон B6:B32 (рис. 4.1), и рядом, в диапазоне С6:С32, сформировать спектр значений функции W(x) (см. рис. 4.1).

Именно эти два столбца ПОЛНОСТЬЮ используются для по-строения графика.

ПРОГРАММНЫЙ МОДУЛЬ VBA ИЗ ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ ФУНКЦИИ» СКОПИРОВАТЬ В МОДУЛЬ

ОБЪЕКТА CommandButton ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ ДВУХ ФУНКЦИЙ».

Внести соответствующие изменения.

Программа табулирования двух функций в VВА

Private Sub CommandButton1_Click()Dim i As IntegerDim j As IntegerDim x As SingleDim xn As SingleDim xk As SingleDim dx As Singlee = 0.001xn = InputBox("Xn = ", "Ввод начального значения x", -1, 8000, 2000)xk = InputBox("Xk = ", "Ввод конечного значения x", 0.3, 8000, 1000)dx = InputBox("dX = ", "Ввод значения шага x", 0.05, 8000, 2000)i = InputBox("i = ", "Ввод значения начала таблицы, строка i", 5, 8000, 1000)j = InputBox("j = ", "Ввод значения начала таблицы, столбец j", 4, 8000, 2000)x = xn: Cells(i, j) = "X(vba)": Cells(i, j + 1) = "V(vba)": Cells(i, j + 2) = "W(vba)"10 Cells(i + 1, j) = xv = Sin(x ^ 2) + Cos(Application.WorksheetFunction.Pi * x) ^ 3Cells(i + 1, j + 1) = vw = Cos(x ^ 3) ^ 2 - Sin(Application.WorksheetFunction.Pi * x ^ 2)Cells(i + 1, j + 2) = w

Рис.

4.1

Page 11: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

20 21

x = x + dxi = i + 1If x <= xk + e Then GoTo 10End Sub

Некоторые комментарии к программе:в программе в логическом выражении x <= xk + e использует-

ся цифровая константа e = 0.001, применение которой обеспечива-ет получение спектра значений X от -1 до 0.3 включительно;

в тексте программы встречаются обращения к приложению, например, Cos(Application.WorksheetFunction.Pi), которое озна-чает, что для вызова функции π последовательно обращаются сна-чала к приложению Application, затем к функциям рабочего листа WorksheetFunction и, наконец, к конкретной функции Pi;

чтобы не допустить ошибки в этой достаточно сложной грам-матической конструкции, следует воспользоваться возможностя-ми дружественного интерфейса VBA, для чего в тексте програм-мы написать Cos(Application., и после постановки точки появится подменю разделов Приложения (рис. 4.2).

Рис. 4.2

После точки следует добавить букву W, и тогда в подменю поя-вится раздел WorksheetFunction (рис. 4.3).

Выбрать раздел WorksheetFunction, после чего поставить точ-ку и в появившемся подменю списка функций рабочего листа вы-брать функцию Pi, рис. 4.4.

Рис. 4.3

Рис. 4.4

Продолжить запись арифметического выражения Cos(Appli-cation.WorksheetFunction.Pi в соответствии с выполняемым зада-нием.

5. ПОСТРОЕНИЕ ПОВЕРХНОСТИ

Лабораторная работа «Построение поверхности» также состо-ит из двух частей:

табулирование функции поверхности в Excel;табулирование функции поверхности в VBA.Критерием правильности является совпадение полученных

таблиц.

Page 12: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

22 23

Отличием в табулировании функции от двух параметров Z(x,y) является то, что спектр значений аргумента X формируется в столб-це в диапазоне A6:A16, а спектр значений аргумента Y формирует-ся в строке в диапазоне B5:L5 (рис. 5.1).

Величина начального значения аргумента X устанавливается в ячейке A6 и выбирается в соответствии с выполняемым задани-ем, в данном случае A6=0.

Величина начального значения аргумента Y устанавливается в ячейке B5 и также выбирается в соответствии с выполняемым за-данием, в данном случае B5=0.

Значение ячейки A7 определяется как результат вычисления арифметического выражения A7 = A6 + $B$1, где $B$1 – шаг изме-нения аргумента X, который выбирается произвольно.

Значения диапазона A8:A16 получаются в результате копирова-ния ячейки A7 по указанному диапазону.

Значение ячейки С5 определяется как результат вычисления арифметического выражения С5 = B5 + $B$2, где $B$2 – шаг изме-нения аргумента Y, который выбирается произвольно.

Значения диапазона D5:L5 получаются в результате копирова-ния ячейки C5 по указанному диапазону.

Ключевым моментом в формировании таблицы значений функ-ции Z(x,y) является запись в ячейку B6 арифметического выраже-ния, соответствующего функции поверхности выполняемого зада-ния Z(x,y) = 2x2 + 3y2.

В итоге в ячейку B6 должно быть записано арифметическое вы-ражение

=2*$A6^2+3*B$5^2

в котором используется абсолютно-относительная адресация.Затем арифметическое выражение ячейки B6 копируется в ди-

апазон B6:L16.В результате любая ячейка из диапазона B6:L16 в качестве аргу-

мента X использует соответствующую (относительная адресация) ячейку столбца A диапазона A6:A16 (абсолютная адресация), а в ка-честве аргумента Y использует соответствующую (относительная адресация) ячейку строки 5 диапазона B5:L5 (абсолютная адресация).

Рис

51

Рис.

5.1

Page 13: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

24 25

Диапазон B6:L16 используется для построения графика по-верхности.

Программа построения поверхности в VВА

Private Sub CommandButton2_Click()Dim i As IntegerDim ni As IntegerDim j As IntegerDim nj As IntegerDim x As SingleDim xn As SingleDim xk As SingleDim dx As SingleDim y As SingleDim yn As SingleDim yk As SingleDim dy As Singlee = 0.001xn = InputBox("Xn = ", "Ввод начального значения X", 0, 8000, 2000)xk = InputBox("Xk = ", " Ввод конечного значения X", 1, 8000, 1000)dx = InputBox("dX = ", " Ввод значения шага X", 0.1, 8000, 2000)yn = InputBox("Yn = ", " Ввод начального значения Y", 0, 8000, 2000)yk = InputBox("Yk = ", " Ввод конечного значения Y", 1, 8000, 1000)dy = InputBox("dY = ", " Ввод значения шага Y", 0.1, 8000, 2000)i = InputBox("i = ", "Ввод начала таблицы, строка I", 20, 8000, 1000)j = InputBox("j = ", " Ввод начала таблицы, столбец J", 1, 8000, 2000)Cells(i, j) = "X/Y"ni = i: nj = j: x = xn10 Cells(i + 1, j) = xx = x + dx: i = i + 1If x <= xk + e Then GoTo 10y = yn: i = ni20 Cells(i, j + 1) = yy = y + dy: j = j + 1If y <= yk + e Then GoTo 20y = yn: j = nj30 i = ni: x = xn40 z = 2 * x ^ 2 + 3 * y ^ 2Cells(i + 1, j + 1) = z

i = i + 1: x = x + dxIf x <= xk + e Then GoTo 40y = y + dy: j = j + 1If y <= yk + e Then GoTo 30End Sub

Некоторые комментарии к программе:в программе после ввода исходных данных сначала форми-

руются и выводятся в соответствующие ячейки значения осей X и Y;

в программе с помощью промежуточных переменных ni и nj запоминаются начальные значения i – строки, с которой начина-ется таблица в VBA и j – столбца, с которого начинается таблица в VBA, так как после формирования значений осей X и Y перемен-ные i и j приобрели конечные значения.

6. КВАДРАТИЧНЫЕ ФОРМЫ

Целью лабораторной работы «Квадратичные формы» является освоение матричных функций Excel и VBA.

Выполнение лабораторной работы предполагает знание эле-ментов векторного анализа, в частности, матричных операций.

Лабораторная работа «Квадратичные формы» состоит из двух частей, в первую часть входят:

решение матричного уравнения в Excel;решение матричного уравнения в Excel с предварительным

преобразованием;вычисление квадратичной формы в Excel;вычисление квадратичной формы с использованием матрич-

ных функций Excel;вычисление квадратичной формы с использованием матрич-

ных функций VBA,а во вторую:операции над массивами в Excel;операции над массивами в VBA.

Page 14: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

26 27

Критерием правильности решений матричных уравнений явля-ются результаты проверки подстановкой найденных значений кор-ней в исходные уравнения.

Критерием правильности вычислений квадратичной формы явля-ется совпадение полученных значений трех способов вычислений.

Выполнение лабораторной работы начинается с внесения исхо-дных данных задания в соответствующие ячейки таблицы Excel, в выбранной адресации:

значения матрицы А – А8:D11;значения вектора B – F8:F11;значения вектора Y – H8:H11 (рис. 6.1).

ЧАСТЬ ПЕРВАЯ

6.1. Решение матричного уравнения в Excel

Так как решением матричного уравнения АХ=В является век-тор Х=А–1В, то необходимо сформировать обратную матрицу А–1, это выполняется в ячейках A14:D17, для чего:

выделить A14:D17,через мастер функций fx вызвать матричную операцию МОБР,

в окне «массив» которой указать адрес исходной матрицы А – А8:D11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках A14:D17 появятся значения элементов

обратной матрицы А–1 (рис. 6.2), а для любой ячейки диапазона A14:D17 в строке состояний – подтверждение выполнения матрич-ной операции {=МОБР(A8:D11)}.

Так как результатом произведения исходной матрицы А на об-ратную матрицу А–1 является единичная матрица E, то для провер-ки правильности значений элементов полученной обратной матри-цы необходимо:

выделить F14:I17;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне (рис. 6.3) «Массив1» которой указать адрес

Рис. 6.1

Рис. 6.2

Page 15: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

28 29

Рис. 6.3

исходной матрицы А – А8:D11, а в окне «Массив2» – указать адрес обратной матрицы А–1 – А14:D17;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках F14:I17 появятся значения элементов

единичной матрицы E (см. рис. 6.2), а для любой ячейки диапазона F14:I17 в строке состояний – подтверждение выполнения матрич-ной операции {=МУМНОЖ(A8:D11;A14:D17)}.

Для получения вектора решений Х=А–1В необходимо:выделить J8:J11;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес обратной ма-трицы А–1 – F14:I17, а в окне «Массив2» – указать адрес вектора свободных членов B – F8:F11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках J8:J11 появятся значения элементов век-

тора решений X (см. рис. 6.2), а для любой ячейки диапазона J8:J11

в строке состояний – подтверждение выполнения матричной опе-рации {=МУМНОЖ(F14:I17; F8:F11)}.

Для проверки истинности значений элементов полученного вектора решений X необходимо подставить полученные значения в исходное уравнение АХ=В, для чего следует:

выделить K8:K11;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес исходной ма-трицы А – А8:D11, а в окне «Массив2» – указать адрес полученно-го вектора решений X – J8:J11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках K8:K11 появятся значения элемен-

тов вектора свободных членов B (см. рис. 6.2), совпадающие со значениями элементов исходного вектора B – F8:F11, а для лю-бой ячейки диапазона K8:K11 в строке состояний – подтверж-дение выполнения матричной операции {=МУМНОЖ(A8:D11; J8:J11)}.

6.2. Решение матричного уравнения в Excelс предварительным преобразованием

Для решения второго матричного уравнения AATAX=B необхо-димо произвести предварительные преобразования, т. е. сформи-ровать матрицу AATA.

Для чего следует:выделить A20:D23;через мастер функций fx вызвать матричную операцию

ТРАНСП, в окне «массив» которой указать адрес исходной матри-цы А – А8:D11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках A20:D23 появятся значения элементов

транспонированной матрицы АТ (рис. 6.4), а для любой ячейки ди-апазона A20:D23 в строке состояний – подтверждение выполнения матричной операции {=ТРАНСП(А8:D11)}.

Page 16: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

30 31

Рис. 6.4

Далее сформировать матрицу AAT, для чего необходимо:выделить F20:I23;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне рис. 6.3 «Массив1» которой указать адрес ис-ходной матрицы А – А8:D11, а в окне «Массив2» – указать адрес транспонированной матрицы АТ – A20:D23;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках F20:I23 появятся значения элементов ма-

трицы AAT (см. рис. 6.4), а для любой ячейки диапазона F20:I23 в строке состояний – подтверждение выполнения матричной опе-рации {=МУМНОЖ(A8:D11; A20:D23)}.

Далее в ячейках A26:D29 формируется матрица AATA, затем в ячейках F26:I29 – обратная матрица (AATA)–1 и по аналогии с ре-шением первого матричного уравнения находится вектор решений X – K26:K29 и осуществляется проверка полученного решения вы-числением вектора свободных членов B – L26:L29.

6.3. Вычисление квадратичной формы в Excel

Вычисление квадратичной формы z =YTATA3Y в Excel произво-дится строго в последовательности, указанной в задании.

Первый шаг – вычисление элементов вектора YT:выделить F32:I32;через мастер функций fx вызвать матричную операцию

ТРАНСП, в окне «массив» которой указать адрес вектора Y – H8:H11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках F32:I32 появятся значения элементов

транспонированного вектора YТ, т. е. строки (рис. 6.5), а для любой ячейки диапазона F32:I32 в строке состояний – подтверждение вы-полнения матричной операции {=ТРАНСП(H8:H11)}.

Второй шаг – вычисление элементов транспонированной ма-трицы AT:

уже выполнен раньше в ячейках A20:D23, рис. 6.2.

Рис. 6.5

Page 17: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

32 33

Третий шаг – вычисление элементов матрицы A2:выделить A32:D35;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес исходной ма-трицы А – А8:D11, в окне «Массив2» – адрес исходной матрицы А – А8:D11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках A32:D35 появятся значения элемен-

тов матрицы A2 (рис. 6.5), а для любой ячейки диапазона A32:D35 в строке состояний – подтверждение выполнения матричной опе-рации {=МУМНОЖ(А8:D11; А8:D11)}.

Четвертый шаг – вычисление элементов матрицы A3:выделить F38:D41;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес матрицы A2 – А32:D35, а в окне «Массив2» – адрес исходной матрицы А – А8:D11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках A38:D41 появятся значения элементов

матрицы A3 (см. рис. 6.5), а для любой ячейки диапазона A38:D41 в строке состояний – подтверждение выполнения матричной опе-рации {=МУМНОЖ(А32:D35; А8:D11)}.

Пятый шаг – вычисление элементов вектора-строки YT AT:выделить F35:I35;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес вектора-строки YT – F32:I32, а в окне «Массив2» – адрес транспонирован-ной матрицы AT – А20:D23;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках F35:I35 появятся значения элементов

вектора-строки YT AT (см. рис. 6.5), а для любой ячейки диапазона F35:I35 в строке состояний – подтверждение выполнения матрич-ной операции {=МУМНОЖ(F32:I32; А20:D23)}.

Шестой шаг – вычисление элементов вектора-строки YT AT A3:выделить F38:I38;

через мастер функций fx вызвать матричную операцию МУМНОЖ, в окне «Массив1» которой указать адрес вектора-строки YT AT – F35:I35, а в окне «Массив2» – адрес матрицы A3 – А38:D41;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейках F38:I38 появятся значения элементов

вектора-строки YT AT A3 (см. рис. 6.5), а для любой ячейки диапа-зона F38:I38 в строке состояний – подтверждение выполнения ма-тричной операции {=МУМНОЖ(F35:I35; А38:D41)}.

Седьмой шаг – вычисление значения z = YT AT A3Y:выделить ОДНУ ячейку F41;через мастер функций fx вызвать матричную операцию

МУМНОЖ, в окне «Массив1» которой указать адрес вектора-строки YT AT A3– F38:I38, а в окне «Массив2» – адрес исходного вектора-столбца Y – H8:H11;

затем одновременно нажать клавиши Ctrl-Shift-Enter.В результате в ячейке F41 появится значение квадратичной

формы z = YT AT A3Y (см. рис. 6.5), а для этой ячейки F41 в стро-ке состояний – подтверждение выполнения матричной операции {=МУМНОЖ(F38:I38; H8:H11)}.

Таким образом, значение квадратичной формы z = YT AT A3Y для заданного примера, последовательно вычисленное в Excel, равно 1220520.

6.4. Вычисление квадратичной формы с использованием матричных функций Excel

Для вычисления квадратичной формы z = YT AT A3Y с использо-ванием матричных функций Excel необходимо в ячейке H41 запи-сать следующее выражение:

{=МУМНОЖ(МУМНОЖ(ТРАНСП(H8:H11);ТРАНСП(A8:D11));МУМНОЖ(A38:D41;H8:H11))}.

Формирование указанного выражения осуществляется по ча-стям, в соответствии с заданием z = YT AT A3Y, поэтапно же мож-но осуществлять и отладку, сравнивая промежуточные результаты

Page 18: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

34 35

с промежуточными результатами пошагового вычисления квадра-тичной формы в Excel.

В результате в ячейке F41 появится значение квадратичной фор-мы, равное 1220520.

6.5. Вычисление квадратичной формы с использованиемматричных функций VBA

Для вычисления квадратичной формы в VBA необходимо соз-дать пользовательскую функцию в виде модуля VBA.

Программа вычисления квадратичной формы в VВА

Function zz(a As Variant, y As Variant) As Variantz1 = Application.Transpose(y) 'транспонирование yz2 = Application.Transpose(a)z3 = Application.MMult(z1, z2)z4 = Application.MMult(a, a)z5 = Application.MMult(z4, a)z6 = Application.MMult(z3, z5)z7 = Application.MMult(z6, y)zz = z7End Function

Некоторые комментарии к программе:в программе используются промежуточные переменные z1 – z7;в программе можно ввести комментарии для каждой строки;процесс отладки модуля можно выполнять по частям, для

чего соответствующим образом изменять последний оператор при-сваивания, например zz = z5.

После отладки программного модуля и внесения его в мастер функций fx следует, находясь в ячейке G41, обратиться через ма-стер функций fx в данном случае к функции с именем zz (рис. 6.6).

Так как функция zz(A, Y) от двух параметров, то в появившем-ся окне функции в окне «A» указать адрес объекта (параметра) А – A8:D11, а в окне «Y» указать адрес объекта (параметра) Y – H8:H11.

Рис. 6.6

Затем одновременно нажать клавиши Ctrl-Shift-Enter.В ячейке G41 появится ответ 1220520.Таким образом, значение квадратичной формы z = YT AT A3Y для

заданного примера, вычисленное в VBA, равно 1220520.

ЧАСТЬ ВТОРАЯ

6.6. Операции над массивами в Excel

Пусть в соответствии с заданием (рис. 6.12) необходимо по формуле вычислить S при заданных массивах X, Y и B (рис. 6.7).

Выполнение лабораторной работы начинается с внесения ис-ходных данных задания в соответствующие ячейки таблицы Excel в выбранной адресации:

Page 19: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

36 37

Рис. 6.7

значения вектора X – B46:E46;значения вектора Y – B48:E48;значения матрицы B – G47:H48 (см. рис. 6.7).

Затем в ячейке D52 через мастер функций fx по формуле =СУММ(G47:H48) вычисляется сумма элементов двумерного мас-сива B (рис. 6.8).

Далее в ячейке D55 через мастер функций fx по формуле =СУММ(B46:E46) вычисляется сумма элементов одномерного массива X (рис. 6.9).

После этого в ячейке D58 через мастер функций fx по формуле =СУММКВ(B48:E48) вычисляется сумма квадратов элементов од-номерного массива Y (рис. 6.10).

Затем в ячейке D62 через мастер функций fx по формуле =СУММ(B48:E48) вычисляется сумма элементов одномерного массива Y (рис. 6.11).

Рис. 6.8 Рис. 6.9 Рис. 6.10 Рис. 6.11

После этого в ячейке F58 записывается арифметическое выра-жение =(2*D55+2*D58+5*D52^3)/(3+D62), соответствующее зада-нию (рис. 6.12), и вычисляется величина S (см. рис. 6.7).

Рис. 6.12

В итоге получается, что величина S, вычисленная с помощью функций Excel, равна 549,625.

6.7. Операции над массивами в VBA

Для вычисления величины S в VBA необходимо создать пользо-вательскую функцию в виде модуля VBA.

Программа вычисления величины S в VВА

Function s(x As Variant, y As Variant, b As Variant)z1 = Application.WorksheetFunction.Sum(x)z2 = Application.WorksheetFunction.SumSq(y)

Excel

Page 20: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

38 39

Рис. 6.13

z3 = Application.WorksheetFunction.Sum(b)z4 = Application.WorksheetFunction.Sum(y)s = (2 * z1 + 2 * z2 + 5 * z3 ^ 3) / (3 + z4)End Function

Некоторые комментарии к программе:в программе используются промежуточные переменные z1 – z4;в программе можно ввести комментарии для каждой строки;процесс отладки модуля можно выполнять по частям, для

чего соответствующим образом изменять последний оператор присваивания, например s = z2.

После отладки программного модуля и внесения его в мастер функций fx следует, находясь в ячейке G58, обратиться через ма-стер функций fx к функции с именем s (см. рис. 6.7).

Так как функция s(X, Y, B) от трех параметров, то в появившем-ся окне функции (рис. 6.13) в окне «X» указать адрес объекта (па-раметра) X – B46:E46, в окне «Y» указать адрес объекта (параме-тра) Y – B48:E48, а в окне «B» указать адрес объекта (параметра) B – G47:H48.

Затем следует одновременно нажать клавиши Ctrl-Shift-Enter.В ячейке G58 появится ответ 549,625.Таким образом, значение величины S для заданного примера,

вычисленное в VBA, равно 549,625.

7. ОПЕРАТОРЫ ЦИКЛА

Целью лабораторной работы «Операторы цикла» является осво-ение грамматических конструкций VBA, обеспечивающих эффек-тивную организацию циклических процессов.

Лабораторная работа «Операторы цикла» выполняется только в среде VBA.

При этом одна и та же разветвляющаяся функция G(x) из ранее выполненной лабораторной работы «Табулирование разветвляю-щейся функции» табулируется на листе Excel семь раз с использо-ванием семи различных конструкций операторов цикла:

Do While … loop ;Do Loop … while ;Do Until … loop ;Do Loop … until ;While … wend ;For … next ;For Each … next .Критерием правильности является совпадение полученных та-

блиц (рис. 7.1).

Excel

Page 21: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

40 41

Рис.

7.1

Выполнение этой лабораторной работы целесообразно начи-нать с копирования программного модуля VBA из лабораторной работы «Табулирование разветвляющейся функции».

ПРОГРАММНЫЙ МОДУЛЬ VBA ИЗ ЛАБОРАТОРНОЙ РАБОТЫ «ТАБУЛИРОВАНИЕ РАЗВЕТВЛЯЮЩЕЙСЯ ФУНКЦИИ»

СКОПИРОВАТЬ В МОДУЛЬ ПЕРВОГО ОБЪЕКТА CommandButton1 ЛАБОРАТОРНОЙРАБОТЫ «ОПЕРАТОРЫ ЦИКЛА».

Внести изменения, соответствующие использованию грамма-тической конструкции Do While … loop. Убедиться в правильно-сти функционирования.

ПРОГРАММНЫЙ МОДУЛЬ VBA ПЕРВОГО ОБЪЕКТА CommandButton1 СКОПИРОВАТЬ В МОДУЛЬ ВТОРОГО

ОБЪЕКТА CommandButton2.

Внести изменения, соответствующие использованию грамма-тической конструкции Do Loop … while. Убедиться в правильно-сти функционирования.

Последовательно повторить эти операции для всех видов опера-торов цикла, т. е. до конструкции For Each … next включительно.

Программы табулирования разветвляющейся функции в VВАс использованием операторов цикла

Private Sub CommandButton1_Click()Dim i As IntegerDim j As IntegerDim x As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 1), Cells(28, 3)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)

Рис.

7.1

Page 22: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

42 43

xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 1)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1x = xnDo While x <= xkCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End Ifx = x + xd: i = i + 1LoopEnd Sub

Private Sub CommandButton2_Click()Dim i As IntegerDim j As IntegerDim x As Doublew = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 4), Cells(28, 6)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 4)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1x = xnDoCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End Ifx = x + xd: i = i + 1

Loop While x <= xkEnd Sub

Private Sub CommandButton3_Click()Dim i As IntegerDim j As IntegerDim x As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 7), Cells(28, 9)) = Clearw = InputBox("w =", "очистить диапазон? - Y/N")If w = "Y" Then Range(Columns(1), Rows(15)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 7)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1x = xnDo Until x > xkCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End Ifx = x + xd: i = i + 1LoopEnd Sub

Private Sub CommandButton4_Click()Dim i As IntegerDim j As IntegerDim x As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 10), Cells(28, 12)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)

Page 23: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

44 45

xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 10)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1x = xnDoCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End Ifx = x + xd: i = i + 1Loop Until x > xkEnd Sub

Private Sub CommandButton5_Click()Dim i As IntegerDim j As IntegerDim x As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 13), Cells(28, 15)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 13)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1x = xnWhile x <= xkCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End If

x = x + xd: i = i + 1WendEnd Sub

Private Sub CommandButton6_Click()Dim i As IntegerDim j As IntegerDim x As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 16), Cells(28, 18)) = Clearxn = InputBox("xn =", "Введите начало диапазона", -3)xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 16)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1For x = xn To xk Step xdCells(i, j) = Format(x, "0.0#")If x <= 0 ThenCells(i, j + 1) = Format(g(x), "#0.0###")ElseCells(i, j + 2) = Format(g(x), "#0.0###")End Ifi = i + 1Next xEnd Sub

Private Sub CommandButton7_Click()Dim i As IntegerDim j As IntegerDim k As IntegerDim x() As DoubleDim y() As DoubleDim w As Stringw = InputBox("w =", "очистить диапазон? - (Y,y,Д,д)/N")If (w = "Y") Or (w = "y") Or (w = "Д") Or (w = "д") Then Range(Cells(7, 19), Cells(28, 21)) = Clear‘If w = "Y" Then Range(Columns(1), Rows(19)) = Clear

Page 24: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

46 47

xn = InputBox("xn =", "Введите начало диапазона", -3)xk = InputBox("xk =", "Введите конец диапазона", 7)xd = InputBox("xd =", "Введите шаг изменения переменной", 0.5)i = InputBox("i =", "Введите начало таблицы, строку", 7)j = InputBox("j =", "Введите начало таблицы, столбец", 19)Cells(i, j) = "X": Cells(i, j + 1) = "G1": Cells(i, j + 2) = "G2"i = i + 1i0 = iReDim x((xk - xn) / xd)ReDim y((xk - xn) / xd)For k = 0 To (xk - xn) / xdx(k) = xn + k * xdy(k) = g(x(k))Next kFor Each n In xCells(i, j) = Format(n, "0.0#")i = i + 1Next ni = i0k = 0For Each n In yIf x(k) <= 0 Then Cells(i, j + 1) = Format(n, "#0.0###") Else Cells(i, j + 2) = Format(n, "#0.0###")i = i + 1k = k + 1Next nEnd Sub

Некоторые комментарии к программам:в программах используется специально созданная пользова-

тельская функция g(x).Процесс создания функции пользователя следующий:находясь в Excel, включить редактор VBA, нажав ALT-F11;включить режим вставки (insert);выбрать Module;в появившемся окне написать текст модуля, соответствую-

щий программируемой функции –

Function g(x)If x <= 0 Then g = Sin(x) Else g = Exp(-x)End Function

нажать пиктограмму – Run Sub/UserForm;в появившемся окне Macros щелкнуть по клавише Cancel,

что обеспечивает внесение функции g(x) в библиотеку модулей мастера функций fx; с этого момента функция g(x) доступна всем пользователям мастера функций fx в разделах «Полный алфавит-ный перечень» либо «Определенные пользователем».

ИМЕНА ПОЛЬЗОВАТЕЛЬСКИХ ФУНКЦИЙ НЕ ДОЛЖНЫ СОВПАДАТЬ С АДРЕСАМИ ЯЧЕЕК ТАБЛИЦЫ EXCEL.

В программах используется функция Format(x, "0.0#”), кото-рая обеспечивает вывод указанной переменной, в данном случае X, в заданном формате «0.0#», в данном случае один разряд до де-сятичной точки, два – после.

В модуле с оператором For Each … next используется динами-ческое объявление массивов

Dim x() As DoubleDim y() As Double

с последующим уточнением мерности массивов

ReDim x((xk - xn) / xd)ReDim y((xk - xn) / xd)

которое может размещаться в любом месте программы.Так как оператор цикла For Each … next может оперировать

только с элементами одного множества, то для вывода спектров значений аргумента X и функции g(x) используются два разных оператора

For Each n In x…Next n

и

For Each n In y…Next n.

Page 25: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

48 49

8. ИГРА «УГАДАЙ ЧИСЛО»

Целью лабораторной работы является приобретение навыков практического использования функций RND (Randomize) – для генерирования случайных чисел в заданном диапазоне; Round – округление; Cstr для выполнения операции сцепления (конкатена-ции) символьных данных.

Сценарий, алгоритм игры следующий: программа «загадывает» целое (для простоты) число в заданном диапазоне и на предлага-емые играющим варианты ответов сообщает – больше или мень-ше «загаданное» ею число, считая при этом количество попыток. Выводимая информация – диалог программы с игроком – опреде-ляется программистом (рис. 8.1).

Программа игры в VВА

Private Sub CommandButton1_Click()Dim L, a, x As IntegerRange(Cells(5, 1), Cells(25, 7)) = Cleard = InputBox("D =", "Введите диапазон игры")Cells(5, 2) = "Ну что ж, играем, угадай число X в диапазоне от 0 до " + CStr(d)Randomizex = Round(d * Rnd())L = 0: i = 10: j = 210 a = InputBox("x =", "Введите ваш вариант")L = L + 1: i = i + 1If x > a ThenCells(i, j) = "Загаданное число X больше вашего числа " + CStr(a)GoTo 10End IfIf x < a ThenCells(i, j) = "Загаданное число X меньше вашего числа " + CStr(a)GoTo 10End IfIf x = a ThenCells(i, j) = "Да, это число " + CStr(a) + ", Угадал, за " + CStr(L) + " попыток"Cells(1, 1).SelectExit SubEnd IfEnd Sub

Рис.

8.1

Рис.

8.1

Ну что ж

,

Page 26: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

50 51

Некоторые комментарии к программе:в программе реализована только основа алгоритма;можно добавить нижнюю границу диапазона; выполнить тре-

бования грамматики русского языка и с помощью условных опера-торов, считающих количество попыток, согласовать ответы про-граммы; ввести предложение сыграть еще и т. д.

9. ПОЛЬЗОВАТЕЛЬСКИЕ ФОРМЫ

Целью лабораторной работы является приобретение навыков практического использования объектов Userform, Textbox, Label, CheckBox, OptionButton и других.

Рекомендуется созданные пользовательские формы объеди-нять и активизировать с помощью кнопочного меню (рис. 9.1, 9.2).

Рис. 9.1

Рис. 9.2

Каждая кнопка меню обеспечивает вызов соответствующего объекта Userform, например:

Private Sub CommandButton2_Click()UserForm1.ShowEnd Sub

Кнопка 2 вызывает калькулятор 1, использующий для выбора арифметических операций объекты OptionButton (рис. 9.3).

Page 27: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

52 53

Рис. 9.3

9.1. Калькулятор с OptionButton

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (рис. 9.4) последовательно переместить:три объекта Label;три объекта Textbox;

пять объектов OptionButton;два объекта CommandButton,

расположив их, как показано на рис. 9.3.Если будут использоваться объекты Frame (рамка) (см. рис. 9.3),

два из которых переименованы в «Исходные данные» и «Ариф-метические действия», то необходимо помнить правило:

Объекты помещаются в Frame, а не Frame «одевается»на объекты!

Далее открыть модуль, программно поддерживающий объ-ект CommandButton1 (в свойстве Caption переименованный в «Вычислить») объекта UserForm, и написать программу, обе-спечивающую организацию взаимодействия выбранных объек-тов для получения результатов при выбранных арифметических операциях.

Рис. 9.4

Page 28: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

54 55

Программа калькулятора с OptionButton

Private Sub CommandButton1_Click()If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) ThenMsgBox "Исходные данные введены неверно или не полностью!", , "Введите числа"Exit SubEnd IfA = CDbl(TextBox1)B = CDbl(TextBox2)If OptionButton1 = True Then TextBox3 = A + BIf OptionButton2 = True Then TextBox3 = A - BIf OptionButton3 = True ThenIf B <> 0 Then TextBox3 = A / B Else TextBox3 = "На ноль не делим!"End IfIf OptionButton4 = True Then TextBox3 = A * BIf OptionButton5 = True ThenIf (A = 0) And (B <= 0) Then TextBox3 = "Недопустимые значения!" Else TextBox3 = A ^ BEnd IfEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:в программе используется функция IsNumeric(TextBox1),

проверяющая, являются ли данные, помещенные в объекте TextBox1 или TextBox2, цифровыми;

в программе используется функция CDbl(TextBox), обеспе-чивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;

в программе обрабатывается ситуация невозможности деле-ния на ноль;

в программе обрабатывается ситуация невозможности возве-дения нуля в нулевую степень;

модуль объекта CommandButton2, который в свойстве Caption переименован в «Выход», обеспечивает завершение функциониро-вания объекта UserForm.

9.2. Калькулятор с CheckBox

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:два объекта Label;семь объектов Textbox;пять объектов CheckBox;четыре объекта Frame;два объекта CommandButton,

расположив их, как показано на рис. 9.5.

Рис. 9.5

Page 29: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

56 57

В объекте UserForm используются четыре объекта Frame (рам-ка) (см. рис. 9.5), три из которых переименованы в «Исходные дан-ные», «Результаты» и «Арифметические действия».

Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вычис-лить») объекта UserForm, и написать программу, обеспечиваю-щую организацию взаимодействия выбранных объектов для полу-чения результатов при выбранных арифметических операциях.

Программа калькулятора с CheckBox

Private Sub CommandButton1_Click()If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) ThenMsgBox "Исходные данные введены неверно или не полностью!", , "Введите числа"Exit SubEnd IfA = CDbl(TextBox1)B = CDbl(TextBox2)If CheckBox1 = True Then TextBox3 = A + B Else TextBox3 = ""If CheckBox2 = True Then TextBox4 = A - B Else TextBox4 = ""If CheckBox4 = True ThenIf B <> 0 Then TextBox6 = A / B Else TextBox6 = "На ноль не делим!"Else TextBox6 = ""End IfIf CheckBox3 = True Then TextBox5 = A * B Else TextBox5 = ""If CheckBox5 = True ThenIf A = 0 And B <= 0 Then TextBox7 = "Недопустимые значения!" Else TextBox7 = A ^ BElse TextBox7 = ""End IfEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:калькулятор с CheckBox, в отличие от калькулятора с Op-

tionButton, позволяет вывести одновременно результаты вычисле-

ний всех или части выбранных операций, для чего используются пять объектов TextBox;

в программе используется функция IsNumeric(TextBox), про-веряющая, являются ли данные, помещенные в объекте TextBox1 или TextBox2, цифровыми;

в программе используется функция CDbl(TextBox), обеспе-чивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;

в программе обрабатывается ситуация невозможности деле-ния на ноль;

в программе обрабатывается ситуация невозможности возве-дения нуля в нулевую степень;

в программе обеспечивается ситуация вывода пустого окна в случае, если какой-либо CheckBox не выбран;

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Выход», обеспечивает завершение функцио-нирования объекта UserForm.

9.3. Логарифмический калькулятор

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:два объекта Label;пять объектов Textbox;три объекта CheckBox;четыре объекта Frame;два объекта CommandButton,

расположив их, как показано на рис. 9.6.В объекте UserForm используются четыре объекта Frame (рам-

ка) (см. рис. 9.6), три из которых переименованы в «Исходные дан-ные», «Результаты» и «Действия».

Page 30: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

58 59

Рис. 9.6

Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вы-числить») объекта UserForm, и написать программу, обеспечиваю-щую организацию взаимодействия выбранных объектов для полу-чения результатов при выбранных математических операциях.

Программа логарифмического калькулятора

Private Sub CommandButton1_Click()If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) ThenMsgBox "Исходные данные введены неверно или не полностью!", , "Введите числа"

Exit SubEnd IfA = CDbl(TextBox1)B = CDbl(TextBox2)If CheckBox1 = True ThenIf B > 0 And B <> 1 And A > 0 Then TextBox3 = Application.WorksheetFunction. Log(A, B) Else TextBox3 = "Недопустимые значения!"Else TextBox3 = ""End IfIf CheckBox2 = True ThenIf A > 0 Then TextBox4 = Application.WorksheetFunction.Log10(A) Else TextBox4 = "Недопустимые значения!"Else TextBox4 = ""End IfIf CheckBox3 = True ThenIf A > 0 Then TextBox5 = Application.WorksheetFunction.Ln(A) Else TextBox5 = "Недопустимые значения!"Else TextBox5 = ""End IfEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:логарифмический калькулятор с CheckBox позволяет выве-

сти одновременно результаты вычислений трех видов логарифмов или некоторых, для чего используются три объекта TextBox;

в программе используется функция IsNumeric(TextBox1), проверяющая, являются ли данные, помещенные в объекте Text-Box1 или TextBox2, цифровыми;

в программе используется функция CDbl(TextBox), обеспе-чивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;

в программе обрабатывается ситуация невозможности вы-числения логарифмов от отрицательного числа или числа, равно-го нулю;

в программе обеспечивается ситуация вывода пустого окна в случае, если какой-либо CheckBox не выбран;

Page 31: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

60 61

модуль объекта CommandButton2, который в свойстве Caption переименован в «Выход», обеспечивает завершение функ-ционирования объекта UserForm.

9.4. Решение квадратных уравнений

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:шесть объектов Label;шесть объектов Textbox;три объекта Frame;два объекта CommandButton,

расположив их, как показано на рис. 9.7.В объекте UserForm используются три объекта Frame (рамка)

(см. рис. 9.7), два из которых переименованы в «Исходные дан-ные» и «Результаты».

Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вы-числить»), объекта UserForm, и написать программу, обеспечива-ющую организацию взаимодействия выбранных объектов для по-лучения результатов при вычислении корней квадратного уравне-ния с заданными коэффициентами a, b и c.

Программа решения квадратных уравнений

Private Sub CommandButton1_Click()Dim A As Double, B As Double, C As DoubleDim X1 As Double, X2 As Double, D As DoubleIf IsNumeric(TextBoxA) And IsNumeric(TextBoxB) And IsNumeric(TextBoxC) ThenA = TextBoxA: B = TextBoxB: C = TextBoxC

Рис. 9.7

D = B ^ 2 - 4 * A * C: TextBoxD = DIf D >= 0 ThenX1 = (-B + D ^ (1 / 2)) / (2 * A)X2 = (-B - D ^ (1 / 2)) / (2 * A)TextBoxX1.Visible = True: TextBoxX1 = X1TextBoxX2.Visible = True: TextBoxX2 = X2Label4.Visible = TrueLabel4 = "X1"Label5.Visible = TrueElseTextBoxX1.Visible = FalseTextBoxX2.Visible = FalseLabel4 = "Нет решений"Label5.Visible = FalseEnd If

Page 32: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

62 63

ElseMsgBox "ВВЕДИТЕ A,B,C"End If

End Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:в программе для удобства в Properties в разделе Name объ-

ект TextBox1 переименован в TextBoxA, аналогично TextBox2 – TextBoxB, TextBox3 – TextBoxC, TextBox4 – TextBoxX1, TextBox5 – TextBoxX2 и TextBox6 – TextBoxD;

в программе используется функция INumeric(TextBox), про-веряющая, являются ли данные, помещенные в объекте TextBoxA, или в объекте TextBoxB, или в объекте TextBoxC, цифровыми;

в программе обрабатывается ситуация, когда дискриминант приобретает отрицательное значение, в этом случае объектам TextBoxX1, TextBoxX2 и Label5 сообщается свойство Visible со значением False, в результате чего указанные объекты становят-ся невидимыми, а объекту Label4 присваивается символьная кон-станта Нет решений (рис. 9.8);

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Выход», обеспечивает завершение функцио-нирования объекта UserForm.

9.5. Вычисление максимума, минимума, среднего арифметического, среднего геометрического

и среднего гармонического

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.

Рис. 9.8

Затем на появившуюся «платформу» объекта UserForm с пане-ли Toolbox (см. рис. 9.4) последовательно переместить:

одинадцать объектов Label;десять объектов Textbox;три объекта Frame;два объекта CommandButton,расположив их, как показано на рис. 9.9.В объекте UserForm используются три объекта Frame (рамка)

(см. рис. 9.9), два из которых переименованы в «Исходные дан-ные» и «Результаты».

Далее открыть модуль, программно поддерживающий объект CommandButton1 (в свойстве Caption переименованный в «Вы-числить») объекта UserForm, и написать программу, обеспечи-вающую организацию взаимодействия выбранных объектов для

Page 33: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

64 65

Рис. 9.9

получения результатов при вычислении максимального, мини-мального значений из пяти введенных чисел, а также вычисления среднего арифметического, среднего геометрического и среднего гармонического значений.

Программа вычисления максимума, минимума, среднего арифметического, среднего геометрического

и среднего гармонического

Private Sub CommandButton1_Click()If Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) Or Not IsNumeric(TextBox3) Or Not IsNumeric(TextBox4) Or Not IsNumeric(TextBox5) ThenMsgBox "Исходные данные введены неверно или не полностью!", , "Введите числа"

Exit SubEnd IfA = CDbl(TextBox1)B = CDbl(TextBox2)C = CDbl(TextBox3)D = CDbl(TextBox4)E = CDbl(TextBox5)TextBox6 = Application.WorksheetFunction.Max(A, B, C, D, E)TextBox7 = Application.WorksheetFunction.Min(A, B, C, D, E)TextBox8 = Application.WorksheetFunction.Average(A, B, C, D, E)TextBox9 = (A * B * C * D * E) ^ (1 / 5)If A <> 0 And B <> 0 And C <> 0 And D <> 0 And E <> 0 ThenTextBox10.Visible = TrueLabel11.Visible = TextBox10 = 5 / (1 / A + 1 / B + 1 / C + 1 / D + 1 / E)ElseTextBox10.Visible = FalseLabel11.Visible = TrueEnd IfEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:в программе используется функция INumeric(TextBox), про-

веряющая, являются ли данные, помещенные в объекте TextBox1, или в объекте TextBox2, или в объекте TextBox3, или в объекте TextBox4, или в объекте TextBox5, цифровыми;

в программе используется функция CDbl(TextBox), обеспе-чивающая преобразование данных объектов TextBox1, TextBox2, TextBox3, TextBox4 и TextBox5 в цифровые;

в программе используются функции вычисления максимума Max(A, B, C, D, E), минимума Min(A, B, C, D, E) и среднего ариф-метического значения Average(A, B, C, D, E) для пяти введенных чисел A, B, C, D, E;

в программе при вычислении среднего гармонического об-рабатывается ситуация невозможности деления на ноль, при этом

Page 34: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

66 67

в объект TextBox10 выводится результат вычисления среднего гар-монического, а объект Label11 делается невидимым за счет сооб-щения ему через свойство Visible значения False, в противном слу-чае – наоборот: невидимым делается объект TextBox10, а объек-ту Label11 через свойство Caption передается значение «Числа должны быть отличны от нуля!» (рис. 9.10);

Рис. 9.10

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Выход», обеспечивает завершение функцио-нирования объекта UserForm.

9.6. Использование объекта ScrollBar (полоса прокрутки)

Создание пользовательской формы организуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:три объекта Textbox;

три объекта ScrollBar;один объект CommandButton,

расположив их, как показано на рис. 9.11.

Рис. 9.11

Далее войти в VBA (Alt-F11), выбрать объект UserForm. Затем, выбрав сначала, например, объект ScrollBar1, написать соответ-ствующую программу, обеспечивающую организацию взаимодей-ствия выбранных объектов для изменения цвета объект UserForm в зависимости от состояний объектов ScrollBar1, ScrollBar2 и ScrollBar3.

И так для каждого из семи объектов объекта UserForm.

Page 35: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

68 69

Программы использования объекта ScrollBar

Private Sub ScrollBar1_Change()UserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)TextBox1 = CStr(ScrollBar1)End Sub

Private Sub ScrollBar2_Change()UserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)TextBox2 = CStr(ScrollBar2)End Sub

Private Sub ScrollBar3_Change()UserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)TextBox3 = CStr(ScrollBar3)End Sub

Private Sub TextBox1_Change()Dim Red As IntegerIf (TextBox1 = " ") Or (TextBox1 = "") ThenRed = 0ElseRed = CDbl(TextBox1)End IfIf (Red >= 0) And (Red <= 255) ThenScrollBar1.Value = RedUserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)ElseMsgBox "от 0 до 255"End IfEnd Sub

Private Sub TextBox2_Change()Dim Green As ByteGreen = TextBox2If Green >= 0 And Green <= 255 ThenScrollBar2.Value = GreenUserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)ElseMsgBox "от 0 до 255"End IfEnd Sub

Private Sub TextBox3_Change()Dim Blue As ByteBlue = TextBox3If Red >= 0 And Blue <= 255 ThenScrollBar3.Value = BlueUserForm5.BackColor = RGB(ScrollBar1, ScrollBar2, ScrollBar3)ElseMsgBox "от 0 до 255"End IfEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:в модуле Private Sub ScrollBar1_Change(), программно

поддерживающем объект ScrollBar1, используется функция RGB(ScrollBar1, ScrollBar2, ScrollBar3), вычисленное значение которой присваивается как значение свойства .BackColor объекту UserForm5;

функция RGB(ScrollBar1, ScrollBar2, ScrollBar3) есть функ-ция от трех формальных параметров, фактическими параметрами которой в данном случае являются состояния объектов ScrollBar1, ScrollBar2, ScrollBar3;

состояние каждого из объектов ScrollBar1, ScrollBar2, ScrollBar3, т. е. положение «бегунка» на полосе прокрутки, как ко-личественное значение изменяется в свойствах maх и min панели Properties в диапазоне 255–0;

это значение, преобразованное с помощью функции CStr(Scroll-Bar1) в символьную величину, присваивается объекту TextBox1 для визуального отображения;

аналогичным образом построены и функционируют моду-ли Private Sub ScrollBar2_Change() и Private Sub ScrollBar3_Change();

в модуле Private Sub TextBox2_Change(), программно под-держивающем объект TextBox2, переменной Green присваивается

Page 36: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

70 71

значение, внесенное в окно объекта TextBox2, а затем это значе-ние, если оно принадлежит диапазону 0–255, передается объек-ту ScrollBar2. Таким образом управлять изменением цвета объек-та UserForm2 можно за счет перемещения «бегунка» на полосе прокрутки объекта ScrollBar2 и, наоборот, путем внесения целого числа в окно объекта TextBox2;

аналогичным образом построены и функционируют модули Private Sub TextBox1_Change() и Private Sub TextBox3_Change();

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Выход», обеспечивает завершение функцио-нирования объекта UserForm.

10. РАБОТА С ОБЪЕКТОМ LISTBOX

Целью лабораторной работы является приобретение навыков практического использования объекта ListBox, т. е. заполнение и обработка данных.

Объект ListBox применяется для хранения списка значений, из которого пользователь может выбрать одно или несколько значений, которые в последующем будут использоваться в тексте программы.

Заполняется объект ListBox только программно!

При этом используются следующие способы заполнения:поэлементно, если список состоит из одной колонки;массивом, если список состоит из одной колонки;из диапазона, в который предварительно введены элементы

списка;поэлементно, если список состоит из нескольких колонок;массивом, если список состоит из нескольких колонок.Создаваемые объекты ListBox можно размещать как на спе-

циально созданных объектах UserForm, например, на одном (рис. 10.1) или на нескольких (рис. 10.2), так и на листах Excel (рис. 10.3), используя при этом для вызова и заполнения кнопки (объекты CommandButton).

Рис. 10.1

Рис. 10.2

Page 37: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

72 73

Рис. 10.3

ЧАСТЬ ПЕРВАЯ

10.1. Заполнение объектов ListBox, расположенныхна одном объекте UserForm

Создание пользовательской формы c объектами ListBox орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.

Затем на появившуюся «платформу» объекта UserForm с пане-ли Toolbox (см. рис. 9.4) последовательно переместить:

пять объектов ListBox;один объект TextBox;два объекта CommandButton,

расположив их, как показано на рис. 10.1.Далее войти в VBA (Alt-F11), выбрать объект UserForm.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-тов ListBox1 – ListBox5.

Для реализации заполнения объекта ListBox3 способом «Из диапазона» необходимо предварительно ввести элементы списка в выбранный диапазон, например A1:B6 (см. рис. 10.1).

Программа заполнения объектов ListBox, расположенныхна одном объекте UserForm

Private Sub CommandButton1_Click()Dim S(1 To 5, 1 To 3) As StringDim i As Integer, j As Integer

'Заполнение списка поэлементно, 1 колонкаWith ListBox1.AddItem "Июнь".AddItem "Июль".AddItem "Август".AddItem "Сентябрь"End With

'Заполнение списка массивом, 1 колонкаWith ListBox2.List = Array("Июнь", "Июль", "Август", "Сентябрь", "Октябрь")TextBox1 = .ListIndex.ControlSource = "A7"End With

'Заполнение списка из диапазонаWith ListBox3.ColumnCount = 2

Page 38: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

74 75

.RowSource = "A1:B6"

.ControlSource = "A8"End With

'Заполнение списка поэлементно, несколько колонокWith ListBox4.ColumnCount = 3.AddItem "Июнь".List(0, 1) = "0.6".List(0, 2) = "30".AddItem "Июль".List(1, 1) = "0.7".List(1, 2) = "31".AddItem "Август".List(2, 1) = "0.8".List(2, 2) = "31".AddItem "Сентябрь".List(3, 1) = "0.9".List(3, 2) = "30"End With

'Заполнение списка массивом, несколько колонокS(1, 1) = "№": S(1, 2) = "ФИО": S(1, 3) = "Оценка"S(2, 1) = "1": S(2, 2) = "Петров": S(2, 3) = "3"S(3, 1) = "2": S(3, 2) = "Шацков": S(3, 3) = "5"S(4, 1) = "3": S(4, 2) = "Фролькис": S(4, 3) = "2"S(5, 1) = "4": S(5, 2) = "Печкин": S(5, 3) = "4"With ListBox5.ColumnCount = 3.List = SEnd WithEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программ-

но поддерживающем объект CommandButton1, при реализа-ции способа поэлементного заполнения списка ListBox1 к объ-екту ListBox1 применяется метод AddItem, с помощью которого

в операторе цикла With добавляются элементы списка, например .AddItem "Июнь" и т. д.;

в модуле Private Sub CommandButton1_Click(), программно поддерживающем объект CommandButton1, при реализации спо-соба заполнения списка ListBox2 массивом, если список состоит из одной колонки, к объекту ListBox2 применяется свойство .List, в качестве значения которого объекту ListBox2 передается одно-мерный массив символьных констант "Июнь", "Июль" и т. д.;

для списка ListBox2 применяется свойство .ControlSource, с помощью которого устанавливается ячейка (в данном случае это "A7"), в которую возвращается выбранный элемент списка ListBox2; так как на рис. 10.1 в списке ListBox2 была выбрана вто-рая строка, второй элемент списка "Июль", то поэтому этот эле-мент и отобразился в ячейке A7;

в операторе цикла With объекта ListBox2 для объекта TextBox1 применяется свойство .ListIndex, которое возвращает номер текущего, т. е. выбранного, элемента списка. Так как пер-воначально после вызова объекта UserForm объекты ListBox1 – ListBox5 не заполнены и, следовательно, в объекте ListBox2 никакой элемент списка не выбран, то после нажатия кнопки «Заполнить» в окне объекта TextBox1 (см. рис. 10.1) появляется значение «-1». После выбора в объекте ListBox2 элемента списка "Июль" и повторного нажатия кнопки «Заполнить» в окне объек-та TextBox1 (см. рис. 10.1) появляется значение «1», а не «2», так как нумерация элементов списка начинается с нуля;

в модуле Private Sub CommandButton1_Click(), программно поддерживающем объект CommandButton1, при реализации спо-соба заполнения списка ListBox3 из диапазона к объекту ListBox3 применяется свойство RowSours, с помощью которого устанавли-вается диапазон, содержащий элементы списка, в данном случае "A1:B6";

так как данные, передаваемые из указанного диапазона в объект ListBox3, представляют собой таблицу, состоящую из двух столбцов, то к объекту ListBox3 применяется свойство .ColumnCount, значение которого устанавливает число столбцов в списке = 2;

Page 39: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

76 77

для списка ListBox3 применяется свойство .ControlSource, с помощью которого устанавливается ячейка (в данном случае это "A8"), в которую возвращается выбранный элемент списка ListBox3. Так как на рис. 10.1 в списке ListBox3 была выбрана пя-тая строка списка ListBox3, элементом которого является "5", то поэтому этот элемент и отобразился в ячейке A8;

в модуле Private Sub CommandButton1_Click(), программ-но поддерживающем объект CommandButton1, при реализации способа заполнения списка ListBox4 поэлементно, если список состоит из нескольких колонок, к объекту ListBox4 применяется метод AddItem, с помощью которого в операторе цикла With до-бавляются элементы списка, например .AddItem "Июнь" и т. д.; к объекту ListBox4 применяется свойство .List, в качестве значе-ний которого элементам списка ListBox4, находящимся на пересе-чении указанных строк и столбцов, сообщаются соответствующие символьные константы, например "0.6", "30" и т. д.;

так как данные, формируемые в объекте ListBox4, представ-ляют собой таблицу, состоящую из трех столбцов, то к объекту ListBox4 применяется свойство .ColumnCount, значение которо-го устанавливает число столбцов в списке = 3;

в модуле Private Sub CommandButton1_Click(), программ-но поддерживающем объект CommandButton1, при реализации способа заполнения списка ListBox5 массивом, если список состо-ит из нескольких колонок, сначала объявляется двумерный мас-сив S, а затем с помощью операторов присваивания выполняет-ся заполнение элементов массива. После этого к объекту ListBox5 применяется свойство .List, в качестве значения которого объек-ту ListBox5 передается двумерный массив символьных констант "№", "ФИО", "Оценка" и т. д. Кроме того, к объекту ListBox5 применяется свойство .ColumnCount, значение которого устанав-ливает число столбцов в списке = 3;

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Выход», обеспечивает завершение функцио-нирования объекта UserForm.

10.2. Заполнение объектов ListBox, расположенных на разных объектах UserForm

Создание пользовательских форм c объектами ListBox це-лесообразно начинать с формирования кнопочного меню (см. рис. 10.2).

Тогда в каждом модуле, программно поддерживающем соответ-ствующий объект CommandButton, находится обращение к опре-деленному объекту UserForm.

10.2.1. Заполнение списка поэлементно, если список состоит из одной колонки

Вызов объекта UserForm1, на базе которого организуется за-полнение списка объекта ListBox1 поэлементно (если список со-стоит из одной колонки), осуществляется с помощью следующего программного модуля:

Private Sub CommandButton1_Click()UserForm1.ShowEnd Sub

Создание пользовательской формы c объектом ListBox1 орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;два объекта CommandButton,

расположив их, как показано на рис. 10.4.Далее войти в VBA (Alt-F11), выбрать объект UserForm1.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-та ListBox1.

Page 40: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

78 79

Рис. 10.4

Программа поэлементного заполнения списка объекта ListBox, если список состоит

из одной колонки

Private Sub CommandButton1_Click()

‘Заполнение списка поэлементно, 1 колонкаWith ListBox1.AddItem «Июнь».AddItem «Июль».AddItem «Август».AddItem «Сентябрь»End WithEnd Sub

Private Sub CommandButton2_Click()UserForm1.HideEnd Sub

Некоторые комментарии к программе:модуль объекта CommandButton2, который в свойстве Cap-

tion переименован в «Закрыть», обеспечивает завершение функ-ционирования объекта UserForm за счет применения к объекту UserForm1 метода Hide.

10.2.2. Заполнение списка массивом, если списоксостоит из одной колонки

Вызов объекта UserForm2, на базе которого организуется за-полнение списка объекта ListBox1 массивом (если список состоит из одной колонки), осуществляется с помощью следующего про-граммного модуля:

Private Sub CommandButton2_Click()UserForm2.ShowEnd Sub

Создание пользовательской формы c объектом ListBox1 орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;один объект TextBox;два объекта CommandButton,

расположив их, как показано на рис. 10.5.Далее войти в VBA (Alt-F11), выбрать объект UserForm2.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-та ListBox1.

Page 41: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

80 81

Рис. 10.5

Программа заполнения списка объекта ListBox массивом, если список состоит

из одной колонки»

Private Sub CommandButton1_Click()

‘Заполнение списка массивом, 1 колонкаWith ListBox1.List = Array("Июнь", "Июль", "Август", "Сентябрь", "Октябрь")End WithEnd Sub

Private Sub ListBox1_Click()TextBox1.Text = ListBox1.TextCells(10, 3).Value = ListBox1.TextEnd Sub

Private Sub CommandButton2_Click()UserForm2.HideEnd Sub

Некоторые комментарии к программе:в модуле Private Sub ListBox1_Click(), программно под-

держивающем объект ListBox1, к объекту ListBox1 применяется свойство .Text, которое позволяет получить значение текущего вы-бранного элемента объекта ListBox1. Это значение присваивает-ся объекту TextBox1, а так как выбран «сентябрь», то этот элемент и отображен в окне объекта TextBox1. Кроме того, этот же элемент списка объекта ListBox1 выведен в ячейку десятой строки и пято-го столбца таблицы Excel;

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Отменить», обеспечивает завершение функ-ционирования объекта UserForm за счет применения к объекту UserForm2 метода Hide (скрыть).

10.2.3. Заполнение списка из диапазона, в который предварительно введены элементы списка

Вызов объекта UserForm3, на базе которого организуется за-полнение списка объекта ListBox1 из диапазона, осуществляется с помощью следующего программного модуля:

Private Sub CommandButton3_Click()UserForm3.ShowEnd Sub

Создание пользовательской формы c объектом ListBox1 орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;два объекта CommandButton,

расположив их, как показано на рис. 10.6.Далее войти в VBA (Alt-F11), выбрать объект UserForm3.

Page 42: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

82 83

Рис. 10.6

Затем, выбрав объект CommandButton1, написать соответству-ющую программу, обеспечивающую заполнение данными объек-та ListBox1.

Программа заполнения списка объекта ListBox из диапазона

Private Sub CommandButton1_Click()With ListBox1.ColumnCount = 2.RowSource = "A1:B8"End WithEnd Sub

Private Sub CommandButton2_Click()UserForm3.HideEnd Sub

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программно

поддерживающем объект CommandButton1, при реализации спо-

соба заполнения списка ListBox1 из диапазона к объекту ListBox1 применяется свойство RowSours, с помощью которого устанавли-вается диапазон, содержащий элементы списка, в данном случае "A1:B8";

так как данные, передаваемые из указанного диапазона в объект ListBox1, представляют собой таблицу, состоящую из двух столбцов, к объекту ListBox1 применяется свойство .ColumnCount, значение которого устанавливает число столбцов в списке = 2;

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Закрыть», обеспечивает завершение функ-ционирования объекта UserForm за счет применения к объекту UserForm3 метода Hide (скрыть).

10.2.4. Заполнение списка поэлементно, если список состоит из нескольких колонок

Вызов объекта UserForm4, на базе которого организуется по-элементное заполнение списка объекта ListBox1 (если список со-стоит из нескольких колонок), осуществляется с помощью следу-ющего программного модуля:

Private Sub CommandButton1_Click()UserForm4.ShowEnd Sub

Создание пользовательской формы c объектом ListBox1 орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;два объекта CommandButton,

расположив их, как показано на рис. 10.7.

Page 43: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

84 85

Рис. 10.7

Далее войти в VBA (Alt-F11), выбрать объект UserForm4.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-та ListBox1.

Программа поэлементного заполнения списка объекта, если список состоит из нескольких колонок

Private Sub CommandButton1_Click()With ListBox1.ColumnCount = 3.AddItem "Сорокина".List(0, 1) = "Информатика".List(0, 2) = "зачет".AddItem "Донец".List(1, 1) = "Математика".List(1, 2) = "зачет".AddItem "Гусева".List(2, 1) = "Физика".List(2, 2) = "зачет".AddItem "Жигунова"

.List(3, 1) = "Начертательная геометрия"

.List(3, 2) = "зачет"End With

Private Sub CommandButton2_Click()UserForm4.HideEnd Sub

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программно

поддерживающем объект CommandButton1, при реализации спо-соба заполнения списка ListBox1 поэлементно (если список состо-ит из нескольких колонок) к объекту ListBox1 применяется метод AddItem, с помощью которого в операторе цикла With добавляются элементы списка, например .AddItem "Сорокина" и т. д.; кроме того, к объекту ListBox1 применяется свойство .List, в качестве значений которого элементам списка ListBox1, находящимся на пересечении указанных строк и столбцов, сообщаются соответ-ствующие символьные константы, например "Информатика", "зачет" и т. д.;

так как данные, формируемые в объекте ListBox1, пред-ставляют собой таблицу, состоящую из трех столбцов, к объекту ListBox1 применяется свойство .ColumnCount, значение которого устанавливает число столбцов в списке = 3;

модуль объекта CommandButton2, который в свойстве Caption переименован в «Закрыть», обеспечивает завершение функционирования объекта UserForm за счет применения к объ-екту UserForm4 метода Hide (скрыть).

10.2.5. Заполнение списка массивом, если список состоитиз нескольких колонок

Вызов объекта UserForm5, на базе которого организуется за-полнение списка объекта ListBox1 массивом (если список состоит из нескольких колонок), осуществляется с помощью следующего программного модуля:

Page 44: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

86 87

Private Sub CommandButton1_Click()UserForm5.ShowEnd Sub

Создание пользовательской формы c объектом ListBox1 орга-низуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;два объекта CommandButton,

расположив их, как показано на рис. 10.8.

Рис. 10.8

Далее войти в VBA (Alt-F11), выбрать объект UserForm5.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-та ListBox1.

Программа заполнения списка объекта массивом, если список состоит из нескольких колонок

Private Sub CommandButton1_Click()Dim S(1 To 5, 1 To 3)Dim i As IntegerDim j As IntegerS(1, 1) = "N": S(1, 2) = "ФИО": S(1, 3) = "Оценка"S(2, 1) = "1": S(2, 2) = "Сорокина": S(2, 3) = "5"S(3, 1) = "2": S(3, 2) = "Донец": S(3, 3) = "5"S(4, 1) = "3": S(4, 2) = "Гусева": S(4, 3) = "5"S(5, 1) = "4": S(5, 2) = "Жигунова": S(5, 3) = "5"With ListBox1.ColumnCount = 3.List = SEnd WithEnd Sub

Private Sub CommandButton2_Click()UserForm4.HideEnd Sub

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программно

поддерживающем объект CommandButton1, при реализации спосо-ба заполнения списка ListBox1 массивом (если список состоит из не-скольких колонок) сначала объявляется двумерный массив S, а затем с помощью операторов присваивания выполняется заполнение эле-ментов массива. После чего к объекту ListBox1 применяется свойство .List, в качестве значения которого объекту ListBox1 передается дву-мерный массив символьных констант "№", "ФИО, "Оценка" и т. д.;

так как данные, формируемые в объекте ListBox1, пред-ставляют собой таблицу, состоящую из трех столбцов, к объекту ListBox1 применяется свойство .ColumnCount, значение которого устанавливает число столбцов в списке = 3;

модуль объекта CommandButton2, который в свойстве Cap-tion переименован в «Закрыть», обеспечивает завершение функ-ционирования объекта UserForm за счет применения к объекту UserForm5 метода Hide (скрыть).

Page 45: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

88 89

10.3. Заполнение объектов ListBox, расположенных на листе Excel

Создание объектов ListBox на листе Excel организуется следу-ющим образом:

выбрать в верхнем горизонтальном меню «Вид»;выбрать в подменю «Панель инструментов»;выбрать в подменю «Элементы управления».Затем с панели Элементы управления на лист Excel (рис. 10.9)

последовательно переместить:четыре объекта ListBox;три объекта CommandButton,

расположив их, как показано на рис. 10.9.

Рис. 10.9

Далее войти в VBA (Alt-F11), выбрать объект CommandButton1.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую заполнение данными объек-тов ListBox1, ListBox2, ListBox4, ListBox5.

Программа заполнения объектов ListBox, расположенных на листе Excel

Private Sub CommandButton1_Click()Dim s(1 To 5, 1 To 3) As StringDim i As Integer, j As Integer

'Заполнение списка поэлементно, 1 колонкаWith ListBox1.AddItem "Июнь".AddItem "Июль".AddItem "Август".AddItem "Сентябрь"End With

'Заполнение списка массивом, 1 колонкаWith ListBox2.List = Array("январь", "февраль", "март", "апрель", "май", "июнь", "июль", "август", "сентябрь", "октябрь", "ноябрь", "декабрь")End With

'Заполнение списка поэлементно, несколько колонокs(1, 1) = "N": s(1, 2) = "Ф.И.О.": s(1, 3) = "Оценка":s(2, 1) = "1": s(2, 2) = "Петров": s(2, 3) = "5"s(3, 1) = "2": s(3, 2) = "Сидоров": s(3, 3) = "2"s(4, 1) = "3": s(4, 2) = "Иванов": s(4, 3) = "3"s(5, 1) = "4": s(5, 2) = "Ромашкин": s(5, 3) = "4"

With ListBox4.ColumnCount = 3.List = sEnd With

'Заполнение списка массивом, несколько колонокWith ListBox5

Page 46: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

90 91

.ColumnCount = 3

.AddItem "июнь"

.List(0, 1) = "06"

.List(0, 2) = "30"

.AddItem "июль"

.List(1, 1) = "07"

.List(1, 2) = "31"

.AddItem "август"

.List(2, 1) = "08"

.List(2, 2) = "31"

.AddItem "сентябрь"

.List(3, 1) = "09"

.List(3, 2) = "30"End WithEnd Sub

Private Sub CommandButton2_Click()ListBox1.ClearListBox2.ClearListBox4.ClearListBox5.ClearEnd Sub

Private Sub CommandButton3_Click()Sheets("лист0").SelectEnd Sub

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программ-

но поддерживающем объект CommandButton1, реализуются те же программы, что и в модуле, программно поддерживающем объ-ект CommandButton1 раздела 10.1;

в модуле Private Sub CommandButton1_Click(), программ-но поддерживающем объект CommandButton1, не реализуется способ заполнения объекта ListBox «из диапазона», т. е. объект ListBox3 отсутствует;

в модуле Private Sub CommandButton2_Click(), программ-но поддерживающем объект CommandButton2, который в свой-стве Caption переименован в «Очистить», к объекту ListBox1 при-

менен метод .Clear, с помощью которого осуществляется удаление элементов списка. Аналогично операции применяются к элемен-там списков объектов ListBox2, ListBox4 и ListBox5;

в модуле Private Sub CommandButton3_Click(), программ-но поддерживающем объект CommandButton3, который в свой-стве Caption переименован в «Меню», к объекту Sheets применен метод .Select, с помощью которого выполняется переход на лист оглавления всего пакета.

ЧАСТЬ ВТОРАЯ

10.4. Табулирование функций в объектах ListBox

При решении задач табулирования функций в объектах ListBox создаваемые объекты ListBox можно размещать как на специально созданных объектах UserForm, так и на листах Excel, используя при этом для вызова и табуляции кнопки (объекты CommandButton).

Создание пользовательской формы c объектом ListBox органи-зуется следующим образом:

войти в VBA – Alt-F11;выбрать Insert (вставка);выбрать UserForm.Затем на появившуюся «платформу» объекта UserForm с пане-

ли Toolbox (см. рис. 9.4) последовательно переместить:один объект ListBox;три объекта Label;три объекта TextBox;три объекта OptionButton;два объекта CommandButton,

расположив их, как показано на рис. 10.10.Далее войти в VBA (Alt-F11), выбрать объект UserForm.Затем, выбрав объект CommandButton1, написать соответству-

ющую программу, обеспечивающую табуляцию функций в объек-те ListBox1.

Page 47: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

92 93

Рис. 10.10

Программа табулирования функций в объекте ListBox

Private Sub CommandButton1_Click()Dim i As IntegerDim x As DoubleDim XN As DoubleDim XK As DoubleDim DX As DoubleDim S() As StringIf Not IsNumeric(TextBox1) Or Not IsNumeric(TextBox2) Or Not IsNumeric(TextBox3) ThenMsgBox "неверные данные"Exit SubEnd IfXN = CDbl(TextBox1)XK = CDbl(TextBox2)DX = CDbl(TextBox3)

If OptionButton1 = True ThenReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 3) As Stringi = 0S(i, 1) = "N": S(i, 2) = "x": S(i, 3) = "y"

i = i + 1x = XNDo While x <= XKy = (2 + (Sin(x)) ^ 2) / (1 + x ^ 2) ‘ функция 1 семестраS(i, 1) = i: S(i, 2) = Format(x, "0.0"): S(i, 3) = Format(y, "0.0")x = x + DX: i = i + 1LoopEnd If

If OptionButton2 = True ThenReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 4) As Stringi = 0S(i, 1) = "N": S(i, 2) = "x": S(i, 3) = "g1": S(i, 4) = "g2"i = i + 1x = XNDo While x <= XKy = g(x) ‘ функция 1 семестраS(i, 1) = i: S(i, 2) = Format(x, "0.0")If x <= 0 Then S(i, 3) = Format(y, "0.0000") Else S(i, 4) = Format(y, "0.0000")x = x + DX: i = i + 1LoopEnd If

If OptionButton3 = True ThenReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 5) As Stringi = 0S(i, 1) = "N": S(i, 2) = "x": S(i, 3) = "z1": S(i, 4) = "z2": S(i, 5) = "z3"i = i + 1x = XNDo While x <= XK y = z(x) ‘ функция 1 семестраS(i, 1) = i: S(i, 2) = Format(x, "0.0")If x < 0 Then S(i, 3) = Format(y, "0.0000")If (x >= 0) And (x <= 1) Then S(i, 4) = Format(y, "0.0000")If x > 1 Then S(i, 5) = Format(y, "0.0000")x = x + DX: i = i + 1LoopEnd If

With ListBox1.ColumnCount = 5.List = S

Page 48: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

94 95

End WithEnd Sub

Private Sub CommandButton2_Click()Unload MeEnd Sub

Function g(x)If x <= 0 Then g = (3 * x ^ 2) / (1 + x ^ 2) Else g = Sqr(1 + 2 * x / (1 + x ^ 2))End Function

Function z(x)If x < 0 Then z = 3 * x + Sqr(1 + x ^ 2)If (x >= 0) And (x <= 1) Then z = 2 * Cos(x) * Exp(-2 * x)If x > 1 Then z = 2 * Sin(3 * x)End Function

Некоторые комментарии к программе:в модуле Private Sub CommandButton1_Click(), программно

поддерживающем объект CommandButton1, используется функ-ция IsNumeric(TextBox1), проверяющая, являются ли данные, по-мещенные в объекте TextBox1 или TextBox2, цифровыми;

в программе также используется функция CDbl(TextBox), обе-спечивающая преобразование данных объектов TextBox1 и TextBox2 в цифровые;

в модуле используется динамическое объявление массива Dim S() As String с последующим уточнением мерности массива;

если включен объект OptionButton1, то табулируется функ-ция y=f(x), вычисленные значения которой и отображаются в объек-те ListBox1 (см. рис. 10.10); предварительно уточняется мерность массива S оператором ReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 3) As String, который можно размещать в любом месте про-граммы. Диапазон изменения индексов по первому измерению от 0 до величины вычисленного результата арифметического выраже-ния Round(Abs(XK - XN) / DX) + 1, т. е. + 1, для того чтобы увели-чить количество элементов массива с учетом «шапки таблицы», по второму измерению – от 1 до 3;

если включен объект OptionButton2, то табулируется функ-ция g=f(x), вычисленные значения которой и отображаются в объ-

екте ListBox1 (рис. 10.11); предварительно уточняется мерность массива S оператором ReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 3) As String, который можно размещать в любом месте про-граммы. Диапазон изменения индексов по первому измерению от 0 до величины вычисленного результата арифметического выраже-ния Round(Abs(XK - XN) / DX) + 1, т. е. + 1, для того чтобы увели-чить количество элементов массива с учетом «шапки таблицы», по второму измерению – от 1 до 4;

если включен объект OptionButton3, то табулируется функ-ция z=f(x), вычисленные значения которой и отображаются в объ-екте ListBox1 (рис. 10.12), предварительно уточняется мерность массива S оператором ReDim S(Round(Abs(XK - XN) / DX) + 1, 1 To 3) As String, который можно размещать в любом месте про-граммы. Диапазон изменения индексов по первому измерению от 0 до величины вычисленного результата арифметического выраже-ния Round(Abs(XK - XN) / DX) + 1, т. е. +1, для того чтобы увели-чить количество элементов массива с учетом «шапки таблицы», по второму измерению – от 1 до 5;

формулы функций g=f(x) и z=f(x) оформлены в виде модулей пользовательских функций Function g(x) и Function z(x);

Рис. 10.11

Page 49: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

96 97

Рис. 10.12

объекту ListBox1 сообщается свойство .ColumnCount, в со-ответствии с которым в объекте ListBox1 устанавливается значе-ние числа колонок = 5, максимальное из возможных вариантов количества столбцов при табулировании функций y=f(x), g=f(x) и z=f(x).

Рекомендуемая литература

1. Гарнаев А. Ю. Использование MS Excel и VBA в экономи-ке и финансах / А. Ю. Гарнаев. – СПб.: БХВ – Санкт-Петербург, 1999. – 336 с., ил.

2. Гарбер Г. З. Основы программирования на Visual Basic и VBA в Excel 2007 / Г. З. Гарбер. – М.: Солон-Пресс, 2008. – 192 с.

Page 50: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

98 99

Оглавление

Введение................................................................................................................31. Табулирование функции................................................................................32. Табулирование разветвляющейся функции..............................................73. Табулирование функции, разветвляющейся больше чем один раз.....124. Табулирование двух функций.....................................................................175. Построение поверхности..............................................................................216. Квадратичные формы..................................................................................25

Часть первая................................................................................................266.1. Решение матричного уравнения в Excel..............................................266.2. Решение матричного уравнения в Excel с предварительным преобразованием............................................................................................296.3. Вычисление квадратичной формы в Excel...........................................316.4. Вычисление квадратичной формы с использованием матричных функций Excel............................................................................336.5. Вычисление квадратичной формы с использованием матричных функций VBA............................................................................34Часть вторая................................................................................................356.6. Операции над массивами в Excel.........................................................356.7. Операции над массивами в VBA..........................................................37

7. Операторы цикла..........................................................................................398. Игра «угадай число».....................................................................................489. Пользовательские формы............................................................................50

9.1. Калькулятор с OptionButton..................................................................529.2. Калькулятор с CheckBox.......................................................................559.3. Логарифмический калькулятор............................................................579.4. Решение квадратных уравнений...........................................................609.5. Вычисление максимума, минимума, среднего арифметического,среднего геометрического и среднего гармонического.............................629.6. Использование объекта ScrollBar (полоса прокрутки).......................66

10. Работа с объектом ListBox.........................................................................70Часть первая.................................................................................................7210.1. Заполнение объектов ListBox, расположенных на одном объекте UserForm..........................................................................................7210.2. Заполнение объектов ListBox, расположенных на разных объектах UserForm........................................................................................77

10.2.1. Заполнение списка поэлементно, если список состоит из одной колонки.....................................................................................7710.2.2. Заполнение списка массивом, если список состоит из одной колонки.....................................................................................79

10.2.3. Заполнение списка из диапазона, в который предварительно введены элементы списка...........................................8110.2.4. Заполнение списка поэлементно, если список состоит из нескольких колонок............................................................................8310.2.5. Заполнение списка массивом, если список состоит из нескольких колонок............................................................................85

10.3 Заполнение объектов ListBox, расположенных на листе ExcelЧасть вторая.................................................................................................9110.4. Табулирование функций в объектах ListBox......................................91

Рекомендуемая литература..............................................................................97

Page 51: C. Н НИКИФОРОВ - СПбГАСУ · 2019-05-02 · 2 3 УДК 681.3 Рецензент д-р физ.-мат. наук, профессор Б. Г. Вагер Никифоров,

100

Учебное издание

Никифоров Сергей Николаевич

ИНФОРМАТИКА ДЛЯ I КУРСА Часть I

Учебное пособие

Редактор О. Д. КамневаКорректор М. А. Молчанова

Компьютерная верстка А. А. Стешко

Подписано к печати 28.12.11. Формат 60×84 1/16. Бум. офсетная.Усл. печ. л. 5,8. Тираж 100 экз. Заказ 168. «С» 89.

Санкт-Петербургский государственный архитектурно-строительный университет.190005, Санкт-Петербург, 2-я Красноармейская ул., д. 4.

Отпечатано на ризографе. 190005, Санкт-Петербург, 2-я Красноармейская ул., д. 5.