РАЗРАБОТКА ПРИЛОЖЕНИЙ С ПОМОЩЬЮ VBA

Далее последует краткий обзор по созданию диалоговых окон, обработке ошибок, управлению фокусом окон и созданию дистрибутивов.

Для отображения и скрытия формы используются методы Show и Hide


Public Sub MyApplication()
   UserForm1.Show
   UserForm1.Hide
End Sub
Все формы в VBA модальные, то есть пока их не закроешь невозможно что-либо править в чертеже. Когда форма скрыта уже возможно кое-что править. Форму можно загрузить, но сразу не отображать. С целью освобождения памяти ненужные формы можно выгружать методом Unload.
Все диалоговые окна в VBA также модальны, то есть если применяешь диалоговое окно в котором от пользователя ожидается выбор элементов на рисунке путем их указания следует сначала скрыть окно диалога, а по окончании выбора - показать.
Из трех типов ошибок (периода компиляции, логических и периода выполнения) обработать программным путем в полной мере можно только последние. Их следует отслеживать в местах наиболее вероятного появления и обрабатывать. Обработчик по-умолчанию только отображает окно с кодом ошибки и предлагает либо перейти в отладчик либо завершить выполнение программы. Обычно обработчики ошибок ставятся в тех местах где ожидается ввод от пользователя или файловый ввод-вывод. Для обработки ошибок в VBA используется оператор On Error который имеет три формы: Первый позволяет просто игнорировать ошибку и продолжать выполнение со следующего операторы за вызвавшим ошибку, не отображая сообщения об ошибке. Это удобно, например, при смене цвета путем циклического перебора всех объектов, если при этом программа натолкнется на элемент, находящийся на заблокированном слое, то просто игнорирует ошибку

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

(defun S::STARTUP()
   (command "_VBALOAD" "myproj.dvb")
)
Для автоматического выполнения макроса из acad.dvb можно сделать так

(defun S::STARTUP()
   (command "_VBARUN" "drawline")
)
Также при загрузке VBA автовыполняется макрос с именем AcadStartup

Работа с VBA когда не открыт ни один документ

Распространение программ

Возможно два варианта - внедрение в файл чертежа или отдельным файлом. В отдельном файле удобно хранить общие процедуры.

ВЗАИМОДЕЙСТВИЕ С ДРУГИМИ ПРИЛОЖЕНИЯМИ, БАЗАМИ ДАННЫХ И 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 станут доступными для просмотра в "просмотрщике" объектов. Причем установленная ссылка действует только для текущего проекта (чтобы не было лишних тормозов) Второй шаг (открытие базы данных) можно выполнить так:

Dim db As Database
Set db = DBEngine.Workspaces(0).OpenDatabase("C:\TEST.MDB")
Наиболее важным и часто используемым объектом в DAO является объект 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

К О Н Е Ц


В начало - На главную