Для добавления выражений в окно контрольных значений следует выделить в окне редактирования кода переменную или выражение и затем по команде Отладка/Добавить контрольное значение вызвать диалоговое окно Добавление контрольного значения.
Контролируемые выражения можно использовать также для назначения точек останова. В диалоговом окне Добавление контрольного значения имеется возможность назначить точки останова двух типов:
Точки останова, автоматически переводящие программу в режим паузы, как только выполнится оператор, изменяющий на ненулевое значение заданного выражения (в VBA 0 означает False, а любое ненулевое значение — это True). Для назначения этого типа точки останова выберите переключатель Останов, если выражение истинно. Точки останова, автоматически переводящие программу в режим паузы при изменении значения заданного выражения. Чтобы назначить точку останова этого типа нужно выбрать переключатель Останов при изменении значения.
Таким образом, современные среды визуального программирования предельно облегчают отладку программ.
8. Лабораторные работы
VBA1. Создание простейшего интерфейса. Калькулятор
Описание калькулятора.
Операнды (числа) вводятся в поля - в регистры R1, R2. Результат вычислений заносится в регистр R2. Операции имеют вид: R2 = R2 операция R1, R2=1/R2, R2=R2^2, R2=R2^3, R2=R2^(1/2). Кроме того, предусматриваются операции присваивания: R1 = 0, R2 = R1, R2 = R3, R3 = 0, R3 = R2, R3 = R3 + R2.
Создание интерфейса пользователя.
Меню Вид/Панели инструментов/Visual Basic. Кнопкой в виде молоточков вывести на экран панель, содержащую элементы управления. Перейти в режим конструктора - кнопка с изображением треугольника и карандаша. Кнопкой в виде листочка с указательным пальцем вывести окно Свойства. Разместить на листе Excel элементы управления: заголовки с именами (свойство Name) Label1, Label2, Label3 и с надписями (свойство Caption) Регистр 1, Регистр 2, Регистр 3; поля с именами (свойство Name) R1, R2, R3 и со значением свойства Value, равным нулю; кнопки с надписями (свойство Caption - см. рисунок). Написать процедуру для каждой кнопки.
Разработка событийных процедур.
Рассмотрим несколько процедур: Сложение – выполняется при нажатии командной кнопки с надписью + (свойство Caption), Умножение (*), Извлечение квадратного корня - командная кнопка с именем (Name) x12 и c надписью (Caption) x^(1/2). Private Sub Сложение_Click()
R2.Value = Val(R1.Text) + Val(R2.Text) ' Функция Val преобразует символы в числа
End Sub Private Sub Умножение_Click()
R2.Value = R1.Value * R2.Value
End Sub Private Sub x12_Click()
If R2.Value > 0 Then ' если знаменатель больше нуля, то возможна операция деления
' Функция Format преобразует число в символы с тремя знаками после запятой
' Функция Sqr извлекает квадратный корень из числа
R2.Text = Format(Sqr(R2.Value), "0.000")
Else
' сообщение с помощью функции MsgBox, если подкоренное выражение отрицательно
MsgBox ("R2 <= 0")
End If
End Sub Для перехода к тексту процедуры в окне редактора VBA - двойной щелчок мышью по командной кнопке в режиме конструктора.
VBA2. Разветвления Вычислить значения функций вобласти определения х [-1.7,1.5]. Y = (1+x)/(1+ ) f = cos2(3x) - cos(x)sin(x)
= 3.14159265 ( можно также вычислить как функцию ПИ( ) )
, x<=0
g =
( 1+x)/(1+ ), x >0
(1+x+x2)/(1+x2), x<0
z = , x>=0 и x<1
2 Abs(0.5+Sin(x)), x>=1
Для вычислений на листе Excel (см. приведенный ниже рисунок) разместить поля (TextBox) с именами TBx, TBy, TBf, TBg, TBz. Рядом с полями поместить надписи x, y, f, g, z. Кроме того, на лист Excel поместить кнопку CommandButton1 и написать процедуру для вычисления указанных функций. Если заданное значение x не попадает в область определения функции, то в соответствующее поле занести пробел.
VBA3. Переменные, процедуры, функции, циклы, массивы Предположим, что на листе Excel в диапазоне ячеек (R1C1 : RmCn) находится таблица данных, а ячейки столбца n+1 и строки m+1, примыкающие к таблице, - пусты.
1 2 3 - номера столбцов: j=1,…..,n
Требуется разместить на листе Excel командную кнопку с заголовком Вычислить, а в модуль, соответствующий листу Excel, включить подпрограммы-функции Mrow и Ncol для определения m и n, процедуру TabA для копирования таблицы с листа Excel в двумерный массив A, а также событийную процедуру, которая должна включать в себя:
резервирование переменных i, j, m, n типа Integer, резервирование переменной S типа Single, резервирование массива A без указания его размерности, т.е. Dim A( ) As Single, определение m и n путем использования функций Mrow и Ncol, переопределение размерности массива A, т.е. ReDim A (1 To m, 1 To n), копирование таблицы в массив A с помощью процедуры TabA, вычисление и размещение в строке, имеющей номер m+2, сумм по столбцам.
Рекомендации.
Для определения m и n в функциях Mrow и Ncol применить циклы типа Do-Loop:
Function Mrow() As Integer
Dim i As Integer
i = 1
Do Until IsEmpty (Cells(i, 1))
i = i + 1
Loop
Mrow = i - 1
End Function
Процедура TabA должна иметь следующий заголовок:
Sub TabA(m As Integer, n As Integer, A( ) as Single)
Для копирования таблицы в массив A использовать двойной цикл типа For-Next:
For i=1 To m
For j=1 To n
A(i,j)=Cells(i,j).Value
Next j
Next i
Для вычисления сумм столбцов в событийной процедуре также использовать двойной цикл, полагая, что исходные данные находятся в массиве A. Здесь внешний цикл - по j. Он включает в себя начальное присваивание S=0, цикл по i, в котором наращивается значение S, и, наконец, присваивание j-го результата: Cells(i,j).Value = S
VBA4. Сортировка чисел в столбце по возрастанию или убыванию
На листе Excel для создания интерфейса пользователя разместите элементы управления: надпись Номер столбца; поле TextBox1 и счетчик SpinButton1 для указания номера столбца; переключатели Option1, Option2 с надписями По возрастанию, По убыванию и кнопку с надписью Сортировать - см. рисунок.
2. Для поля TextBox1 и для счетчика SpinButton1 установите свойство Value=1. Кроме того, для счетчика установите значения свойств Min=1 и Max=20. Для счетчика создайте событийную процедуру SpinButton1_Change() - при изменении пользователем значения счетчика она должна изменять значение TextBox1.Value, делая его равным значению счетчика. Точно так же для поля TextBox1 создайте событийную процедуру TextBox1_Change() – она должна изменять значение (свойство Value) счетчика, как только пользователь изменит значение, хранимое в текстовом поле.
Создайте событийную процедуру, соответствующую командной кнопке. Эта процедура должна определить номер j столбца, подлежащего сортировке, количество чисел m в этом столбце и выполнить сортировку методом пузырька. В процедуре зарезервируйте целые переменные i, j, m, переменную F типа Variant и переменные Flag и R типа Boolean. Процедура сортировки методом пузырька может включать следующие блоки:
Flag=False (признак того, что еще не было перестановок чисел в столбце j); i=2; R = Cells(i-1,j).Value - Cells(i,j).Value (R=True, если значение в ячейке i-1 больше, чем в i); если надо сортировать по возрастанию, то R = Cells(i,j).Value - Cells(i-1,j).Value; если R=True, то исполняется блок 5; F = Cells(i-1,j).Value; Cells(i-1,j).Value = Cells(i,j).Value; Cells(i,j).Value = F ; Flag=True; (перестановка чисел, регистрация этого факта путем присваивания Flag=True) i=i+1; если i <= m , то передача управления блоку 2 - для сравнения следующей пары чисел; Если Flag =True, то передача управления блоку 1, иначе конец, т.к. перестановок не было.
VBA5. Сортировка чисел в столбце по возрастанию или убыванию с созданием формы Поместить на лист Excel кнопку CommandButton1 с тем же заголовком Сортировать, а остальные элементы управления и дополнительно кнопку Ok поместим на диалоговую форму с именем Dialog1 и заголовком Параметры сортировки. Для создания этой формы надо переключиться в окно Visual Basic и с помощью кнопки на панели инструментов или через пункт меню Вставка/UserForm создать пустую форму. Она появится в окне Visual Basic. При щелчке мышью по форме появляется также окно Панель элементов, содержащее палитру элементов управления. Теперь остается с помощью кнопки на панели инструментов раскрыть в окне Visual Basic еще окно свойств, установить свойства формы и разместить на ней требуемые нам элементы управления точно так же, как это было сделано на листе Excel (см. рисунок). Такой подход почти освободит лист Excel от элементов управления, но потребует дополнительных усилий при разработке приложения.
Во-первых, теперь в начало событийной процедуры CommandButton1_Click надо вставить команду для показа формы: Dialog1.Show. В этой инструкции записывается имя объекта (имя, присвоенное нами форме) и, через точку, имя метода – показать. Следовательно, как только пользователь нажмет командную кнопку на листе Excel, поверх этого листа появится диалоговое окно. В нем пользователь выберет параметры сортировки и нажмет кнопку Ok (см. второй рисунок, поясняющий эту работу).
Во-вторых, надо написать событийную процедуру для кнопки Ok. Эта процедура должна содержать команду Dialog1.Hide - скрыть форму Dialog1.
В-третьих, в процедурах, принадлежащих листу Excel, а не форме Dialog1, изменится обращение к свойствам элементов управления. Так, теперь надо писать не TextBox1.Value, а Dialog1.TextBox1.Value – так указывается свойство Value (значение) объекта TextBox1 (редактируемое поле), принадлежащего форме Dialog1.
VBA6. Создание приложения для вычисления многочленов. В ычислить многочлен пятой степени
и спользуя для вычислений экономичный алгоритм Герона:
На свободном рабочем листе создать командную кнопку с надписью Вычисление многочлена. В программный код кнопки вписать инструкцию UserForm1.Show. Для добавления к проекту новой формы в окне редактора Visual Basic выполнить команду Вставка/UserForm. Добавить необходимые элементы управления, используя панель элементов (см.рис.).
Оставаясь в редакторе Visual Basic, двойным щелчком левой кнопки мыши по форме вызвать ее программный код и перейти к разработке модуля.
Сначала опишите массив А, отведенный под коэффициенты многочлена, переменные x и S, не забывая о комментариях.
Dim A(5) ‘ массив для коэффициентов многочлена
Dim x ‘ переменная для значения аргумента
Dim S ‘ переменная для вычисленного значения многочлена. Затем надо написать процедуры, назначенные полям ввода коэффициентов и аргумента. Следующий пример приведен для А(0):
Private Sub TextBox1_Change() ' ввод коэффициента a0
A(0) = TextBox1.Value
Next_Button.Enabled = True ‘ эта инструкция активизирует кнопку «Вычислить»
End Sub
Необходимо также написать событийную процедуру для кнопки Выход: Private Sub Cancel_button_Click() ' кнопка "Выход"
Unload Me ‘по русски: «выгрузи меня»
End Sub
Кнопке Вычислить, имеющей имя Next_Button_Click( ), назначим следующую процедуру:
Private Sub Next_Button_Click() ' вычисление по схеме Горнера
S = A(0)
For I = 0 To 4 ' цикл For ... Next
S = S * x + A(I + 1)
Next I
TextBox8.Value = Str(S) ‘ функция Str присваивает переменной S строковый тип
End Sub Предложенная форма может быть использована и при вычислении многочленов степени меньше пятой, если в соответствующие поля вводить нулевые значения коэффициентов. Возвратившись в Excel и щелкнув по командной кнопке Вычисление многочлена, протестируем созданную форму, вычисляя следующие многочлены:
1 ) 2) 3)
Тестирование можно проводить и оставаясь в редакторе VBA (см. раздел 7 «Отладка приложений»). VBA7. Сортировка чисел в столбце по возрастанию или убыванию с созданием формы и панели инструментов с кнопкой В предыдущих работах, посвященных созданию формы, запуск программы выполнялся с помощью кнопки размещенной на листе Excel. Целью этой работы является создание панели инструментов с кнопкой для выполнения программы.
1. Создайте панель инструментов и разместите на ней кнопку. Панель инструментов должна появляться при открытии рабочей книги. В окне редактора Visual Basic выберите лист ThisWorkBook и включите в него следующие две процедуры:
1) Процедура создания новой панели инструментов при открытии рабочей книги
Private Sub Workbook_WindowActivate(ByVal Wn As Excel.Window)
'Создание новой панели инструментов
With Application.CommandBars.Add(Name:="Моя панель инструментов", _
Position:=msoBarTop, MenuBar:=False, Temporary:=True)
.Visible = True
With .Controls
'Создание кнопки с надписью
With .Add(Type:=msoControlButton, Id:=1) 'добавить кнопку на панель инструментов
.Caption = "Сортировка" 'надпись на кнопке
.TooltipText = "Сортировка" 'всплывающая подсказка
.Style = msoButtonCaption
.OnAction = "Sort" 'при нажатии на кнопку выполняется процедура
End With
End With
End With
End Sub 2) Процедура, удаления созданной панели инструментов при закрытии приложения
Private Sub Workbook_WindowDeactivate(ByVal Wn As Excel.Window)
With Application
.CommandBars("Моя панель инструментов").Delete
End With
End Sub
В результате будет создана панель инструментов с кнопкой Сортировка (см. Рис). 2. Добавьте модуль через пункт меню Вставка/Модуль и введите процедуру Sort для отображения формы на экране.
Sub Sort()
UserForm1.Show
End Sub
3. В окне редактора создайте форму, разместите на ней требуемые элементы управления и установите свойства (см. Рис. на следующей стр.).
4. Напишите процедуры, связанные с формой, а также процедуру UserForm_Initialize (задание значений по умолчанию).
Private Sub UserForm_Initialize() ' Процедура инициализации формы
OB1.Value = True
OptionButton1.Value = True
SB1.Min = 1
SB1.Max = 100
TB1.Value = SB1.Value
SB2.Min = 1
SB2.Max = 100
TB2.Value = SB2.Value
E nd Sub 5. Напишите процедуры сортировки. Сортировка выбором заключается в том, что требуется найти элемент массива, имеющий наименьшее значение и переставить его с первым элементом, затем проделать то же самое, начав со второго элемента.
9. Самостоятельные и контрольные задания Задание 1
Даны два действительных числа. Вывести первое число, если оно больше второго, и оба числа, если это не так. П усть x1=y1=1; xi=0.3xi-1; yi=xi-1+yi-1, i=2,3,… Дано натуральное n. Найти Даны целые числа а1, а2, а3. Получить целочисленную матрицу [bij] i, j=1,2,3, для которой bij=ai-3aj.
Задание 2
Даны 3 действительных числа a, b, c (a0). Полностью исследовать квадратное уравнение ax2+bx+c=0, т.е. если действительных корней нет, то должно быть выведено сообщение об этом, иначе должны быть найдены и помещены в текстовые поля 2 корня. Пусть a0=1; ak=kak-1+1/k; k=2,3,… Дано натуральное n. Получить an. Дана действительная матрица размера m x n. Определить числа b1,b2,…,bm, равные соответственно:
а) суммам элементов строк;
б) произведением элементов строк;
в) наименьшим значениям элементов строк;
г) значениям средних арифметических элементов строк;
д) разностям наибольших и наименьших значений элементов строк. Задание 3
Даны действительных числа x, y. Вычислить z:
x-y, если x>y
z =
y-x+1 в противном случае.
2. Пусть v1=v2=0; v3=1.5;
i = 4,5,…. Дано натуральное n (n4). Получить vn.
Дана действительная квадратная матрица порядка 10. В строках с отрицательным элементом на главной диагонали найти:
а) сумму всех элементов;
б) наибольший из всех элементов. Задание 4
Последовательность чисел Фибоначчи u0, u1, … образуется по закону u0=0; u1=1; ui=ui-1+ui-2 (i=2,3,….)
а) Дано натуральное число n>1. Получить u0, u1, …, un.
б) Последовательность f0, f1, … образуется по закону f0=0; f1=1;
fi=fi-1+fi-2+ui-2 (i=2, 3, …). Дано натуральное число n>1. Получить f0, f1, …, fn. Дано действительное число x. Вычислить с точностью =10-6:
Указать количество учтенных слагаемых.
Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых, и очередное слагаемое оказалось по модулю меньше, чем . Это и все последующие слагаемые можно уже не учитывать. Задание 5
«Тестирование коллектива». Пусть целочисленная матрица размера nxm содержит информацию об учениках некоторого класса из n человек: j-я строка содержит информацию о i-м ученике. В первом столбце проставлен возраст в годах, во втором – рост в см, в третьем – успеваемость (округленный средний балл) и т. д. Ученик называется среднестатистическим по k-му параметру (уникальным по k-му параметру), если на нем достигается минимум (максимум) модуля разности среднего арифметического чисел из k-го столбца и значения k-го параметра этого ученика. По матрице указанного вида определить номера учеников:
а) самых уникальных,
б) самых средних.
Элемент матрицы называется седловой точкой, если он является одновременно наименьшим в своей строке и наибольшим в своем столбце. Дана действительная матрица размера 5x 6. Выяснить, имеются ли седловые точки в этой матрице, и если они имеются, то указать индексы одной из них.
Задание 6
Найти количество различных чисел в произвольном одномерном массиве чисел, который предварительно разместить на рабочем листе книги Excel.
Создать диалоговое окно (UserForm), содержащее командную кнопку, а в событийной процедуре, соответствующей нажатию кнопки, определить это количество. Полученное значение вывести в поле с надписью Количество различных чисел.
Задание 7
Найти количество совпадающих чисел в произвольном одномерном массиве чисел, который предварительно разместить на рабочем листе книги Excel.
Создать диалоговое окно (UserForm), содержащее командную кнопку, а в событийной процедуре, соответствующей нажатию кнопки, определить это количество. Полученное значение вывести в поле с надписью Количество совпадающих чисел. Задание 8
Найти наибольшее число в произвольном одномерном массиве чисел, который предварительно разместить на рабочем листе книги Excel.
Создать диалоговое окно (UserForm), содержащее командную кнопку, а в событийной процедуре, соответствующей нажатию кнопки, определить наибольшее число массива. Полученное значение вывести в поле с надписью Наибольшее число.
Курсовые работы Общие требования и рекомендации Курсовая работа должна включать в себя текст на Word и программу на VBA в книге Excel.
Текст работы - это теоретическая часть, которая должна содержать титульный лист, описание постановки задачи, алгоритма ее решения, например, алгоритма и последовательности вычисления координат теодолитного хода с указанием формул, а также описание программы - ее основных блоков и результатов отладки на примере.
Программа - это практическая часть курсовой работы. Для ее разработки надо создать интерфейс пользователя, написать событийные и общие процедуры и отладить приложение на примерах.
|