Практикум по Visual Basic for Applications. 3 Глава Алгоритмы и программы Понятие алгоритма
Скачать 1.74 Mb.
|
End If MsgBox v ‘печатаем результат - полученное v w = w*0.5 ‘меняем значение w Next ‘повторяем тело цикла for i для нового w If y < 3 Then ‘меняем значение y y = y + 0.5 Else y = y + 1 End If Wend ‘повторяем цикл While y для нового значения y Next ‘повторяем цикл For j для следующего z(j) Next ‘повторяем цикл For для следующего x End Sub Задачи для самостоятельной работы: 1. Для функции v определить количество ее значений: v x 3 2 y 2 (2 x 1 y) z 2 при x 4 ; x [2;4], x 1; x xw 2 при x 4 2w 0,5 при y 3 y [2;6], y ; z = 1,2; 1,5; 2,3; 3; 0,75 при y 3 61 w i 1 0,3w i , w 1 2,4; 1 i 4 2. Определить сумму значений функции v, больших числа 5: v ( 3 y w 5 y y )z при y 5 ; z = 1,1; 1,3; 1,5; 2,1; при y 5 z w i 1 1,7w i , w 1 0,2; 1 i 4 ; 29, при j 3 y ; 1 j 5. 7, при j 3 Лабораторная работа № 7. Задачи с данными – двумерными массивами Матрицы – двумерные массивы вводятся и выводятся с помощью вло- женных циклов: один перебирает строки, другой – столбцы матрицы. Какой из циклов внешний – неважно, главное – вложенные циклы позволяют перечис- лить все сочетания номеров строк и столбцов, т.е. учесть все элементы матри- цы. Рассмотрим, например, матрицу М размера 5 7. Задача 17. Ввод и вывод двумерного массива (матрицы). Ввод матрицы с клавиатуры: For i = 1 To 5 ‘перебираем строки For j = 1 To 7 ‘перебираем столбцы М(i,j) = InputBox("Введите элемент матрицы") Next Next Ввод матрицы с листа Excel (матрица расположена на листе в диапазо- не, например, A1:G5): For i = 1 To 5 ‘перебираем строки For j = 1 To 7 ‘перебираем столбцы от A до G М(i,j) = Cells(i,j) Next Next Работает вложенный цикл следующим образом. Счетчик строк i получа- ет очередное значение (здесь вначале это 1), затем полностью выполняется цикл со счетчиком j, т.е. перебираются все элементы i-той строки. После этого значение счетчика строк увеличивается на единицу (i = i +1) и вновь пол- ностью выполняется цикл по j, перебирающий столбцы матрицы. Процедура завершается после перебора последней строки. Если i и j поменять местами в заголовках циклов, т.е.: 62 For j = 1 To 7 For i = 1 To 5 A(i, j) = Cells(i, j) Next Next то вначале будут перебираться все элементы первого столбца, потом второго и т. д. Вывод матрицы на лист Excel, например, в диапазон A8:G12: For i = 8 To 12 ‘меняем строки, начиная с восьмой For j = 1 To 7 ‘меняем столбцы от A до G М(i,j) = Cells(i,j) Next Next Задача 18. Занести отрицательные элементы массива A(N M) в мас- сив B и напечатать его. Решение. Алгоритм задачи состоит из трех частей: ввести матрицу A; проверить каждый ее элемент: если он отрицательный, поместить его в массив B; вывести полученный массив B на печать. Первая и третья части – ввод и вы- вод данных решаются стандартным способом ввода и вывода массивов. Вторая часть – основа решения, рассмотрим ее подробнее. Анализ элементов A(i,j) матрицы A можно провести, как обычно для матриц, с помощью вложенных циклов For, перечисляющих все строки (i) и столбцы (j) матрицы. Если A(i,j) – отрицательный, нужно присвоить очередному элементу массива B это значение. Здесь проблема (и источник ошибок) в том, как определить очередной элемент массива B. Поскольку заранее количество отрицательных элементов в A неиз- вестно, то заранее неизвестна и точная длина массива B. Очевидно только, что она не превысит N M – количества элементов исходной матрицы A. Ясно так- же, что счетчик элементов массива B никак не зависит от очередных i и j. От- сюда следует главный вывод для решения задач такого типа: для массива приемника необходимо завести свой, независимый счетчик элементов. Отведем для него отдельную переменную. Пусть это будет k. При записи отрицательно- го A(i,j) в B(k) счетчик k будет увеличиваться на единицу, и по окончании всей работы значение k покажет истинную длину массива B. Для примера в про- грамме взята исходная матрица A размером N=4, M=6. Вся программа имеет вид: Sub Перенос() Dim A(4, 6) As Integer, B(24) As Integer, k As Integer For i = 1 To 4 For j = 1 To 6 A(i,j)=InputBox(" Введите значение элемента матрицы ") Cells(i,j)= A(i,j) ‘ вывод вводимой матрицы на лист Excel для наглядности Next Next 63 k = 0 ‘обнуление счетчика элементов массива В перед началом его заполнения For i = 1 To 4 For j = 1 To 6 If A(i, j) < 0 Then k = k + 1 B(k) = A(i, j) End If Next Next For i = 1 To k Cells(7, i) = B(i) ‘вывод массива В на лист Excel в строку 7 Next End Sub Эту программу можно написать короче, совместив анализ с вводом и вы- водом и сократив, соответственно, количество внешних циклов с трех до одно- го: Sub Перенос() Dim A(4, 6) As Integer, B(24) As Integer, k As Integer k = 0 For i = 1 To 4 For j = 1 To 6 A(i,j)=InputBox(" Введите значение элемента матрицы ") Cells(i, j) = A(i, j) If A(i, j) < 0 Then k = k + 1 B(k) = A(i, j) Cells(7, k) = B(k) End If Next Next End Sub Задача 19. Посчитать число четных чисел в матрице А(5 5). Решение. Алгоритм включает ввод матрицы, перебор ее значений с про- веркой на четность, подсчет суммы четных значений и вывод результата. Для программирования задачи возьмем переменную (например, k) в каче- стве счетчика четных чисел. Проверку на четность реализуем с помощью функ- ции Mod. Вся программа: Sub matrixNumber() Dim i, j, k, A(5, 5) As Integer For i = 1 To 5 ‘вводим матрицу из листа Excel: For j = 1 To 5 64 A(i, j) = Cells(i, j) Next j Next k = 0 ‘обнуляем счетчик четных чисел For i = 1 To 5 ‘начинаем перебор элементов матрицы: For j = 1 To 5 If A(i,j) Mod 2 = 0 Then ‘проверяем на четность k = k + 1 ‘считаем четные значения End If Next Next MsgBox (k) ‘печатаем результат End Sub Задача 20. Посчитать сумму элементов, стоящих на четных позици- ях строк и столбцов матрицы А(7 7). Решение. Здесь уже не важна четность элементов, важна четность пози- ций: элемент А(2,4), например, нам подходит, а элемент А(3,4) уже нет. Чтобы попасть на четную позицию, излишне использовать функцию Mod для счетчи- ков строк i и столбцов j. Достаточно изменять шаг каждого цикла с приращени- ем 2. Программа: Sub matrixIndex() Dim i, j, s, A(7, 7) As Integer For i = 1 To 7 For j = 1 To 7 A(i, j) = Cells(i, j) Next Next s = 0 For i = 2 To 7 Step 2 For j = 2 To 7 Step 2 s = s + A(i, j) Next Next MsgBox (s) End Sub ‘ обнуляем хранилище суммы ‘ перебираем только четные строки, начиная с 2 ‘ перебираем только четные столбцы, начиная с 2 ‘ элементы A(i, j) лежат на пересечении четных строк и столбцов 65 Задача 21. Обнулить элементы главной диагонали матрицы А(5 5). Решение. В задачах, связанных с диагоналями матриц, следует обращать внимание на зависимость значений индекса j (счетчика столбцов) от i (счетчика строк). Если обнаружена закономерность, то можно избавиться от множества лишних операторов и сделать программу более внятной и компактной. Напри- мер, все элементы главной диагонали имеют номера столбцов, совпадающие с номерами строк, т.е. «типичный» представитель этой диагонали – элемент А(i,i). На побочной диагонали – это элемент А(n-i+1), если число столбцов мат- рицы равно n и счет строк начинается с 1. Поэтому для работы с этими диаго- налями достаточно простого цикла, без вложенных. Программа задачи: Sub topDiagonal() Dim i, j, A(5, 5) As Integer For i = 1 To 5 ‘вводим матрицу из листа Excel: For j = 1 To 5 A(i, j) = Cells(i, j) Next Next For i = 1 To 5 ‘обнуляем диагональ A(i, i) = 0 Next For i = 1 To 5 ‘выводим матрицу на лист Excel: For j = 1 To 5 Cells(i, j) = A(i, j) Next Next End Sub Таким образом, весь алгоритм обнуления диагонали – один простой цикл For и одно присваивание. Задача 22. Дана матрица размером 5 5. Посчитать среднее значение элементов матрицы, расположенных строго ниже главной диагонали. Решение. Для каждой строки этого куска матрицы номера столбцов нужных элементов изменяются от первого до пересекающегося с диагональю. На диа- гонали номер столбца совпадает с номером строки, т.е. j = i . Поскольку диаго- наль по условию не включена, то j изменяется не до i, а до i – 1. Sub Матрица() Dim M(5, 5) As Integer, S As Integer, k As Integer, Avg As Single For i = 1 To 5 For j = 1 To 5 M(i,j) = InputBox("Введите элемент матрицы М(" & i & "," & j & ")") Next Next 66 S = 0 k = 0 For i = 2 To 5 ‘номера строк берутся от 2 до конца матрицы For j = 1 To i – 1 ‘номера столбцов берутся от 1 до диагонали S = S + M(i, j) k = k + 1 Next Next Avg = S / k MsgBox "Среднее значение = " & Avg End Sub Задача 23. Обнулить элементы матрицы А(5 5), лежащие правее ее главной диагонали и левее побочной, включая диагональные элементы. Решение. Диагонали делят матрицу на 4 части, в задаче требуется обну- лить верхнюю четверть. Обратите внимание, что для каждой строки этого куска обнуляются элементы, лежащие между диагоналями, т.е. из столбцов с номера- ми: для 1-ой строки – от 1 до 5, для 2-ой строки – от 2 до 4, для 3-ей - от 3 до 3, т.е., в общем случае, для i –той строки – от i до 5-i+1. Программа: Sub matrixKvota() Dim i, j, A(5, 5) As Integer For i = 1 To 5 For j = 1 To 5 A(i, j) = Cells(i, j) ‘ввод матрицы Next Next For i = 1 To 3 ‘номера строк берутся от 1 до середины матрицы For j = i To 5 - i + 1 ‘номера столбцов берутся от главной до побочной диагонали A(i, j) = 0 Next Next For i = 1 To 5 For j = 1 To 5 Cells(i, j) = A(i, j) ‘вывод матрицы Next Next End Sub Задачи для самостоятельной работы: 1. Посчитать количество нулевых элементов в матрице А(5 5). 2. Перенести элементы, кратные трем, из массива А(5 5) в массив В. 3. Обнулить элементы матрицы М(5 5), лежащие ниже ее побочной диа- гонали, включая диагональные. 67 4. Поменять местами симметрично элементы верхней четверти и нижней четверти матрицы А(5 5), разделенной диагоналями на четыре части. Лабораторная работа № 8. Задачи с данными строкового типа Задача 24. Подсчитать количество символов, не являющихся цифра- ми, в произвольной строке. Решение поставленной задачи сводится к проверке каждого символа строки. Известна функция Asc(Строка), которая возвращает ASCII-код началь- ной буквы строки. Если код лежит в интервале [49,57], то это цифра. Sub количество_цифр() Dim s As String Dim i As Byte, nd As Byte s = InputBox(''введите произвольную строку'') nd = 0 For i = 1 To Len(s) If Asc(Mid(s, i, 1)) > 57 Оr Asc(Mid(s, i, 1)) < 49 Then nd = nd + 1 End If Next MsgBox (nd) End Sub Задача 25. Создать программный код зашифровывающий, а затем расшифровывающий предложение, записанное на русском языке. Использо- вать шифр простой замены, в котором каждая буква русского алфавита заменяется другой буквой этого же алфавита. При этом замена осуществ- ляется по правилу: первая буква заменяется последней, вторая – предпо- следней и т.д. Так, А заменяется на Я, Б – на Ю, В - на Э и т. д. Решение поставленной задачи сводится к замене букв исходного текста (алфавит по порядку) буквами алфавита записанного в обратном порядке. Ис- ходные данные: Буквы русского алфавита, записанные в алфавитном порядке за исключением буквы Ë, буквы русского алфавита, выписанные в обратном по- рядке. Шифруемое сообщение: «Простая замена один из самых древних шиф- ров». Выходные данные: сообщение после шифровки. Для решения поставленной задачи определяем количество символов преоб- разуемой строки. Образуем новую строку по длине равную исходной строке. Далее организуем цикл, в котором просматриваем все символы преобразуемой строки, определяем позицию номер k этого символа в исходном алфавите. Если в исходном алфавите символ не найден, то в данную позицию новой строки за- носим этот символ без изменений, в противном случае в данную позицию но- 68 вой строки заносим символ из нового алфавита, позиция которого совпадает с позицией номер k исходного алфавита. При решении задачи используем следующие функции: 1. len(Строка)– возвращает число символов строки, например, Len(“мама”)=4. 2. LCase(Строка) – все прописные символы строки преобразует в строчные, например, b=Lcase(“Мир”). b = “мир”. 3. Space(количество_символов) – возвращает строку пробелов длины количество_символов. 4. Mid(string, start[, length]) – возвращает подстроку строки, со- держащую указанное число символов исходной строки, например, Mid(“программирование”,4,4)=” грам”. 5. InStr([start, ] string1, string2[, compare]) – возвращает позицию первого вхождения одной строки внутри другой строки, например, k = InStr(1, “XXpXXpXXPXXP”, "W") возвращает 0, т.к. символа "W" нет в строке “XXpXXpXXPXXP”. Private Sub Шифрование() Const АБВ As String = ''абвгдежзийклмнопрстуфхцчшщъыьэюя'' Const НовАБВ As String = "яюэьыъщшчцхфутсрпонмлкйизжед- гвба" Dim STR As String, STRS As String Dim n As Long STR = "Простая замена один из самых древних шифров " STR = LCase(STR) ' преобразуем все символы в строчные n = Len(STR) 'находим длину строки STRS = Space(n) 'организуем строку пробелов длины n For i = 1 To n tmp = Mid(STR, i, 1) 'по одному символу «отрываем» от строки STR k = InStr(1, АБВ, tmp) 'находим позицию вхождения символа If k = 0 Then Mid(STRS, i, 1) = tmp Else Mid(STRS, i, 1) = Mid(НовАБВ, k, 1) End If Next i Msgbox STRS End Sub Задача 26. Гласные буквы русского алфавита не изменяются. Первый десяток согласных заменяется на второй десяток согласных (второй - на первый) по следующей таблице: 69 Б В Г Д Ж З К Л М Н Щ Ш Ч Ц Х Ф Т С Р П Решение. Исходными данными задачи является строка произвольной длины. Кроме этого, можно определить две строки-алфавита, состоящие из со- гласных букв “бвгджзклмнщшчцхфтсрп” и “щшчцхфтсрпбвгджзклмн”. Если в тексте встречается буква из первой строки, то она заменяется на букву с таким же номером из второй строки-алфавита. Private Sub Гласные() Dim tmp As String, Alf1 As String, Alf2 As String Dim a As String, b As String a = InputBox(''Введите исходную строку символов'') Alf1 = ''бвгджзклмнщшчцхфтсрп'' Alf2 = ''щшчцхфтсрпбвгджзклмн'' n = Len(a) b = Space(n) For i = 1 To n tmp = Mid(a, i, 1) k = InStr(1, Alf1, tmp) If k = 0 Then Mid(b, i, 1) = tmp Else Mid(b, i, 1) = Mid(Alf2, k, 1) End If Next i MsgBox b End Sub Задачи для самостоятельной работы: 1. Для любого введенного предложения заменить слоги «ма» на слоги «ле». 2. Посчитать количество слов «кот» в предложении, вводимом с клавиа- туры. Разделителем слов считать пробелы и запятые. 3. Поменять местами первое и последнее слово в предложении, раздели- телем слов считать пробел. 4. Образовать по заданному слову слово-перевертыш, в котором все бук- вы идут в обратном порядке. Лабораторная работа № 9. Автоматическая запись макроса и его редактирование В настоящее время почти каждое приложение, предназначенное для ве- дения деловой документации, имеет макроязык и средство записи макросов. 70 Макрос – это программа, автоматически записанная редактором VBA по дейст- виям пользователя, которые он выполняет на листе Excel. В результате эти дей- ствия можно потом в любое время воспроизвести, просто вызвав этот макрос как обычную программу. Код этой программы можно также просмотреть и отредактировать или написать самостоятельно от начала до конца. Однако самый простой способ разработать макрос – это записать его, а затем изменить, если требуется, соз- данный код. Этот метод позволяет быстро освоить язык VBA, тщательно изучая код программы, созданныйавтоматически. Для записи макроса и редактирования его в редакторе VBA: 1. Откройте лист рабочей книги Excel. 2. Запустите средство автоматической записи макросов с помощью ко- манды Сервис/Макрос/Начать запись. При этом на экране появится диалого- вое окно Запись макроса (рис. 3). Рис. 3. Диалоговое окно «Запись макроса». 3. Задайте имя макроса (по умолчанию Макрос1, Макрос2 и т. д.) и нажмите кнопку OK. При этом появится панель записи макроса Останов с кнопкой Остановить запись. Выполните нужную Вам последовательность действий и остановите запись, нажав кнопку Остановить запись. 4. Далее можно использовать этот записанный макрос или изменить его. В первом случае, например, можно открыть другой лист, выбрать запи- санный макрос в списке макросов, используя команды Сервиc/Макроc/Макросы, а затем нажмите кнопку Выполнить. Во втором случае можно использовать команды Сервиc/Макроc/Макросы, и кнопку Изменить. При этом запускается редактор VВA и в окне модуля выводится текст созданного макроса, который можно изменить или добавить коммен- тарии. Задача 27. Создать макрос, очищающий содержимое ячеек А1, В1, С1 рабочего листа и изменить его, введя комментарии и новые инструкции. Решение. 1. Выполните команду Сервис/Макрос/Начать запись. 2. Присвойте макросу имя ClearCell и нажмите кнопку OK. 71 3. Выделите диапазон ячеек А1:С1 с помощью мыши и нажмем кнопку Delete на клавиатуре. 4. Остановите запись, нажав кнопку Остановить запись. 5. Просмотрите результат: выполните команду Сервис/Мак рос/Макросы. Выберите в списке макросов макрос с именем ClearCell и на- жмите кнопку Изменить. В результате на экране откроется окно редактора VBA с текстом только что созданного макроса: Sub ClearCell() ClearCellData Макрос Макрос записан 23.05.00 () Range("A1:C1").Select Selection.ClearContents End Sub 6. Добавьте комментарии к строкам программы (комментарий должен на- чинаться с апострофа). Например: Range("A1:C1").Select Выделение диапазона ячеек Selection.ClearContents Очистка содержимого выделенного диа- пазона 7. Добавьте новую строку в программу, например, Rаngе("АЗ:СЗ").Select Выделение нового диапазона ячеек 8. Проследите, какие действия выполнит макрос после редактирования. Для этого: перейдите на лист Excel, заполните ячейки А1:С3 любыми значе- ниями, выполните команды меню Сервис/Макрос/Макросы, выберите макрос ClearCell и нажмите кнопку Выполнить. Для упрощения работы с макросом можно запускать его кнопкой, без ис- пользования команд меню. Кнопку можно поместить на лист Excel следующим способом: 1. Войти в меню Вид/Панели Инструментов/Формы листа Excel. 2. На появившейся панели выбрать элемент управления Кнопка, щелкнув по нему мышью. Указатель мыши превратится в крестик. 3. Щелкните мышью на листе Excel, откроется диалоговое окно Назна- чить макрос объекту. 4. Выберите в списке программ нужный макрос. Аналогичным образом можно создать кнопку для вызова любой разрабо- танной Вами программы. Для этого выполняются те же действия, только на ша- ге 4 выбирается имя этой программы. 72 Задачи для самостоятельной работы: 1. Создайте макрос, меняющий формат ячеек диапазона A1:C4: цвет шрифта, заливку, центрирование, тип и размер шрифта. 2. Создайте макрос, заполняющий диапазон A1:A12 месяцами года. Пре- дусмотрите его вызов с помощью кнопки. 3. Измените программу макроса, созданного в первой задаче, изменив диапазон на D5:J12 и цвет заливки ячеек. 4. Создайте макрос, позволяющий строить диаграмму по таблице, пред- ставленной в диапазоне A1:B11 с заголовками столбцов – Товар и Цена. Лабораторная работа № 10. Размещение элементов управления на рабочем листе Excel С помощью панели инструментов Элементы управления (рис. 4), вы- званной командами меню Вид/Панели Инструментов/Элементы управления, можно разместить на листе Excel разные элементы управления, такие как Com mandButton1, CommandButton2, CommandButton3, OptionButton1, OptionButton2, OptionButton3, TextBox1, Label1. Рис. 4. Панель инструментов Элементы управления в Excel Задача 28. Создать: кнопку «Вывод сгенерированного массива на лист» (при нажатии на эту кнопку генерируется массив вещественных чисел в диапазоне (-5, 5) и выводится в диапазон A1:A20 листа Excel), кнопку «Отменить вывод значений» (при нажатии на данную кноп- ку из диапазона A1:A20 удаляются значения элементов массива), кнопку «Ok» (при нажатии на нее решается задача поиска мини- мального или максимального элемента массива, либо находится среднее арифметическое значение, в зависимости от того, какой элемент Option- Button выбран) (см. рис. 5). Решение. В начале работы необходимо подготовить рабочий лист, создав на рабочем листе «Лист1» элементы управления, используя команды меню Вид/Панели Инструментов/Элементы управления. Чтобы изменить название элемента управления, например, CommandButton1, можно воспользоваться кнопкой Свойства (вторая слева) на панели Элементы управления. В 73 Рис. 5. Вид листа Excel c созданными на нем элементами управления. открывшемся окне свойств нужно выбрать строку Caption и изменить текст в правом столбце. При двойном щелчке на созданном элементе управления открывается ре- дактор VBA, подготовленный для создания программы на листе «Лист1». Для решения поставленной задачи необходимо набрать следующий код: Private Sub CommandButton1_Click() Кнопка генерации данных For i = 1 To 20 Cells(i, 1) = -5 + 10 * Rnd() Next End Sub Private Sub CommandButton2_Click() Кнопка очистки диапазона Range("A1:A20").Select Selection.ClearContents End Sub Private Sub CommandButton3_Click() Кнопка основной программы Dim a(1 To 20) As Single, Max As Single Dim Min As Single, S As Single For i = 1 To 20 a(i) = Cells(i, 1) Next If OptionButton1.Value = True Then Max = a(1) For i = 2 To 20 If Max < a(i) Then Max = a(i) Next TextBox1.Text = Max End If If OptionButton2.Value = True Then Min = a(1) 74 For i = 2 To 20 If Min > a(i) Then Min = a(i) Next TextBox1.Text = Min End If If OptionButton3.Value = True Then s = 0 For i = 1 To 20 s = s + a(i) Next TextBox1.Text = s / 20 End If End Sub Лабораторная работа № 11. Применение пользовательских форм Пользовательская форма (UserForm) изначально представляет собой за- готовку для создания собственного диалогового окна. На ней, так же, как и на рабочем листе можно размещать разнообразные элементы управления, назна- чать им процедуры и устанавливать значение свойств. С помощью одной или нескольких форм создается удобный интерфейс разрабатываемого приложения его пользователем. По умолчанию формы име- ют имена UserForm1, UserForm2, UserForm3 и т. д. Для изменения имени формы необходимо изменить значение свойства Caption формы. Для создания формы необходимо выполнить команду Сервис/Макрос/Ре дактор Visial Basic, затем команду Insert/UserForm. При этом будет создана пустая форма с именем UserForm1 (рис. 6). Рис 6. Форма UserForm1 и панель элементов. 75 Можно выделить форму, щелкнув по ней правой кнопкой мыши. При этом откроется контекстное меню, в котором пункт Свойства (Properties) позволяет открыть свойства формы. Например, чтобы изменить заголовок формы нужно заменить значение по умолчанию на новое имя. Также на форме можно разместить любые из элементов управления, опи- санных в предыдущем параграфе. Для удобства работы при размещении эле- ментов управления на форме имеется разметка в виде точек. Кроме того, ис- пользуя контекстное меню, можно выравнивать размеры и положение элемен- тов управления на форме. Для удаления формы с экрана можно использовать метод Hide. Для этого необходимо какой-либо кнопке на форме, например кнопке Отмена, назначить следующую процедуру: Sub CommandButton1_Click () UserForm1.Hide End Sub Для вывода формы на экран из Excel необходимо предварительно в модуле создать процедуру Sub Открытие_формы() UserForm1.Show End Sub После этого можно выполнить команду Сервис/Макрос/Макросы, вы- брать из списка макросов макрос «Открытие_формы», и нажать кнопку Вы- полнить (например, макрос Задача). При этом на экран будет выведена форма с соответствующими элементами управления. Форма может быть активизирована не только из Excel, но и из среды VBA: • установите курсор в области процедуры, выводящей форму на экран, или сделайте активным окно с необходимой формой; • выполните команду Run/ Run Sub /UserForm. При этом откроется лист Excel, с расположенной на нем формой. Каждому элементу управления в пользовательской форме можно назна- чить всплывающую подсказку, установив значение свойства ControlTip- Text в окне свойств для каждого элемента управления. Подсказка появляется при наведении указателя мыши на соответствующий элемент управления. В результате установки значений свойства ControlTipText всех эле- ментов управления пользовательской формы можно будет получить всплы- вающую подсказку об интересующем элементе формы (поле, надписи и т. д.), указав на этот элемент управления мышью. 76 Задача 29. Создать приложение, которое позволит при исходных дан- A B B ных А, B, C вычислить значение z sin . В случае, если произ- C 2 A A вести вычисление невозможно, то должно появиться соответствующее сообщение. Решение. 1. Подготовьте соответствующим образом UserForm2 (рис. 7): Рис. 7. Вид формы UserForm2. С помощью свойств элементов управления переименуйте их следующим образом (рис. 8): Рис. 8. Вид формы UserForm2 после переименования элементов управления. 2. Щелкнув дважды по кнопке Ok, войдите в область программного кода, где наберите следующий код: Private Sub CommandButton1_Click() A = CInt(TextBox1.Value) ‘присваиваем переменным a,b,c зна- чения, введенные пользователем в текстовые поля B = CInt(TextBox2.Value) C = CInt(TextBox3.Value) If C ^ 2 - A < 0 Or A = 0 Then TextBox4.Text = "Решений нет" Exit Sub 77 End If z = (A + B) / (C ^ 2 - A) ^ (1 / 2) + Sin(B / A) TextBox4.Value = Format(z, "###.00") ‘форматирует действительное число End Sub Private Sub CommandButton2_Click() UserForm2.Hide End Sub Обратите внимание, что, несмотря на то, что надписи на кнопках нами по- менялись, внутренние имена этих кнопок, используемые в программе (Com mandButton1, CommandButton2) остались прежними. 3. Запустите форму на выполнение Run/ Run Sub /UserForm. Введите в поля A, B,C необходимые данные и проведите тестирование программы. Задача 30. Создать приложение, которое позволит считать данные с рабочего листа, обработать их и выдать результат в соответствующие поля пользовательской формы. Содержание приложения: на активном рабочем листе представлены данные о студентах и их среднем балле успеваемости (рис. 9). Для удобства средний балл успеваемости генерируется произвольным образом в интервале от 2 до 5 при запуске формы на экран (т.е. при инициализации формы). Данные считываются с листа и обрабатываются процедурой, вызываемой нажатием кнопки Запуск. В результате выбирается студент с максимальным баллом, с минимальным баллом и вычисляется средний балл среди всех студентов. Решение. 1. Подготовьте пользовательскую форму UserForm3 следующим обра- зом (рис. 10): Рис. 9. Вид активного рабочего листа Рис.10. Вид формы UserForm3. 2. Так как данные генерируются при запуске формы, то необходимо соз- дать процедуру UserForm_Initialize. Код процедуры инициализации можно записать в той же области программного кода, где и остальной код про- 78 граммы (можно щелкнуть мышью по форме дважды). Private Sub UserForm_Initialize() For i = 1 To 6 Cells(i+1,2) = Format(2+(5-2)*Rnd(), "###.##") Next End Sub Таким образом, при запуске формы на экран во второй столбец активного рабочего листа будут выводится сгенерированные данные из интервала (2; 5). 3. Запрограммируем кнопку CommandButton1 (Запуск). Private Sub CommandButton1_Click() Max = Cells(2, 2): k = 2 For i = 2 To 6 ‘ перебираем строки второго столбца (B) If Max < Cells(i, 2) Then Max = Cells(i, 2) ‘ ищем максимум и запоминаем его номер строки k = i End If Next TextBox1.Text = Cells(k, 1) ‘ выводим результат на форму Min = Cells(2, 2): k = 2 For i = 2 To 6 ‘ аналогично ищем минимум If Min > Cells(i, 2) Then Min = Cells(i, 2) k = i End If Next TextBox2.Text = Cells(k, 1) ‘ выводим результат на форму s = 0 For i = 1 To 6 s = s + Cells(i + 1, 2) ‘ суммируем баллы Next sred = s / 6 ‘ находим среднее TextBox3.Text = Format(sred, "##.##") ‘ выводим его на фор- му в формате действительного числа End Sub 4. Запустите форму на выполнение с помощью Run/ Run Sub /UserForm. Проверьте как генерируются данные на активном рабочем листе: нажав на кнопку Запуск вы должны получить данные о студенте с наивысшим балом, с наименьшим баллом и средний балл успеваемости среди всех студентов. 79 Задача 31. Создать программное приложение, которое позволит об- работать данные о товаре, количестве поставок и поставщиках. Данные представлены на рабочем листе. Количество поставок генерируется при инициализации формы. На пользовательской форме при вводе в поле назва- ния поставщика должны появиться следующие данные: общее количество его поставок, рассчитанный на этой основе статус поставщика или про- цент от общего количества. Решение. 1. Подготовьте рабочий лист в следующем виде (рис. 11): Рис. 11. Вид активного рабочего листа с данными. 2. Подготовьте пользовательскую форму, разместив на ней текстовое поле для ввода поставщика, текстовое поле для вывода общего количества поставок и переключатель, который позволяет либо вывести на экран статус поставщика, либо процентное отношение его поставок к общему количеству его поставок всех поставщиков (рис. 11). При этом считаем, что статус поставщика равен 3, если поставщик поставляет более 50% от общего количества, статус равен 2, если количество поставок от 30% до 50%; равен 1 – если количество поставок более 10% и меньше или равно 30% и, наконец, равен 0 в остальных случаях. Рис. 11. Вид формы «Поставщики». 80 3. Первоначально необходимо сгенерировать данные с помощью процеду- ры инициализации формы: Private Sub UserForm_Initialize() For i = 1 To 20 Cells(i + 1, 2) = Format(100+900*Rnd(), "###.##") Next End Sub 4. Кнопка «Ok» позволяет считать данные из поля «Поставщик», найти данного поставщика на рабочем листе в столбце «Поставщик» и выбрать дан- ные о поставках для этого поставщика. Если поставщика нет в списке, то долж- но быть выдано соответствующее сообщение. Кроме того, должен быть произ- вится расчет общего количества поставок всех поставщиков и определение ста- туса или процента от общего количества в зависимости от выбранного пере- ключателя OptionButton. В программе использованы переменные KolPost, statys, prozent, которые можно не описывать. Private Sub CommandButton1_Click() Поставщик = TextBox1.Text s = 0: k = 0: KolPost = 0 For i = 1 To 20 If Cells(i + 1, 3) = Поставщик Then s = s + Cells(i + 1, 2) k = k + 1 End If KolPost = KolPost + Cells(i + 1, 2) Next If k=0 Then MsgBox "Нет такого поставщика" Exit Sub End If TextBox2.Text = s statys = 0 If OptionButton1.Value = True Then If s >= 0.5 * KolPost Then statys = 3 If s<0.5*KolPost And s>=0.3*KolPost Then statys=2 End If If s<0.3*KolPost And s>=0.1*KolPost Then statys=1 End If TextBox3.Text = statys End If 81 If OptionButton2.Value = True Then prozent = s / KolPost TextBox3.Text = Format(prozent, "0.#0") End If End Sub 5. Кнопка «Очистить» позволяет удалить данные из диапазона B1:B21 и очищает данные в текстовых полях TextBox1, TextBox2, TextBox3. Private Sub CommandButton2_Click() TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" Range("B2:B21").Select Selection.ClearContents End Sub Задачи для самостоятельной работы: 1. В форму Студенты (см. задачу 31) добавить поля для вывода результа- та расчета поощрения и поле ввода с надпись Студент. Если его средний балл на 20% больше чем средний балл по группе, то поощрение – тетрадь, на 30% больше – пенал, на 40% – путевка в летний лагерь. 2. Создать программное приложение, которое позволит обработать дан- ные о странах и ценах на туристические путевки в эти страны. Данные пред- ставлены на рабочем листе. Цена на путевки генерируется при инициализации формы. На пользовательской форме, при вводе в поле названия страны должны появиться следующие данные: средняя цена на путевки в эту страну, макси- мальная и минимальная цена на путевки в эту страну. |