Опубликован: 21.02.2012 | Уровень: специалист | Доступ: платный
Лекция 7:

Интегрированная среда разработки VBA

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

Переменные и операторы

Наиболее употребительными в языке VBA являются следующие элементы: переменные, константы, функции, ключевые слова и операторы.

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

Set cir = ThisDrawing.ModelSpace.AddCircle(dCenter, dRadius)

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

  • для хранения переменной используется меньший объем памяти;
  • после явного объявления переменной редактор проверяет написание ее имени при дальнейшем наборе кода.

При объявлении переменных можно задавать область их доступности:

  • Public dCenter As Double - открытые переменные. С ними могут работать все процедуры проекта;
  • Dim dRadius1 As Double или Private dRadius2 As Double - переменные уровня модуля, доступны всем процедурам модуля. Их объявление начинается со слова Dim или Private;
  • Radius3 = 5 - переменные уровня процедуры, могут использоваться только в теле процедуры, если они объявлены до использования.

Выражение Option Explicit (Явное объявление), помещенное в разделе объявлений, требует явного объявления всех переменных. В противном случае будет выведено сообщение об ошибке.

В таблице описаны типы переменных VBA:

Тип Описание
Boolean Принимает только два значения: TRUE или FALSE
Byte Положительное целое число от 0 до 255
Integer Целое число от -32768 до 32767
Long Целое число от -2147483648 до 2147483648
Currency Дробное число для хранения денежных значений, требующих точности в несколько знаков после запятой
Single Числа с плавающей точкой одинарной точности. Используют меньше памяти, чем числа с двойной точностью, но имеют меньший диапазон значений
Double Числа с плавающей точкой двойной точности. Обычно используется для хранения координат
Date Дата и время в формате десятичного действительного числа. Число слева от десятичной точки - дата, справа - время
String Текстовая строка, содержащая буквы, цифры, пробелы, знаки препинания
Object Объект приложения, чертеж или объект чертежа
Variant Универсальная переменная, способная содержать значение любого типа. Если не указан явно тип переменной, то ей присваивается тип Variant

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

Функции VBA часто похожи на функции других языков программирования. Например, date возвращает текущую системную дату.

Ключевые слова используются в составе выражений VBA. Например, Set.

Оператор (Statement) - основная единица программного кода, содержащая законченную инструкцию. Существует три вида операторов:

  • операторы объявления имен переменных, констант или процедур: Dim dCenter As Double;
  • операторы присвоения значения переменным dCenter = 0#
  • исполняемые операторы, заставляющие компьютер выполнить определенные действия: Set MyTorus = ThisDrawing.ModelSpace. AddTorus _ (dCenter, dRadius1, dRadius2)

Операторы формируют все действия в процедуре. В частности, они осуществляют все арифметические операции (+ - * / ^), конкатенацию текстовых строк (& ), логические операции (and, not,or).

Условные операторы изменяют последовательность выполнения операций (For Each…Next, If…Then…Else).

Полный список терминов VBA можно получить в редакторе VBA с помощью команды: Help - Microsoft Visual Basic Help - Contents - Visual Basic Language Reference.

Одной из задач программирования является организация интерактивности, т.е. возможности получения программой информации от пользователя. Это можно сделать двумя способами - из командной строки и через диалоговое окно.

Пример.

Рассмотрим обращение к объекту Utility. Он принадлежит объекту Document и управляет методами получения информации от пользователя.

Dim iReturn as Integer
iReturn = ThisDrawing.Utility.GetInteger ("Введите целое число: ")

Здесь переменной iReturn присваивается целое число, введенное пользователем в командную строку. Такой метод применяется для ввода коротких и простых данных: чисел, текста или объекта. Чтобы избежать появления нескольких приглашений в одной строке, используют константу vbCrLf в начале приглашения:

Prompt1 = vbCrLf & "Задайте центральную точку: "
Пример
Sub AddCircle ()
Dim vPt As Variant
Dim dRadius As Double
Dim myCircle As AcadCircle
vPt = ThisDrawing.Utility.GetPoint (, vbCrLf & "Введите точку центра: ")
dRadius = ThisDrawing.Utility.GetReal ("Введите радиус: ")
Set myCircle = ThisDrawing.ModelSpace.AddCircle (vPt, dRadius)
End Sub

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

Метод Синтаксис Описание
GetEntity Объект. GetEntity (объект, указанная точка, приглашение) Пользователь указывает объект. Метод возвращает объект и указанную точку. Пример: ThisDrawing.Utility. GetEntity(getObj,basePnt, "Выделите объект")
GetInteger Возвращаемое значение = GetInteger (Приглашение) Допустимо любое целое число в диапазоне от -32768 до 32767. Пример: getInt = ThisDrawing.Utility.GetInteger ("Введите целое число")
GetPoint Возвращаемое значение = GetPoint (точка, приглашение) Возвращает значение типа variant (оно содержит трехэлементный массив чисел типа double). Пользователь может указать точку или ввести ее координаты. Если имеется необязательный параметр точка, то AutoCAD прорисовывает "резиновую линию" от заданной точки до текущей позиции указателя. Пример: getPnt = ThisDrawing.Utility. GetPoint (, "Задайте точку: ")
GetReal Возвращаемое значение = GetReal (Приглашение) Получает вещественное (положительное или отрицательное число). Пример: GetReal = ThisDrawing.Utility.GetReal ("Введите вещественное число")
GetString Возвращаемое значение = GetString (содержит_пробелы, приглашение) Получение строки. Булев параметр содержит_пробел определяет, может ли получаемая строка содержать пробелы. Если параметр равен TRUE, то строка может содержать пробелы, а пользователь должен нажать ENTER для окончания ввода. Если значение параметра равно FALSE, то сигналом окончания ввода может служить не только нажатие ENTER, но знак пробела

Задание 7.2

Создать процедуру, получающую информацию от пользователя

  1. Создайте новый чертеж. Выберите команду Tools - Macro - VBA Manager. Щелкните по кнопке NEW, а затем по кнопке Visual Basic Editor.
  2. Выберите команду Insert - Module, а затем Insert - Procedure. Наберите в модуле следующий текст:

    Public Sub HappyFace()
    Dim prompt As String, prompt2 As String: Dim cen As Variant: Dim rad As Double
    Dim cir As AcadCircle: Dim arc As AcadArc: Dim pi As Double
    Dim dStart As Double 'начальный угол
    Dim dEnd As Double 'конечный угол
    pi = 3.1415
    prompt = vbCrLf & "Задайте центральную точку: "
    prompt2 = vbCrLf & "Задайте радиус: "
    'получение центральной точки и радиуса от пользователя
    cen = ThisDrawing.Utility.GetPoint(, prompt)
    rad = ThisDrawing.Utility.GetDistance(cen, prompt2)
    Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad)
    
    'рисуем улыбку
    dStart = 225 * pi / 180 'pi/180 - перевод в радианы
    dEnd = 315 * pi / 180
    Set arc = ThisDrawing.ModelSpace.AddArc(cen, rad / 2, dStart, dEnd)
    
    'рисуем глаза
    cen(0) = cen(0) - rad / 4:cen(1) = cen(1) + rad / 4
    Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad / 8)
    cen(0) = cen(0) + rad / 2
    Set cir = ThisDrawing.ModelSpace.AddCircle(cen, rad / 8)
    End Sub
    

Сохраните проект как HappyFace.dvb в папке AutoCAD2007\Support. Вернитесь к чертежу и выберите команду Tools - Macro - Macros. В диалоговом окне выберите процедуру HappyFace и щелкните по кнопке Run. Ответьте на приглашения.

В основе приведенного примера лежит функция GetDistance. Благодаря ей пользователь может задать радиус с помощью мыши. Указанная ранее точка центра будет использована функцией GetDistance в качестве опорной. Кроме того, процедура выполняет преобразование градусов в радианы. Поэтому расположение глаз и губ будет соотноситься и с центром, и с радиусом.

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

  1. Перейдите в редакторе в процедуру, где предполагается наличие ошибки.
  2. Поместите курсор в первую выполняемую строку и нажмите F9 или выберите команду Debug - Toggle Breakpoint. В строку будет добавлена точка прерывания.
  3. Выполните операторы по одному, нажимая клавишу F8. На каждом шаге просматривайте значения переменных. При помещении указателя мыши на переменные типов Integer, Double, и String в подсказке выводится их текущее значение.
  4. Когда ошибка обнаружена, выберите команду Run - Reset и внесите исправления в код. При следующем запуске процедуры точка прерывания останется активной. Отключить ее можно нажатием клавиши F9. Нормальный запуск процедуры можно осуществить командой Run Sub, либо нажатием клавиши F5.
  5. Если программа зависает в редакторе Visual Basic, то выйдите в окно AutoCAD и прервите выполнение команды нажатием клавиши ESC.

Упражнения

Пусть при открытии нового документа выполняется VBA-файл инициализации. Для этого нужно создать dvb-проект и сохранить его в своей папке. Автоматически загрузить проект в открывающийся чертеж можно несколькими способами:

  • разместить проект в файле acad.dvb и поместить в одном из маршрутов файлов поддержки;
  • добавить в один из файлов acad.lsp, acaddoc.lsp, acad.mnl команду загрузки

    (command "_vbaload" "MyAppication")
    (vl-vbaload "MyAppication")
    

Для запуска процедуры следует добавить команду запуска процедуры

(command "_vbarun" "Модуль.Имя процедуры")

Выполните следующие действия:

  1. В новом чертеже по команде Tools - Macro - VBA manager выгрузите все проекты.
  2. Откройте редактор Visual Basic и вставьте модуль по команде Insert - Module.
  3. Наберите в модуле процедуру HappyFace с предыдущей страницы.
  4. Щелчком по кнопке Save cохраните файл как c:\Program Files\AutoCAD 2010\Support\acad.dvb.
  5. Проверьте, существует ли в этой папке файл acaddoc.lsp. Если такой файл есть, то откройте его в редакторе Visual LISP и добавьте строку

    (command "_vbarun" "HappyFace")
    

Если файла acaddoc.lsp нет, то создайте его в редакторе Visul LISP.

  • В программе AutoCAD щелчком по кнопке QNEW откройте новый документ. Процедура запустится автоматически и Вы сможете нарисовать Happy Face.

Ключевые термины

Проект - набор объектов, программных модулей, модулей классов и форм.

Объектно-ориентированное программирование - программирование, основанное на работе с объектами. Характеризуется механизмами инкапсуляции, полиморфизма и наследования.

Класс - это проект, на основе которого будет впоследствии создан конкретный объект.

Объект - логическое целое, включающее в себя данные и код для работы с данными. Характеризуется свойствами, методами и событиями.

Семейство - объект, содержащий несколько других объектов одного и того же типа.

Свойства - атрибуты объекта, определяющие его характеристики (например, размер, цвет, положение и пр.) и состояние (например, доступность, видимость и пр.).

Методы - действия, выполняемые над объектом.

События - действия пользователя (click) или программы (load), распознаваемые объектом. В качестве отклика на событие выполняется код созданной пользователем процедуры обработки события.

Краткие итоги

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

Вопросы

  1. Что такое объект, его свойства и методы?
  2. Почему VBA называется объектно-ориентированным языком?
  3. В чем смысл иерархической структуры объектов AutoCAD?
  4. Какие типы переменных определены в языке VBA?
  5. Какова структура процедуры на языке VBA?
  6. Назовите методы, применяемые для получения данных от пользователя.
< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Алексей Тимонин
Алексей Тимонин
Алексей Потапкин
Алексей Потапкин

Здравствуйте.

Подскажите, пожалуйста, каким образом можно передать параметры в макрос написанный в Autocad на VBA? Например, есть процедура, которая отрисовывает заштрихованный прямоугольник (см. ниже). Как её изменить, чтобы на входе от пользователя требовалось ввести также в качестве параметров координаты углов прямоугольника?

Public Sub DrawHatchedBox()

...

End Sub

Сергей Ивков
Сергей Ивков
Россия, Геленджик
Юлия Мягчилова
Юлия Мягчилова
Россия