РАЗРАБОТКА ПРИЛОЖЕНИЙ С ПОМОЩЬЮ VBA
Далее последует краткий обзор по созданию диалоговых окон, обработке ошибок, управлению фокусом окон и созданию дистрибутивов.Для отображения и скрытия формы используются методы
Show и Hide
Все формы в VBA модальные, то есть пока их не закроешь невозможно что-либо править в чертеже. Когда форма скрыта уже возможно кое-что править. Форму можно загрузить, но сразу не отображать. С целью освобождения памяти ненужные формы можно выгружать методомPublic Sub MyApplication() UserForm1.Show UserForm1.Hide End Sub
Unload
.
Все диалоговые окна в VBA также модальны, то есть если применяешь диалоговое окно в котором от пользователя ожидается выбор элементов на рисунке путем их указания следует сначала скрыть окно диалога, а по окончании выбора - показать.
Из трех типов ошибок (периода компиляции, логических и периода выполнения) обработать программным путем в полной мере можно только последние. Их следует отслеживать в местах наиболее вероятного появления и обрабатывать. Обработчик по-умолчанию только отображает окно с кодом ошибки и предлагает либо перейти в отладчик либо завершить выполнение программы. Обычно обработчики ошибок ставятся в тех местах где ожидается ввод от пользователя или файловый ввод-вывод. Для обработки ошибок в VBA используется операторOn Error
который имеет три формы:Первый позволяет просто игнорировать ошибку и продолжать выполнение со следующего операторы за вызвавшим ошибку, не отображая сообщения об ошибке. Это удобно, например, при смене цвета путем циклического перебора всех объектов, если при этом программа натолкнется на элемент, находящийся на заблокированном слое, то просто игнорирует ошибку
- On Error Resume Next
- On Error Goto Label
- On Error Goto 0
Вариант сSub ColorEntities() Dim entry As Object On Error Resume Next For Each entry In ThisDrawing.ModelSpace entry.Color = acRed Next entry End Sub
On Error GoTo Label
используется если нужно написать особый обработчик ошибки.Вариант сSub ColorEntities2() Dim entry As Object On Error GoTo MyErrorHandler For Each entry In ThisDrawing.ModelSpace entry.Color = acRed Next entry ' Важно! Выйти из программы чтобы не нарваться на обработчик ошибок Exit Sub MyErrorHandler: Msgbox entry.EntityName + " на блокированном слое." + " хэндл: " + entry.Handle Resume Next End Sub
On Error GoTo 0
отменяет текущий обработчик ошибок. Обработка ошибок завершается окончанием процедуры обработчика, новым обработчиком ошибок или переходом по "нулевой" метке.
ОбъектErr
обладает следующими свойствамиNumber, Description, Source, HelpFile, HelpContext, и LastDLLError.
наиболее важны из которых первые три (код ошибки, ее описание и источник). Использование методаInitializeUserInput
перед получением ввода от пользователя ограничивает количество возможных ошибок.Зашифровать и защитить паролем программу на VBA возможно через Tools=>Project>Properties=>Protection
Чтобы запустить макрос VBA из командной строки
-VBARUN Filename.dvb!projectname.macroname
. При этом указывать имя файла проекта нужно только в случае если он еще не загружен в текущем сеансе.Автозагрузка проекта на VBA возможна двумя способами:
В следующем примере используется файл автозагрузки autolisp для запуска VBA и запуска проекта myproj.dvb. Эти строчки нужно добавить в acad.lsp
- При загрузке Autocad просматривает каталог откуда он запущен на предмет наличия файла
acad.dvb
который и выполняется если найден.- Любой другой проект можно включить в автозагрузку посредством команды
VBALOAD
.Для автоматического выполнения макроса из acad.dvb можно сделать так(defun S::STARTUP() (command "_VBALOAD" "myproj.dvb") )
Также при загрузке VBA автовыполняется макрос с именем AcadStartup(defun S::STARTUP() (command "_VBARUN" "drawline") )
Работа с VBA когда не открыт ни один документ
- Объект
ThisDrawing
в данный момент не определен, поэтому любое обращение к нему вызовет ошибку- Также неопределены все документозависимые объекты, но доступны, например объекты
Application или MenuBar
- Отсутствует командная строка
Распространение программ
Возможно два варианта - внедрение в файл чертежа или отдельным файлом. В отдельном файле удобно хранить общие процедуры.ВЗАИМОДЕЙСТВИЕ С ДРУГИМИ ПРИЛОЖЕНИЯМИ, БАЗАМИ ДАННЫХ И WINDOWS API
Для взаимодействия с другими приложениями через ActiveX нужно выполнить три основных операции:Чтобы сделать ссылку на объектную библиотеку другого приложения нужно в меню Tools-References указать нужное, после чего в окне просмотрщика объектов будут доступны объекты другого приложения. Чтобы создать экземпляр приложения, например Excel, объявляется переменная-ссылка
- Установить ссылку на другое приложение
- Создать экземпляр этого приложения
- Собственно писать программу, использующую методы и свойства приложения
Dim ExcelAppObj as Excel.Application
и устанавливается указательSet ExcelAppObj = New Excel.Application
. По окончании работы неплохо закрывать запущенный экземпляр приложенияExcelAppObj.Application.Quit
. Пример переноса атрибутов из Autocad в Excel:Sub Extract() Dim Excel As Excel.Application Dim ExcelSheet As Object Dim ExcelWorkbook As Object Dim RowNum As Integer,Header As Boolean Dim elem As AcadEntity,Array1 As Variant Dim Count As Integer ' Запуск Excel. Set Excel = New Excel.Application ' Создаем книгу Excel и ищем активный лист Set ExcelWorkbook = Excel.Workbooks.Add Set ExcelSheet = Excel.ActiveSheet ExcelWorkbook.SaveAs "Attribute.xls" RowNum = 1 Header = False ' Проходим по пространству модели в поисках блочных ссылок For Each elem In ThisDrawing.ModelSpace With elem ' Если найдена блочная ссылка проверить атрибутоы If StrComp(.EntityName, "AcDbBlockReference", 1) = 0 Then If .HasAttributes Then ' Читаем атрибуты Array1 = .GetAttributes ' Копируем их в Excel For Count = LBound(Array1) To UBound(Array1) If Header = False Then If StrComp(Array1(Count).EntityName, "AcDbAttribute", 1) = 0 Then ExcelSheet.Cells(RowNum, Count + 1).value = Array1(Count).TagString End If End If Next Count RowNum = RowNum + 1 For Count = LBound(Array1) To UBound(Array1) ExcelSheet.Cells(RowNum, Count + 1).value = Array1(Count).textString Next Count Header = True End If End If End With Next elem Excel.Application.Quit End Sub
Работа с DAO (Data Access Object) для доступа к базам данным
С помощью DAO можно работать с любой базой данных поддерживающие интерфейс Microsoft Jet, (Access, dBase, FoxPro, Paradox, а также базами данных ODBC MS SQL Server и Oracle). Возможности следующие: создание БД, изменение структуры, добавление таблиц, определение связей между ними, создание и выполнение запросов, добавление, изменение или удаление записей. Для всего это нужно выполнить три основных шага: 1. Создать ссылку на объектную библиотеку MS DAO 2. Открыть базу данных 3. Написать код используя объектные модели Autocad и DAO.
Для выполнения первого из этих шагов следует в среде VBA IDE выбрать пункт меню Tools->References и поставить галочку против Microsoft DAO Object Library. После чего все объекты, методы и свойства DAO станут доступными для просмотра в "просмотрщике" объектов. Причем установленная ссылка действует только для текущего проекта (чтобы не было лишних тормозов) Второй шаг (открытие базы данных) можно выполнить так:Наиболее важным и часто используемым объектом в DAO является объектDim db As Database Set db = DBEngine.Workspaces(0).OpenDatabase("C:\TEST.MDB")
RecordSet
представляющий набор записей возвращаемых таблицей на основе запроса SQL. Вообще по этому поводу не лишне ознакомиться со справочной системой Microsoft Access.Доступ к Windows API из VBA
Функции Windows API доступны для любых приложений и позволяют реализовать все возможности программирования под Windows. Чтобы этим воспользоваться следует сначала объявить функцию Windows API, с помощью оператораDeclare
который в качестве параметров требует указания имени динамической библиотеки (DLL) содержащей нужную функцию, имени процедуры как она называется в DLL, имени процедуры как она будет называться в вашей программе, параметров процедуры которые она ожидает, типа возвращаемых данных если процедура вызывается как функция.
ОператорDeclare
можно поместить в любое место программы, так если его поместить в стандартном модуле - процедура будет доступна для любого модуля программы, если конечно не ограничить диапазон ее действия ключевым словомPrivate
. Если объявить процедуру в модуле формы или класса, то она только там и будет доступна. Использование оператораDeclare
довольно сложно и требует хороших знаний от программиста, т.к. очень легко ошибиться, что может привести к тяжелым последствиям. Для облегчения данного процесса Microsoft создала специальные файлы в которых уже прописано объявление большинства часто используемых процедур. Они хранятся в файлеWin32api.txt
поставляемым совместно с Visual Basic и Office. За дополнительной информацией обращаться к MSDNК О Н Е Ц
В начало - На главную