VBA-методичка. Практикум по информатике для студентов очной формы обучения Часть ii. Visual Basic for Applications
Скачать 0.95 Mb.
|
Встроенные типы данных VBA
Когда при разработке приложения возникает необходимость в переменной для хранения данных, ее описывают в модуле перед процедурами или в конкретной процедуре. В первом случае переменная будет доступна всем процедурам модуля (как контейнер общего пользования), а если в ее описании применено ключевое слово PUBLIC, то переменную смогут использовать даже процедуры других модулей. Такую переменную называют глобальной. В ней удобно размещать данные, требуемые многим процедурам. Переменная, описанная внутри процедуры, называется локальной – она используется только в этой процедуре, а в других могут быть переменные с таким же именем. Инструкция, содержащая описание переменной, имеет вид: Dim ИмяПеременной As ТипДанных Для определения глобальной переменной вместо Dim пишут Public. Пример описания переменных: Public Nprof, X0 As Single, Y0 As Single Dim I As Integer, J As Integer, Date1 As Date, Date2 As Date, ФИО As String*32 Nprf=40 При описании переменной ФИО, кроме ее имени и типа, указана длина в байтах. Длину можно назначать (хотя это не обязательно) для строковых переменных. Для переменной Nprof тип вообще не указан – по умолчанию ей будет назначен тип Variant – это удобно для программиста, но не экономично: число в формате Variant занимает 16 байт, а строка – 22 байта плюс по 1 байту на каждый символ. Переменные типа Variant могут хранить следующие значения: Empty - не получила начального значения. Переменная типа Variant, содержащая значение Empty, рассматривается как 0 в контексте математических операций и как пустая строка ("") в контексте операций со строковыми значениями. Null - не содержит данных, это значение можно присвоить переменной. Error - является специальным значением, которое используется для указания возникновения условия ошибки в процедуре. VBA позволяет использовать переменные без предварительного описания, поэтому переменная Nprf сразу используется в инструкции присваивания. Она имеет тип Variant по умолчанию. Такой стиль “ввода в действие” переменных довольно опасен, т.к затрудняет поиск ошибок. ПоэтомуVBA позволяет наложить требование на явное описание всех переменных в модуле. Для этого в описательную часть модуля (до процедур) надо включить инструкцию Option Explicit. Если теперь попытаться использовать в тексте процедур необъявленные переменные, VBA сразу обнаружит ошибки. Иногда имена записывают так: Номер_строки или НомерСтроки. Применение полных имен особенно полезно для глобальных переменных, которые хранят параметры моделируемых объектов и явлений. В компактных процедурах удобнее пользоваться переменными, применяемыми в математике и физике, например: X – координата, M – число строк в матрице или таблице, i – номер очередной строки, N – число столбцов, j – номер текущего столбца, V – скорость, S – путь и т.п. Кроме возможности явного задания типа переменной, VBA позволяет указать тип переменной неявно, добавив к ее имени символ-указатель: $ - для типа данных String, например, ФИО$ = ”Иванов И.И.” ; % - для данных типа Integer, например, i% = 1; & - для данных типа Long, например, CX& = 6510200; ! - для данных типа Single, например, x! = 107.315; # - для данных типа Double, например, Pi# = 3.14159; @ - для данных типа Currency, например, SS@ = 67920.12 Такой подход вряд ли стоит рекомендовать, но иногда он может способствовать наглядности. Наряду с переменными, для хранения данных во время работы приложения используются массивы переменных, или просто массивы. Массив описывается так же, как одиночная переменная, только после имени в скобках указывается еще размерность: Dim V(1 to 200) As Single, T(1 to 200) As Single, i As Integer Так можно описать массивы измеренных значений скорости и времени. При вычислениях i-ый элемент массива указывают с помощью индекса: S=S+(V(i)+ V(i+1))*0.5*(T(i+1)-T(i)) Если при описании массива размерность задать одним числом, например, V(200), то будет считаться, что нумерация элементов массива начинается с 0 и оканчивается числом 200. Если в описательную часть модуля (до процедур) включить инструкцию Option Base 1, то нумерация элементов массива будет начинаться с 1. Кроме одномерных массивов, используются многомерные. Предположим, что на листе Excel в первом столбце размещены идентификаторы строк, например, Y1,Y2,…,YI,…,YM , а в первой строке – идентификаторы столбцов: X1,X2,…,XJ,…,XN. На пересечении I-ой строки и J-го столбца находится элемент aIJ матрицы (Рис.2.). В этом примере матрица представляет собой таблицу коэффициентов, позволяющих связать любой YI уравнением со значениями X1,…,XN: YI=aI1*X1+aI2*X2+…+aIJ*XJ+…+aIN*XN Другими словами, мы имеем матричную запись системы линейных уравнений. Пусть для последующей работы с матрицей требуется задать M, N, разместить идентификаторы YI (I=1,…,M) и XJ (J=1,…N) в массивах CY, CX, а элементы матрицы в двумерном массиве A(I,J). Этот пример иллюстрирует часто встречающуюся ситуацию: в момент составления программы обычно не известно количество элементов массива – оно определяется программой во время исполнения. Если заранее можно оценить максимальную длину массива, то его часто резервируют с расчетом на максимальную размерность. Так, в нашем случае можно принять ограничение: разрабатываемая программа предназначается для работы с матрицами, у которых число строк и столбцов не превышает 40. Тогда инструкция для резервирования массивов будет иметь вид: Dim CY(1 to 40), CX(1 to 40), A(1 to 40,1 to 40) As Double Visual Basic предоставляет и другую возможность – динамического переопределения размерности массивов. При резервировании массива размерность не указывается. Например, Dim a() as Single. В процедуре вычисляется необходимый размер массива и присваивается некоторой переменной n. Выполняется изменение размерности массива: Redim a (1 to n) Допустимо повторное использование инструкции Redim Рассмотрим следующий модуль: Option Explicit Dim CY( ), CX( ), A( ) As Double Dim I As Integer, J As Integer, M As Integer, N As Integer Private Sub CommandButton1_Click( ) N=TextBox1.Value : M=TextBox2.Value 'Определение M, N - размерности матрицы ReDim CY(1 To M) ReDim CX(1 To N) 'Изменение размерности массивов ReDim A(1 To M, 1 To N) TabCXCY ' Копирование идентификаторов столбцов и строк в массивы CX, CY TabA ' Копирование матрицы в массив A End Sub Private Sub TabCXCY( ) For J = 1 To N CX(J) = Cells(1, J + 1).Value 'Идентификаторы столбцов Next J For I = 1 To M CY(I) = Cells(I + 1, 1).Value 'Идентификаторыстрок Next I End Sub Private Sub TabA( ) For I = 1 To M For J = 1 To N A(I, J) = Cells(I + 1, J + 1).Value Next J Next I End Sub Этот модуль содержит событийную процедуру CommandButton1_Click, решающую поставленную выше задачу при нажатии кнопки на листе Excel (на рис. 2 показана только сама матрица, причем символически), и общие процедуры: TabCXCY – копирование идентификаторов столбцов и строк в массивы CX, CY; TabA – копирование матрицы из таблицы на листе Excel в двумерный массив A; M и N вводятся в поля TextBox1 и TextBox2. Массивы CX, CY, A и основные переменные, требуемые для работы с матрицей, определены на уровне модуля, т.е. доступны всем его процедурам. Элементы массивов CX и CY имеют тип VARIANT, т.к. для них тип явно не указан. Выбор типа VARIANT для этих массивов обусловлен тем, что при последующем расширении написанного модуля в этих массивах, возможно, потребуется размещать не имена строк и столбцов, а сами значения YI и XJ. Обратим внимание на то, что все три массива в начале модуля определены без указания размерности, т.е. как динамические, а в процедуре CommandButton1_Click наши массивы переопределены – но только после ввода M и N. Приведенные процедуры еще пригодятся для пояснения циклов и как пример для самостоятельной разработки процедур на лабораторных занятиях. Завершая рассмотрение массивов, заметим, что в математике аналогом программисткого термина одномерный массив является понятие вектор. Вектор можно и нужно толковать не только геометрически: в общем случае это набор значений, например, свойств (признаков) объекта. Если представить себе многомерную систему координат, где по каждой оси отложено значение одного из свойств объекта (скажем, длина автомобиля, расход горючего, максимальная скорость и т.д.), то каждый объект в такой системе координат будет точкой – точкой в признаковом пространстве. Совокупность значений отдельных координат (в нашем примере – длины автомобиля, расхода горючего, максимальной скорости и др.) и есть вектор. Понятие вектора очень удобно для краткой записи операций с массивами чисел. Кстати, математический термин матрица соответствует двумерному массиву. Матрицу можно рассматривать как совокупность векторов-строк или векторов-столбцов. Теперь рассмотрим конструирование собственных типов данных. Например, для хранения записей о книгах определим в начале модуля тип данных RecBook с помощью инструкции: Type RecBook Название As String*50 Автор As String*20 Издательство As String*16 Год As Integer End Type Теперь в этом же модуле или в одной из его процедур зарезервируем массив для хранения записей о книгах: Dim Books(500) As RecBook Для доступа к полям Издательство и Год в i-ой записи массива воспользуемся инструкциями: Books(i).Издательство=”Недра” : Books(i).Год=1999 В этом пособии мы намеренно пользуемся примерами, а не строгими определениями синтаксиса инструкций VBA. Как уже отмечалось, такие определения легко получить в справочной системе Visual Basic – когда программист тонет, он кричит Кроме переменных, в программах используются данные, значения которых не изменяются – это константы. Приведем примеры их определения: Const Pi As Double = 3.14159 Const Nmin As Long = 0 Const Nmax As Long = 999999 Определив константы один раз, например, в начале модуля, ими можно пользоваться во многих инструкциях, не вспоминая каждый раз точное значение числа π. Если же в процессе разработки программы потребуется изменить ограничение Nmax , то это надо будет сделать в единственной инструкции. Некоторые данные во время работы приложения могут храниться в качестве свойств объектов: свойств ячеек листа Excel, свойств элементов управления и др. Приведем примеры: Лист2.Cells(2,6).Formula = “=Sum(B1:B5)” Лист2.Range("A1:D4").Value = Range("A1:D4").Value TextBox1.Text = “M=” & Str(M) & “ S=” & Format(S, “0.00”) В первом примере свойству Formula объекта Cells(2,6) , принадлежащего, в свою очередь, объекту Лист2, присваивается конкретная формула. Этот пример, кстати, показывает, как при программировании на VBA можно пользоваться встроенными в Excel формулами. Но верно и обратное: разрабатывая функции на VBA, можно расширить набор формул, доступных в Excel. Во втором примере значения, хранимые в прямоугольной области ячеек на текущем (активном в момент выполнения инструкции) листе, присваиваются ячейкам одноименной области на листе 2. В третьем примере с помощью операции конкатанации (&) три подстроки объединяются (суммируются) в одну строку, и эта строка присваивается свойству Text объекта TextBox1. Cells (Row,Column) обозначение ячейки, где Row - номер строки, а Column - номер столбца. Например, ячейка A2 обозначается Cells(2,1). Последний пример показывает, как значения M и S вывести в поле, размещенное на форме или на листе Excel. 5. Основные инструкции языка Visual Basic Сгруппируем основные инструкции языка Visual Basic по типу операций: присваивания, в том числе с выполнением математических операций в правой части инструкции; проверки условий, управления последовательностью исполнения инструкций, организации циклов; инструкции для работы с файлами. Последняя группа инструкций в этом кратком пособии не рассматривается. При необходимости с ними можно познакомиться самостоятельно [2, 4]. Инструкция присваивания предписывает найти значение выражения, заданного в ее правой части, и присвоить результат переменной, идентификатор которой расположен в левой части. Например, присвоить переменной x значение 2 - это можно записать: x=2; в следующем примере значение переменной x увеличивается на 2: x = x + 2. Рассмотрим математические операции, которые используются в выражениях, стоящих в правой части инструкций присваивания. Среди возможных операций можно выделить арифметические, конкатанации строк, сравнения и логические. Арифметические операции выполняются над числами, и их результатом являются числа. Они перечислены в таблице 3. При программировании формул необходимо учитывать приоритеты операций и в случае необходимости использовать скобки, как это принято в математике. Поясним таблицу 3. Смена знака имеет место, когда минус ставится перед именем переменной, константы или перед числом. Например: F=CX*(-G^2) ; если CX=3, а G=1.5 , то F = -6.75. Чтобы убедиться в правильности результата, достаточно на листе Excel разместить кнопку CommandButton1 и поле TextBox1, а в событийную процедуру CommandButton1_Click включить инструкции: Dim I As Integer, F As Single F = 3 * (-1.5 ^ 2) : I = 3 * (-1.5 ^ 2) TextBox1.Text = "F=" & Format(F, "0.00") & " I=" & Str(I) Выйдя из режима конструктора и нажав кнопку, увидим в поле TextBox1 результаты. Таблица 3. Арифметические операции
Все результаты примеров легко проверить, подставляя в текст приведенной только что процедуры формулы вычисления I и F. Из этих примеров должно быть понятно, что результат арифметических операций зависит также от типа переменной, которой он присваивается – ведь переменная целого типа не может хранить число с плавающей точкой, и поэтому перед записью в ячейку I результат округляется. Приведенная выше процедура иллюстрирует и конкатанацию (&) – слияние строк. К строке “F=” прибавляется строка, содержащая отформатированное значение F (с двумя цифрами после десятичной точки). К этой объединенной строке добавляется “ I=” и далее - превращенное в последовательность символов (в строку) число I. Операции сравнения используют для сравнения чисел, значений переменных, констант, ячеек таблиц. Результат операции сравнения имеет тип Boolean – может принимать значение True или False (Таблица 4). Таблица 4. Операции сравнения
В логических операциях не только результат, но и операнды имеют тип Boolean. Таблица 5. Логические операции
Поясним назначение таких операций на простом примере. Пусть переменная типа Boolean с именем R должна принимать значение True, если точка с координатами X,Y попадает в прямоугольную область, ограниченную координатами X1,X2 и Y1,Y2. Если точка за пределами прямоугольника, то R=False. Применив логическую операцию AND (И), вычислим значение R: R = (X>=X1) AND (X<=X2) AND (Y>=Y1) AND (Y<=Y2) Смысл этой операции в том, что если и первое выражение (X больше или равно X1) истинно, и второе истинно, и третье истинно, и четвертое истинно, то R=True. Если один из операндов логической операции AND представляет собой ложное выражение (утверждение), то и результатом будет False. Кроме операции AND, к числу часто используемых логических операций относятся OR и NOT. Первая из них дает результат True, если истинно хотя бы одно выражение, являющееся операндом. Операция NOT изменяет результат на противоположный, подобно смене знака в арифметическом выражении. Вычислим R с помощью этих операций: R = NOT ((X Выражение, стоящее в скобках после операции NOT, истинно (True), если точка или левее, или правее, или ниже, или выше воображаемого прямоугольника, т.е. если точка в него не попала. В этом случае R будет иметь значение False благодаря логическому отрицанию NOT. Несколько реже используются логические операции XOR (исключающее ИЛИ), EQV (эквивалентность) и IMP (импликация). Первая из них дает результат True, если только одно из выражений-операндов имеет результат True. Результатом операции EQV будет True, если выражения-операнды дают одинаковый результат. Результатом IMP будет True, если выражения-операнды дают разные результаты. Перейдем теперь ко второй, важнейшей в любом языке программирования, группе инструкций. Это инструкции проверки условий и организации циклов. Все они позволяютуправлять последовательностью исполнения инструкций в программе. Инструкция IF (ЕСЛИ) используется в двух нотациях: в виде простой и блочной структур. Инструкция простой структуры имеет следующую форму записи: If <Выражение> Then <Инструкция, исполняемая, если выражение-условие истинно> Конструкция блочной структуры может включать один блок инструкций (<Блок 1>), исполняемых, если выражение 1 истинно, или же еще дополнительные условия, сопровождаемые блоками инструкций: If <Выражение1> Then <Блок 1 – исполняется, если выражение 1 истинно> ElseIf <Выражение2> Then <Блок 2 – исполняется, если выражение 2 истинно > ElseIf <Выражение3> Then <Блок 3 – исполняется, если выражение 3 истинно > ………………….. Else <Блок инструкций, исполняемых, если ложны выражения в инструкциях If и ElseIf> End If Приведем примеры простой инструкции If: Вычисление значения функции: G= 2y+ If y <= 0 Then G = (1 + y^2) / Sqr(1 + y^4) Else G = 2 * y + sin(y)^2 / (2+y) 2) Сообщение, если R – истинно: If R Then MsgBox “Точка попала в прямоугольник” Теперь пример блочной структуры: R = False If X < X1 Then GoTo 10 ’уже ясно, что точка не попала в прямоугольник ElseIf X > X2 Then GoTo 10 ‘управление передается на метку 10 ElseIf Y < Y1 Then GoTo 10 ElseIf Y > Y2 Then GoTo 10 Else R = True End If 10: MsgBox R ’после метки ставится двоеточие Блоки ElseIf и (или) Else могут отсутствовать. В любом случае блочная конструкция оканчивается инструкцией End If. Приведенный пример, кроме блочной конструкции IF, поясняет возможность использования в программе меток и передач управления с помощью инструкции GoTo. Метка не обязательно обозначается числом – можно было написать и N10 или MsgR. В ситуациях, когда требуется запрограммировать три и более разветвлений в зависимости от значения одной переменной, удобно использовать структуру Select Case: Select Case <Переменная> Case <Значение 1> либо Case is <Условие 1> <Блок 1 – выполняется, если значение переменной равно значению 1 или соответствует условию 1> Case <Значение 2> либо Case is <Условие 2> <Блок 2 – выполняется, если значение переменной равно значению 2 или соответствует условию 2> …………………. End Select Приведем пример: Возраст = TextBox1.Value Select Case Возраст Case Is < 13 Label1.Caption = "После 22-00 спать !" Case 16 Label1.Caption = "Пора получать паспорт" Case Is < 18 Label1.Caption = "Только чай !" Case Is >= 18 Label1.Caption = "Можно почти все!" End Select Теперь рассмотрим организацию циклов. Циклы применяются для многократного повторения одной или нескольких инструкций. Вообще говоря, цикл нетрудно организовать и без специальных инструкций по схеме: инструкции присваивания начальных значений переменной цикла и другим переменным; инструкции, исполняемые при очередном значении переменной цикла; наращивание (изменение) переменной цикла и, возможно, других переменных, изменяемых одновременно с переменной цикла; проверка переменной цикла на соответствие условию, при котором цикл должен исполняться повторно, и передача управления блоку 2 при выполнении этого условия (IF <условие> GoTo <метка в начале блока 2>). Но в языках высокого уровня, и в том числе в VBA, предусмотрены инструкции, позволяющие записывать циклы еще компактнее. Проще всего цикл записывается, если известны начальное, конечное значения переменной цикла и шаг ее изменения. В таких случаях используют инструкцию For…Next , имеющую следующий синтаксис: For счетчик = начало To конец [Step шаг] [инструкции] [Exit For] [инструкции] Next [счетчик] Инструкции For…Next в общем случае содержит следующие элементы: Счетчик (переменная цикла) - числовая переменная, используемая в качестве счетчика цикла. Эта переменная не может иметь тип Boolean или быть элементом массива. Начало - начальное значение переменной цикла. Конец - конечное значение переменной цикла. Шаг - необязательный аргумент. Значение, на которое изменяется счетчик при каждом выполнении тела цикла. Если это значение не задано, по умолчанию шаг равен 1. Шаг может быть как положительным, так и отрицательным Инструкции - одна или несколько инструкций между For и Next, которые выполняются указанное число раз. После выполнения всех инструкций цикла значение шаг добавляется к текущему значению переменной счетчик. После этого инструкции цикла либо выполняются в очередной раз, либо цикл завершается и выполнение продолжается с инструкции, следующей за инструкцией Next. Пусть в J-ом столбце на листе Excel надо суммировать четные ячейки до строки 20, но только пока не встретится число 7777: J = 1: S = 0 For I = 2 To 20 Step 2 F = Cells(I, J).Value If F = 7777 Then Exit For 'Выход из цикла - на инструкцию после Next S = S + F Next I MsgBox "i= " & Str(I-2) & " S=" & Str(S) После выхода из цикла сообщается номер последней ячейки, значение которой добавлено к S и сама накопленная сумма. В большинстве случаев циклы этого типа выглядят проще, т.к. обычно не требуется задавать шаг изменения переменной цикла (Step) и не нужно выходить из цикла по дополнительному условию (Exit For). В модуле, приведенном после рис. 2, такие циклы используются в процедурах TabCXCY и TabA. В последней процедуре – вложенный (двойной) цикл. В тех случаях, когда нет возможности указать начальное и конечное значения переменной цикла, используют циклы типа Do-Loop. Для таких циклов возможны 4 варианта записи:
В число инструкций, исполняемых в цикле, может быть включена инструкция Exit Do, если из цикла надо выйти “досрочно”, например, при выполнении какого-нибудь дополнительного условия. Заметим, что Do While означает Выполнять пока… Do Until означает Выполнять пока не … Другими словами, вместо Do Until можно написать Do While Not. В некоторых случаях эти проверки удобнее ставить в конец цикла (Loop – цикл, дословно – петля). Приведем пример цикла DoWhile: известно, что сумма S числового ряда 1, 1/2, 1/3, 1/4, …,1/N (где N - целое положительное число) может быть сколь угодно большой (для любого числа M можно найти такое значение N, что S>M). Для решения задачи на лист Excel поместим кнопку (CommandButton1), поле (TextBoxM) для М, поле (TextBoxS) для S, поле (TextBoxN) для N. Sub CommandButton1_Click() Dim M as Integer, N as Long, S as Single S=0: M=TextBoxM.Value: N=0 Do While S<=M N=N+1 S=S+1/N Loop TextBoxS.Value=S TextBoxN.Value=N End Sub Таблица 7. Часто используемые встроенные функции Visual Basic
6. Создание пользовательских форм Пользовательская форма UserForm предоставляет пользователю возможность создавать диалоговые окна разрабатываемых приложений. Она служит базой пользовательского диалогового окна, на которой в зависимости от решаемой задачи размещают требуемые элементы управления. Свойства формы
Методы формы
События формы
Для создание формы надо переключиться в окно редактора и с помощью кнопки на панели инструментов или через пункт меню Вставка/UserForm создать пустую форму. Она появиться в окне Visual Basic. Теперь можно разместить требуемые элементы управления на форме и установить требуемые свойства. 7. Отладка приложений В этом разделе приведем рекомендации по отладке приложений. Во-первых, для отладки надо подбирать разнообразные примеры, не ограничиваясь самыми простыми – ведь многие ошибки проявляются только при определенных значениях исходных данных, а иногда даже только при определенных сочетаниях этих значений. Во-вторых, для просмотра промежуточных и окончательных значений переменных можно на время отладки включать в тексты процедур обращения к процедуре MsgBox, а также выводить значения переменных в виде свойства Caption элемента управления Label (метка – статический текст) или в виде свойства Text элемента управления TextBox (поле с редактируемым текстом). Важную роль играет выбор точек процедуры для вывода значений переменных при отладке. Для выбора таких точек можно рекомендовать рассматривать процедуру состоящей из логически завершенных фрагментов программного кода, формирующих определенные «информационные сцены». Эти-то сцены, характеризующиеся содержимым переменных и массивов, и надо контролировать. Программа, созданная с помощью VBA (как и другого языка программирования), обычно сопровождается следующими типами ошибок: ошибки синтаксиса, сразу же делающие невозможным выполнение программы, логические ошибки, в результате которых программа делает то, что не запланировано, ошибки выполнения, приводящие к остановке программы. Строку программного кода, содержащую ошибку синтаксиса, редактор Visual Basic окрашивает красным цветом и в диалоговом окне дает некоторое разъяснение. К сожалению, логические ошибки не заявляют о себе изменением цвета. Эти ошибки не прерывают программы, но приводят к неверным результатам. Для их выявления необходим анализ алгоритма программы с привлечением средств отладки VBA (о них см.ниже). При этом полезно проведение тестов, которые должны учитывать все возможные случаи возникновения ошибок. Ошибки выполнения могут возникать, например: при считывании файла с диска, при разрыве соединения с базой данных, с сетевым сервером или страницей Internet, вследствии ошибок в логике программы, когда происходит деление на нуль и т.д. В программе следует создать средства перехвата возможной ошибки выполнения, обработать ее и продолжить программу. При этом программа должна анализировать вводимые и вычисляемые данные и делать сообщения на основании этого анализа, а также предоставить возможность ввода других данных. Приведем два примера. В первом примере перед чтением данных из текстового файла помещена инструкция 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) 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). Р ис. 3. Точка останова Кроме того, в режиме паузы можно воспользоваться командой меню в редакторе Visual Basic: Отладка/Шаг с заходом, продолжая при этом выполнение программы в пошаговом режиме, по одной инструкции, и наблюдая за изменениями переменных. Значения переменных можно наблюдать во всплывающих подсказках, если подвести курсор мыши к соответствующей переменной. В режим паузы можно войти, используя одну из возможностей: щелчок на кнопке Пауза на панели инструментов в редакторе Visual Basic, комбинация клавиш во время ошибки выполнения, когда VBA отображает диалоговое окно с описанием ошибки, щелчок по кнопке Отладка переводит программу в режим паузы, назначение точки останова строке программного кода (на рис.3 точка останова установлена щелчком мыши на полях в окне редактирования программного кода). Чтобы разместить нужное количество точек останова, щелкните на полях слева от строки программного кода. Нельзя размещать точки останова в строках с комментариями и в строках с невыполняемыми инструкциями, например, при объявлении переменных. После исправления ошибок точки останова можно удалить также щелчком на полях. Выход из режима паузы осуществляется щелчком по кнопке Продолжить, и программа продолжит свое выполнение дальше, или по кнопке Сброс, что остановит выполнение программы. В режиме паузы можно использовать еще одно средство отладки: окно локальных переменных. В окне локальных переменных (Рис. 4) автоматически отображаются имена, значения и типы данных всех переменных, доступных в выполняемой в данный момент процедуре. Эта информация обновляется редактором Visual Basic по мере выполнения программы, так что в окне локальных переменных всегда видны текущие значения. Информация в окне локальных переменных представлена в виде разделов, обозначенных значком [+], чтобы развернуть раздел нужно щелкнуть по плюсу. В результате этого можно получить доступ ко всем переменным и приступить к их редактированию, что удобно, например, в таких случаях: Проверка программы при разных значениях переменной, тестирование. Предыдущая строка программного кода содержит ошибку, в результате которой переменной присвоено неверное значение. Для продолжения выполнения программы можно исправить значение переменной. Чтобы изменить значение переменной, щелкните два раза на текущем значении переменной, измените значение и нажмите Следующее средство отладки - окно контрольного значения, которое показывает значения выражений или переменных, выбранных пользователем (рис. 4.). Как и в окне локальных переменных, в окне контрольного значения можно менять значение выражения прямо во время выполнения программы. Для этого сначала выделите строку с нужным выражением, а затем само выражение. После этого можно вносить изменения в окне контрольного значения, которое можно вызвать по команде Отладка/Контрольное значение. |