Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

12_Шишкина Л.П., Бояринцева Т.П., Сержант Т.Н_Лаб_практикум по информатике_VBA_2012

.pdf
Скачиваний:
36
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Для создание формы надо переключиться в окно редактора и с помощью кнопки на панели инструментов или через пункт меню Вставка/UserForm создать пустую форму. Она появиться в окне Visual Basic. Теперь можно разместить требуемые элементы управления на форме и установить требуемые свойства.

7.Отладка приложений

Вэтом разделе приведем рекомендации по отладке приложений.

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

Во-вторых, для просмотра промежуточных и окончательных значений переменных можно на время отладки включать в тексты процедур обращения к процедуре MsgBox, а также выводить значения переменных в виде свойства Caption элемента управления Label (метка – статический текст) или в виде свойства Text элемента управления TextBox (поле с редактируемым текстом). Важную роль играет выбор точек процедуры для вывода значений переменных при отладке. Для выбора таких точек можно рекомендовать рассматривать процедуру состоящей из логически завершенных фрагментов программного кода, формирующих определенные «информационные сцены». Эти-то сцены, характеризующиеся содержимым переменных и массивов, и надо контролировать.

Программа, созданная с помощью VBA (как и другого языка программирования), обычно сопровождается следующими типами ошибок:

ошибки синтаксиса, сразу же делающие невозможным выполнение программы,

логические ошибки, в результате которых программа делает то, что не запланировано,

ошибки выполнения, приводящие к остановке программы.

Строку программного кода, содержащую ошибку синтаксиса, редактор Visual Basic окрашивает красным цветом и в диалоговом окне дает некоторое разъяснение.

К сожалению, логические ошибки не заявляют о себе изменением цвета. Эти ошибки не прерывают программы, но приводят к неверным результатам. Для их выявления необходим анализ алгоритма программы с привлечением средств отладки VBA (о них см.ниже). При этом полезно проведение тестов, которые должны учитывать все возможные случаи возникновения ошибок.

Ошибки выполнения могут возникать, например:

1)при считывании файла с диска, при разрыве соединения с базой данных, с сетевым сервером или страницей Internet,

2)вследствии ошибок в логике программы, когда происходит деление на нуль и т.д.

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

Впервом примере перед чтением данных из текстового файла помещена инструкция On Error. Если произойдет ошибка (такого файла нет и т.п.) управление будет автоматически передано на блок инструкций обработки ошибок – он начинается с метки ErrFTXT.

Sub Ftxt (WorkDir As String, FTXTname As String)

‘ При обращении процедуре сообщается рабочий каталог и имя текстового файла

On Error GoTo ErrFTXT

Open WorkDir & "\" & FTXTname For Input As #1 Do Until EOF(1)

21

Line Input #1, SL

{ Работа с очередной строкой файла FTXT }

Loop

Close (1): Exit Sub

ErrFTXT:

MsgBox Err.Description, , "Файл " & FTXT & “, вероятно, не существует"

Close #1

End Sub

Этот пример дает представление и о работе с входным текстовым файлом. Запись строк в создаваемый текстовый файл аналогична, только файл открывают не для ввода (For Input), а для вывода (For Output), и вместо инструкции Line Input для записи строк используют Print (например, Print #2, SL).

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

Sub Деление_чисел()

Dim u As String, zn As String

Dim x As Single, y As Single, S As Single u = InputBox("Введите первое число") x = Val(u)

ввод: u = InputBox("Введите второе число") y = Val(u)

u = InputBox("Введите знак операции") zn = u

If y <> 0 Then S = x / y

MsgBox Str(x) & " / " & Str(y) & " = " & Str(s), , "Деление"

Else

MsgBox "Деление на нуль", , "Деление" GoTo ввод

End If End Sub

Простейшим средством предотвращения ошибок является использование инструкции Option Explicit, которая предписывает явно описывать все переменные, встречающиеся в программе. Скажем, случайное использование при наборе в имени переменной Сумма латинской буквы С воспринимается программой (без применения инструкции Option Explicit ) как имя новой переменной, что вызовет ошибку выполнения, которую весьма трудно найти.

Ключевым моментом в процессе отладки программы является момент перехода процесса выполнения программы в режим паузы. Режим паузы это временная остановка выполнения программы на некоторой инструкции в программном коде. В этом режиме проверяются текущие значения всех переменных в программе. Например, переходя в режим паузы при вычислении многочлена степени не выше пятой, мы увидим следующее окно редактирования VBA – процедуры (Рис. 3).

22

Рис. 3. Точка останова

Кроме того, в режиме паузы можно воспользоваться командой меню в редакторе Visual Basic: Отладка/Шаг с заходом, продолжая при этом выполнение программы в пошаговом режиме, по одной инструкции, и наблюдая за изменениями переменных. Значения переменных можно наблюдать во всплывающих подсказках, если подвести курсор мыши к соответствующей переменной.

Врежим паузы можно войти, используя одну из возможностей:

щелчок на кнопке Пауза на панели инструментов в редакторе Visual Basic,

комбинация клавиш <Ctrl+Break> (в случае, например, зацикливания),

во время ошибки выполнения, когда VBA отображает диалоговое окно с описанием ошибки, щелчок по кнопке Отладка переводит программу в режим паузы,

назначение точки останова строке программного кода (на рис.3 точка останова установлена щелчком мыши на полях в окне редактирования программного кода).

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

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

продолжит свое выполнение дальше, или по кнопке Сброс, что остановит выполнение программы.

В режиме паузы можно использовать еще одно средство отладки: окно локальных переменных. В окне локальных переменных (Рис. 4) автоматически отображаются имена, значения и типы данных всех переменных, доступных в выполняемой в данный момент процедуре. Эта информация обновляется редактором Visual Basic по мере выполнения программы, так что в окне локальных переменных всегда видны текущие значения.

Информация в окне локальных переменных представлена в виде разделов, обозначенных значком [+], чтобы развернуть раздел нужно щелкнуть по плюсу. В результате этого можно

23

получить доступ ко всем переменным и приступить к их редактированию, что удобно, например, в таких случаях:

a)Проверка программы при разных значениях переменной, тестирование.

b)Предыдущая строка программного кода содержит ошибку, в результате которой переменной присвоено неверное значение. Для продолжения выполнения программы можно исправить

значение переменной.

Чтобы изменить значение переменной, щелкните два раза на текущем значении переменной, измените значение и нажмите <Enter>.

Следующее средство отладки - окно контрольного значения, которое показывает значения выражений или переменных, выбранных пользователем (рис. 4.). Как и в окне локальных переменных, в окне контрольного значения можно менять значение выражения прямо во время выполнения программы. Для этого сначала выделите строку с нужным выражением, а затем само выражение. После этого можно вносить изменения в окне контрольного значения, которое можно вызвать по команде Отладка/Контрольное значение.

Рис. 4. Окно контрольного значения

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

Контролируемые выражения можно использовать также для назначения точек останова. В диалоговом окне Добавление контрольного значения имеется возможность назначить точки останова двух типов:

1.Точки останова, автоматически переводящие программу в режим паузы, как только выполнится оператор, изменяющий на ненулевое значение заданного выражения (в VBA 0 означает False, а любое ненулевое значение — это True). Для назначения этого типа точки останова выберите переключатель Останов, если выражение истинно.

2.Точки останова, автоматически переводящие программу в режим паузы при изменении значения заданного выражения. Чтобы назначить точку останова этого типа нужно выбрать переключатель Останов при изменении значения.

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

24

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.

Создание интерфейса пользователя.

1)Меню Вид/Панели инструментов/Visual Basic.

2)Кнопкой в виде молоточков вывести на экран панель, содержащую элементы управления.

3)Перейти в режим конструктора - кнопка с изображением треугольника и карандаша.

4)Кнопкой в виде листочка с указательным пальцем вывести окно Свойства.

5)Разместить на листе Excel элементы управления: заголовки с именами (свойство Name)

Label1, Label2, Label3 и с надписями (свойство Caption) Регистр 1, Регистр 2, Регистр 3;

поля с именами (свойство Name) R1, R2, R3 и со значением свойства Value, равным нулю; кнопки с надписями (свойство Caption - см. рисунок).

6)Написать процедуру для каждой кнопки.

Разработка событийных процедур.

Рассмотрим несколько процедур: Сложение – выполняется при нажатии командной кнопки с надписью + (свойство Caption), Умножение (*), Извлечение квадратного корня -

командная кнопка с именем (Name) x12 и c надписью (Caption) x^(1/2).

25

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+2 x x2 )

f = cos2(3 x) - cos( x)sin( x)

 

 

 

 

 

= 3.14159265 ( можно также вычислить как функцию ПИ( ) )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

g =

 

1 x2 ,

 

x<=0

 

 

 

 

 

 

 

 

 

x >0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(1+x)/(1+3 1 e 0.2x

),

 

 

 

(1+x+x2)/(1+x2),

 

x<0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

z =

 

 

 

1 2x/(1 x2 ) ,

 

x>=0

и x<1

 

 

 

 

 

 

 

 

 

 

2Abs(0.5+Sin(x)),

 

x>=1

 

 

 

Для вычислений

на

листе

Excel (см. приведенный ниже рисунок) разместить поля

(TextBox) с именами TBx, TBy, TBf, TBg, TBz. Рядом с полями поместить надписи x, y, f,

g, z.

Кроме того, на лист Excel поместить кнопку CommandButton1

и написать процедуру

для

вычисления указанных функций. Если заданное значение x

не попадает в область

определения функции, то в соответствующее поле занести пробел.

 

 

26

VBA3. Переменные, процедуры, функции, циклы, массивы

Предположим, что на листе Excel в диапазоне ячеек (R1C1 : RmCn) находится таблица данных, а ячейки столбца n+1 и строки m+1, примыкающие к таблице, - пусты.

1

2

3

- номера столбцов: j=1,…..,n

9.7

4.8

 

1

5.0

5.0

 

2

5.015.0

10.015.0

7.5

10.0

……

10.010.0

10.0

5.0

m

Номера строк: i = 1,….,m

Требуется разместить на листе Excel командную кнопку с заголовком Вычислить, а в модуль, соответствующий листу Excel, включить подпрограммы-функции Mrow и Ncol для определения m и n, процедуру TabA для копирования таблицы с листа Excel в двумерный массив A, а также событийную процедуру, которая должна включать в себя:

1)резервирование переменных i, j, m, n типа Integer,

2)резервирование переменной S типа Single,

3)резервирование массива A без указания его размерности, т.е. Dim A( ) As Single,

4) определение m и n путем использования функций Mrow и Ncol,

5)переопределение размерности массива A, т.е. ReDim A (1 To m, 1 To n),

6)копирование таблицы в массив A с помощью процедуры TabA,

7)вычисление и размещение в строке, имеющей номер m+2, сумм по столбцам.

27

Рекомендации.

Для определения 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. Сортировка чисел в столбце по возрастанию или убыванию

1.На листе Excel для создания интерфейса пользователя разместите элементы управления: надпись Номер столбца; поле TextBox1 и счетчик SpinButton1 для указания номера столбца; переключатели Option1, Option2 с надписями По возрастанию, По убыванию и кнопку с надписью Сортировать - см. рисунок.

28

2.Для поля TextBox1 и для счетчика SpinButton1 установите свойство Value=1. Кроме того,

для счетчика установите значения свойств Min=1 и Max=20. Для счетчика создайте событийную процедуру SpinButton1_Change() - при изменении пользователем значения счетчика она должна изменять значение TextBox1.Value, делая его равным значению счетчика. Точно так же для поля TextBox1 создайте событийную процедуру TextBox1_Change() – она должна изменять значение (свойство Value) счетчика, как только пользователь изменит значение, хранимое в текстовом поле.

3.Создайте событийную процедуру, соответствующую командной кнопке. Эта процедура должна определить номер j столбца, подлежащего сортировке, количество чисел m в этом столбце и выполнить сортировку методом пузырька. В процедуре зарезервируйте целые переменные i, j, m, переменную F типа Variant и переменные Flag и R типа

Boolean. Процедура сортировки методом пузырька может включать следующие блоки: 1) Flag=False (признак того, что еще не было перестановок чисел в столбце j); i=2;

2)R = Cells(i-1,j).Value - Cells(i,j).Value (R=True, если значение в ячейке i-1 больше, чем в i);

3)если надо сортировать по возрастанию, то R = Cells(i,j).Value - Cells(i-1,j).Value;

4)если R=True, то исполняется блок 5;

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)

6)

i=i+1; если i <= m , то передача управления блоку 2 -

для сравнения следующей пары

 

чисел;

 

7)

Если 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.

29

30