|
Создание переменных. Типы переменныхТип переменной определяет, каким образом биты данных, предоставляющие ее значение, хранятся в памяти компьютера, а также какой тип данных можно хранить в этой переменной. Самый простой способ создать переменную – это просто упомянуть ее в выражении. Например: MyVar = 15 Такое объявление называется неявным и по умолчанию ей присваивается тип Variant. Однако во избежание ошибок в написании программы, а также, для того чтобы программы работали быстрее следует применять явное объявление переменных. Самый простой способ задать явно переменную выглядит так: Dim MyVar В общем виде: Dim имя1, имя2, имя3 Переменные имеют тип Variant. Существуют и другие типы данных. Вот их основная характеристика.
Для того чтобы объявить тип переменной в конструкции Dim, надо вслед за именем переменной добавить ключевое слово As и указать тип переменной. Dim имя As тип Например Dim intFile As Integer Dim strFileName As String Dim Array_Size As Long Dim X, Y, P, Z As Variant Dim F, N, J, m, S As Integer Можно присвоить числовой переменной значение строковой переменной, если строка представляет числовое значение, и наоборот, строковой переменной присвоить числовое значение. Например: Sub Primer2 () Dim intX as Double Dim strY as String strY=”100,23” intX=Cos(strY) msgBox intX end Sub можно запретить VBA обрабатывать переменные заданные неявно, для этого надо задать директиву Option Explicit до начала написания процедуры или функции.
9.3. Понятие об объектах
Под объектами следует понимать, например: диаграммы, рабочие листы, диапазоны ячеек MS Excel, таблицы MS Access, документы Word, рабочие чертежи AutoCAD и др. С помощью языка VBA можно управлять приложением, влияя на объекты этого приложения из программы. Свойства объекта можно использовать только двумя способами: прочитать его значение или записать (установить) его значение. В общем виде синтаксис для определения свойства выглядит следующим образом: Object.property Где Object представляет собой любую допустимую ссылку на объект, а property – любое допустимое имя свойства для объекта, на которое имеется ссылка. Для того чтобы присвоить значение свойства некоторой переменной, следует использовать такой синтаксис: Variable = Object.Property Где Variable – любая переменная, тип которой совместим с типом свойства объекта. В следующем примере переменной AnyStr присваивается строка, принадлежащая свойству Name, на которую ссылается переменная объекта aSheet рабочего листа Excel. AnyStr = aSheet.Name Для того чтобы установить свойства объекта, нужно просто присвоить свойству новое значение, используя такой синтаксис object.Property = Expression Где Expression – любое выражение VBA, которое имеет тип данных, совместимый с типом свойства объекта. Например, чтобы изменить имя рабочего листа MS Excel, ссылающего на объект, с помощью переменной aSheet. Свойству Name присваивается значение aSheet.Name = "Кадастровые номера".
В общем виде синтаксис для метода объекта выглядит следующим образом: Object.Metod Для методов с обязательными и необязательными аргументами используется следующий синтаксис: Object.Metod аргумент1, аргумент2, … Например, чтобы сохранить активную рабочую книгу MS Excel запишем: ActiveWorkbook.SaveAs Filename: = "С:\Мои документы\Кадастровые_номера.xls", FileFormat: = xlNormal.
Посредством инструкции Dim можно объявить любую переменную, которая будет содержать ссылку на любой объект VBA или приложения. Общий синтаксис таков: Dim xlApp As Excel.Application Dim doсWord As Word.Application Dim objApp As Acad.Application 9.3.4. Использование объектов в выражениях Перед тем как передать объектной переменной ссылку на нужный объект, необходимо установить эту переменную. Для того чтобы присвоить объектной переменной ссылку на объект, следует ввести ключевое слово Set. Set Var = Object Где Var – любая объектная переменная. Object – любая допустимая ссылка или объектное выражение. Например, установим переменной aSheet ссылку на активный рабочий лист рабочей книги MS Excel Dim aSheet As Worksheet Set aSheet = Applicstion.AktiveSheet Другой пример. Установим переменной objApp ссылку на приложение AutoCAD, а переменной objDos ссылку на рабочий чертеж приложения AutoCad. Dim objApp As AcadApplication Dim objDos As AcadDocument Set objApp = GetObject (, “AutoCAD.Application") Set objDoс = objApp. ActiveDocument
If condition Then statement If condition Then Statement End If Где condition – некоторое логическое выражение, а statement – одна или несколько инструкций. Например: If temperature > 100 Then MsBox "Очень жарко" Вторая конструкция называется блоком. Пример: If temperature > 100 Then MsgBox "Очень жарко" MsgBox "Уменьшите температуру" End If
Аналогично If …Then инструкция If …Then …Else имеет две формы: однострочную и блоковую. Общий синтаксис таков: If condition Then statement Else elsestatement Пример If temperature > 100 Then MsgBox "Слишком жарко" Else MsgBox_"Прохладно" If condition Then Statement Else Elsestatement End If Пример If temperature > 100 Then MsgBox "Слишком жарко" Else MsgBox "Прохладно" End If
В VBA предусмотрена также упрощенная версия инструкции If …Then …Else, которая может быть использована как упрощенный эквивалент вложенных инструкций If …Then …Else. Общий синтаксис таков: If condition1 Then Statements Elself condition2 ElseStatement [Else ElseStatement] End If Например If temperature > 100 Then MsfBox "Слишком жарко" Elself temperature > 50 Then MsgBox "Нормально" Else MsgBox "Холодно" End If
В Visual Basic конструкция Select Case является альтернативной конструкции If …Then …Else в случаях выполнения блока, состоящего из большого набора операторов. Она делает код программы более удобным и понятным. Общий синтаксис таков: Select Case TestExpression Case ExpressionList1 Statement1 Case ExpressionList2 Statement2 . . . case ExpressionListN statementsN [Case Else ElseStatement] End Select Здесь TestExpression – некоторое числовое или символьное выражение, обычно переменная, ExpressionList1, ExpressionList2, ExpressionListN представляют список логических выражений, каждое выражение в списке должно быть отделено запятыми, Statements1, Statements2, StatementsN – представляет собой одно или несколько инструкций VBA. Приведем пример программы, которая вычисляет румб угла по заданному дирекционному направлению. 1: Sub DirAngle () 2: Dim Angle As Double 3: Dim Grad As Integer 4: Dim Min As Integer 5: Dim Sec As Integer 6: Dim Deg As Double 7: On Error GoTo Line 8: Angle = InputBox ("Введите значение дирекционного угла в формате_(DD.MMSS):", "Ввод данных") 9: Grad = Int(Angle) 10: Min = Int((Angle - Grad)*100) 11: Sec = Round(((Angle - Grad)*100 - Min)*100) 12: Deg = Grad + Min / 60 + Sec / 3600 13: Select Case Deg 14: Case 0 To 90 15: MsgBox CB:" &Angle” 16: Case 90 To 180 17: MsgBox ЮВ:" & 179 - Grad &"." & 60 - Min & 60 – Sec” 18: Case 180 To 270 19: MsgBox ЮЗ:" & 180 + Angle” 20: Case 270 To 360 21: MsgBox СЗ:" & 359 - Grad &"." & 60 - Min & 60 – Sec” 22: Case Else 23: MsgBox "Ошибка! Введите угол от 0 до 360 градусов" 24: End Select 25: Line: 26: End Sub в строке 1 задается имя макроса. В строках 2 – 6 определен список используемых переменных. В строке 7 содержится инструкция On Error. Это оператор, перехватывающий ошибки. Оператор On Error передает управление программе обработки ошибок. В случае если пользователь ввел некорректные данные, например строку, либо нажал кнопу Cancel (отмена), программа передает управление оператору Go To после которого следует метка (Line). Программа ищет эту метку в тексте кода и начинает выполнение инструкций после нее (строка 25). В 8 строке вызывается встроенная функция InputBox, куда пользователь заносит значение угла в формате DD.MMSS. В строке 9 вызывается встроенная в VBA функция Cint() которая отбрасывает дробную часть от переменной Angle и получаем значение градусов. В строке 12 значения градусов минут и секунд переводим в десятичные доли градуса. Строи 12 – 24 содержат инструкции Select Case TestExpression. Строка 13 состоит из простой переменной Deg. Значение этой переменной сравнивается с условием каждой ветви Case инструкции Select Case. Строки 15, 17, 19, 21, 23 содержат функцию MsgBox для вывода значения румба на экран. Знак амперсанта (&) используется для соединения строк в одно целое.
Циклы позволяют выполнить одну или несколько строк кода несколько раз. Visual Basic поддерживает следующие циклы: 1. Do … Loop 2. For … Next 3. For Each … Next
Цикл Do … Loop применяется для выполнения блока операторов неограниченное число раз. Существует несколько разновидностей конструкции Do … Loop. Do While condition Statements Loop Выполняя этот цикл VBA сначала проверяется условие. Если условие ложно,он пропускает операторы тела цикла. Если условие истинно, VBA выполняет операторы тела цикла, затем возвращается в начало цикла и вновь проверяет условие. Приведем пример программы, которая считает введенные пользователем нечетные числа и прекращает работу, когда число нечетных чисел достигает 10. 1: Sub Count_OddNums() 2: Conts ocTitle = "Подсчет нечетных чисел" 3: Dim OddCount As Integer 4: Dim OddStr As String 5: Dim num 6: OddStr = "” 7: OddCount = 0 8: Do While OddCount < 10 9: num = InputBox("Введите число:", ocTitle) 10: If (num Mod 2) <> 0 Then 11 OddCount = OddCount + 1 12: OddStr = OddStr & num & " “ 13: End If 14: Loop 15: MsgBox prompt:="Вы ввели такие нечетные числа: & & Chr(13) & _OddStr, Title:=ocTitle 16: End Sub В строке 1 объявлено имя макроса. В строке 2 объявлена константа ocTitle. Константа – это такая величина в VBA – программе, которая никогда не меняется. Константы применяются, для того чтобы код программы был более понятным. Например, для геометрических расчетов удобнее, если в тексте встречается поименованная константа Pi, чем число 3,1415. Const Pi = 3,14 Кроме того, использование констант облегчает модернизацию программ. В строках 3 – 5 описаны переменные используемые программой. В строках 6 – 7 значение строки для отображения нечетных числе и счетчик нечетных чисел инициализированы начальными значениями. В строке 8 начинается цикл Do. Так как счетчик нечетных числе инициализирован нулем тело цикла будет выполнятся. В строке 9 пользователь вводит число. В 10 строке начинает работать инструкция If … Then, которая проверяет, какое число, ввел пользователь (четное или нечетное). В скобках оператором Mod начинается деление по модулю на число 2 и возвращается остаток от деления. Если он неравен 0, то значит, введенное число было нечетным и оно записывается в строку OddStr (строка 12). Значение счетчика увеличивается на 1. В строке 15 результат выводится на экран. Функция Chr(13) - означает перевод курсора на новую строку. Другая разновидность конструкции Do … Loop сначала выполняет операторы тела цикла, а затем проверяет условие после каждого выполнения. Общий синтаксис таков: Do Statements Loop While condition В качестве примера приведем эту же программу. Результат ее выполнения такой: Sub Count_OddNums() Conts ocTitle = "Подсчет нечетных числе" Dim OddCount As Integer Dim OddStr As String Dim num OddStr = "” OddCount = 0 Do Num = InputBox("Введите число:", ocTitle) If num Mod 2) <> 0 Then OddCount = OddCount + 1 OddStr = OddStr & num & End If Loop While OddCount < 10 MsgBox prompt:= "Вы ввели такие нечетные числа:" & Chr(13) &_OddStr, Title:=ocTitle End Sub Другие разновидности конструкции цикла аналогичны предыдущим, за исключением того, что цикл выполняется пока условие ложно. Цикл не выполняется вообще или выполняется много раз: Операторы Loop Цикл выполняется, по крайней мере, 1 раз: Do Операторы Loop Until условие Приведем пример программы подсчитывающий сумму углов в замкнутом полигоне и вычисляющей его невязку. Результат выводится в десятичных долях градусов. Цикл Do выполняется до тех пор, пока пользователь не нажмет клавишу Enter, оставив поле ввода пустым, либо клавишу Cancel. В отличие от двух предыдущих циклов условие Until Angle = "” можно ставить лишь в конце цикла, так как первоначально переменная Angle не содержит никаких данных и тело цикла не выполняется ни разу. Впрочем, это ограничение моно обойти, если до начала цикла Do проинициализировать переменную Angle нулем. Sub Poligon () Dim Grad As Integer Dim Min As Integer Dim Sec As Integer Dim Deg As Double Dim Summ As Double Dim Count As Integer Count = 0 Sum = 0 Do On Error GoTo Line Angle =InputBox("Введите внутренний угол","Ввод данных") Grad = Int(Angle) Min = Int(Angle - Grad)*100) Sec = Round(((Angle - Grad)*100 - Min)*100) Deg = Grad + Min / 60 + Sec / 3600 Sum = Summ + Deg Count = Count + 1 Loop Until Angle = "” Line MsgBox "Сумма углов измеренных:" & Summ & Chr(13) &_ "Сумма углов теоретических:" & 180 * (Count - 2) &Chr(13) &_ "Невязка:" & Summ - 180 *(Count - 2) End Sub 9.5.2. Конструкция For … Next Циклы For … Next хорошо работают, когда заранее известно число повторений цикла. В данном цикле присутствует переменная, называемая счетчиком цикла, которая увеличивается или уменьшается на заданную величину при каждом повторении цикла. Общий синтаксис таков: For counter = start To end [Dtep increment] Statements Next [counter] Где counter представляет собой любую числовую переменную обычно с типом Integer или Long. Start определяется любым числовым выражением и определяет начальное значение переменной counter. End - конечное значение переменной counter. По умолчанию VBA каждый раз после завершения инструкций из цикла увеличивает переменную counter на 1. Другое значение увеличения (или уменьшения) можно задать с помощью необязательного ключевого слова Step. После него необходимо указать величину шага increment. Ключевое слово Next сигнализирует о том, что достигнут конец цикла. Sub Poligon() Const Title = "Ввод данных" Dim Grad As Integer Dim Min As Integer Dim Sec As Integer Dim Deg As Double Dim Summ As Double Sum = 0 Angle = 0 On Error GoTo Line Num = InputBox("Введите число углов полигона:", Title) For I = 1 To num On Eror GoTo Line Angle = InputBox("Введите внутренний угол", Title) Grad = Int(Angle) Min = Int((Angle - Gad) * 100) Sec = Round(((Angle - Gad) * 100 - Min) * 100) Deg = Grad + Min / 60 + Sec / 3600 Sum = sum + Deg Next I MsgBox "Сумма углов измеренных:" & Summ & Chr(13) &_ "Сумма углов теоретических:" & 180 * (num - 2) & Chr(13) &_ "Невязка" & Summ - 180 * (num - 2) Line MsgBox "Ошибка ввода данных" End Sub
9.5.3. Конструкция For Each…Next Цикл For Each…Nex t похож на цикл For … Next, но он повторяет группу операторов для каждого элемента из набора объектов или из массива вместо повторения операторов заданное число раз. Он особенно полезен, когда неизвестно, сколько элементов содержится в массиве. Синтаксис конструкции цикла For Each…Next таков: For Each element In group Операторы Next Element В следующем примере - функция SheetExists, которая использует цикл For Each…Next, чтобы определить существует ли указанный лист в книге Excel. 1: Function SheetExists(sName As String) As Boolean 2: Dim aSheet As Object 3: SheetExists = False 4: For Each aSheet In ActiveWorkbook.Sheets 5: If (StrComp(aSheet.Name, sName, vb TextCompare) = 0) Then 6: SheetExists = True 7: End If 8: Next aSheet 9: End Function 10: Sub Test_SheetExists() 11: Dim uStr As String 12: uStr = InputBox(«Какой лист вы хотите найти в текущей книге») 13: If SheetExists(uStr) Then 14: MsgBox «Лист» & uStr & «найден в текущей книге.» 15: Else 16: MsgBox «В текущей книге листа» & uStr & «нет» 17: End If 18: End Sub Функция SheenExists имеет тип Boolean, т.е. возвращает True (истина) если рабочий лист с нужным пользователю именем существует и False (ложь) если его нет. В строке 3 назначим функции значение False, на случай если листа не окажется. В строке 4 начинается цикл. В нем группой является коллекция ActiveWorkbook.Sheets. То есть перебираются все листы (Sheets) в активной рабочей книге (ActiveWorkbook). В строке 5 идет сравнение (текстовое) найденного листа с именем листа введенного пользователем. Если условие выполняется, то функция возвращает значение True.
Массивы Массивы (arrays) позволяют ссылаться на ряд переменных с помощью имени и числа, называемого индексом массива (index). Часто это позволяет создавать более короткий или простой код, т.е. позволяет применять циклы. Visual Basic создавать два вида массивов: массив фиксированного размера (fixed – size array), размер которого не изменяется, и динамический массив (dynamic array), размер которого может изменятся во время выполнения программы. Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычислить, когда этот... ЧТО ТАКОЕ УВЕРЕННОЕ ПОВЕДЕНИЕ В МЕЖЛИЧНОСТНЫХ ОТНОШЕНИЯХ? Исторически существует три основных модели различий, существующих между... Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|