Как в visual basic подключить библиотеку excel чтобы работало с разными версиями библиотеки
Экономия 5 минут в час за счет более продуктивной работы дает за год экономию в 4 рабочие недели
Как подключить библиотеку в VBA?
В VBA есть много интересных библиотек позволяющих работать с объектом FSO, словарями, регулярными выражениями, объектами MS Office, а также много другое.
Можно и обойтись без их подключения и использовать конструкцию CreateObject(«»), но есть два маленьких нюанса
-
Вы теряете чуть-чуть в производительности. Я, если честно, не до конца понимаю как так, но факт есть факт. С подключенной библиотекой, на коротких примерах ускорение в 2 раза — с 0,1 сек до 0,05 сек
Вы теряете подсказки в среде VBE. Для кода, который вы отдали в использование — это нормально, но для себя любимых включение может быть лишним действием (опять же вы можете в какой-то момент забыть какую библиотеку включали)
Итак, проблематика ясна. Как бороться? В три этапа.
Первый этап — макросам должен быть предоставлен доступ к объектной модели VBA. Само собой вы при этом берете на себя риски — ведь при этом макросы могут удалить все и вся.
Файл ->
Параметры ->
Центр Управления Безопасностью ->
Параметры центра управления безопасностью ->
Параметры макросов ->
Включить галочку «Предоставлять доступ к объектной модели проектов VBA»
Второй этап — посмотреть GUID код соответствующей библиотеки, которую будете проверять/включать программным способом. Для этого в VBE перейдите в меню и включите галочку напротив библиотеки.
Ну и третий этап — сам макрос. Верхняя часть выводит в окно Immediate Window все библиотеки, проверяет включена ли библиотека. Ну а строчка .AddFromGuid производит подключение
Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке) .
В своем коде можно задействовать другие объекты приложения, задав ссылки на библиотеку объектов этого приложения.
Добавление объекта
На вкладке "Разработчик" откройте окно проекта Visual Basic. Увидеть вкладки «разработчик» отображается ниже, если она еще не открыта.
В меню Сервис выберите пункт Ссылки.
В разделе Доступные ссылки установите флажок для библиотеки объектов, которую требуется задействовать в вашем проекте Visual Basic.
Примечание: Чтобы ускорить компиляцию, снимите флажки для библиотек объектов, которые не будут использоваться в проекте.
Чтобы задать порядок доступа к библиотекам объектов, в разделе Доступные ссылки выберите любую библиотеку и переместите ее вверх или вниз с помощью кнопок приоритета.
Чтобы добавить в раздел Доступные ссылки другую библиотеку, нажмите кнопку Обзор и укажите путь к необходимому файлу.
На верхней панели выберите Excel > настройки > панель инструментов и ленты.
В разделе Настройка ленты выберите Основные вкладки и установите флажок Разработчик.
Если ваша библиотека DLL автономная или зависит от других библиотек, необходимо знать, как обеспечить для Microsoft Excel доступ к ее функциям и командам. Дополнительные сведения см. в статье Доступ к библиотекам DLL в Excel.
Но если вашей библиотеке DLL требуется доступ к функциям Excel (например, для получения содержимого ячейки, вызова функции листа или запрашивания у Excel сведений о рабочей области), в коде необходимо предусмотреть возможность обратного вызова Excel.
В API C Excel доступны несколько функций, которые обеспечивают для библиотек DLL возможность обратного вызова Excel. Для доступа к этим функциям библиотеку DLL во время компиляции необходимо статически связать с xlcall32.lib, 32-разрядной библиотекой Excel. Статическую библиотеку можно скачать на сайте Майкрософт в составе пакета SDK XLL для Microsoft Excel 2013, в который входят 32- и 64-разрядная версии этой библиотеки.
Обеспечение обратного вызова Excel для библиотек DLL
Чтобы библиотека DLL могла получить доступ к функциям Excel и получить или задать сведения о рабочей области, она сначала должна получить адреса функций обратного вызова Excel (Excel4, Excel4v, Excel12 и Excel12v). Последние две функции, которые появились в Excel 2007, доступны в последующих версиях. Чтобы получить доступ ко всем этим функциям, проект DLL должен включать ссылки на перечисленные ниже файлы, представленные в пакете SDK XLL для Excel 2013. Если вы хотите получить доступ только к первым двум функциям обратного вызова (в любой версии Excel), проект должен включать только первые два файла.
Xlcall.h
Файл Xlcall.h содержит следующие элементы:
прототипы функций для всех функций обратного вызова;
определения структур данных, которые используются в функциях обратного вызова для обмена данными между DLL или XLL и Excel, а также определения констант типов данных;
определения функции API C и эквивалентные команды для листа, функций листа макросов и поддерживаемых команд Excel;
определения возвращаемых значений функций обратного вызова.
Xlcall32.lib
Библиотека Xlcall32.lib экспортирует первые две функции обратного вызова (Excel4 и Excel4v), а также функцию XlCallVer. Если в вашем проекте нет ссылки на эту библиотеку, компоновщик не сможет создать XLL-файл, если вы использовали любые из этих функций обратного вызова в своем коде. (Адреса этих функций можно получить путем динамического связывания с эквивалентным файлом Xlcall32.dll, который копируется в систему во время обычной установки Excel.)
Xlcall.cpp
Функции обратного вызова Excel Excel12 и Excel12v не экспортируются в Xlcall32.lib. Благодаря этому проекты XLL, созданные в Excel 2007, также будут работать с более ранними версиями Excel. Модуль Xlcall.cpp содержит код для функций Excel12 и Excel12v, которые обеспечивают вызов точки входа в Excel, начиная с Excel 2007, или возвращают безопасное значение ошибки, если запущена более ранняя версия Excel. Этот модуль следует включить в проект, если вы хотите создать библиотеку XLL, которая запускается в Excel 2007 и в которой можно использовать новые типы данных, которые поддерживают обработку сеток большего размера и более длинных строк в Юникоде.
Начиная с пакета SDK для Excel 2010, этот файл можно компилировать для 32- и 64-разрядных библиотек XLL.
Преобразование библиотек DLL в XLL: функции интерфейса диспетчера надстроек
XLL представляет собой библиотеку DLL, которая экспортирует несколько процедур, которые вызывает Excel или диспетчер надстроек Excel. Эти процедуры вкратце описываются в этой статье и подробно рассматриваются в статье Функции диспетчера надстроек и интерфейса XLL. Все эти функции обратного вызова DLL начинаются с префикса xlAuto. Обязательной является только одна из них, а именно команда xlAutoOpen. Она вызывается при активации надстройки и обычно используется для регистрации функций и команд XLL в Excel, а также для выполнения других задач инициализации. Сигнатуры функций и примеры реализации всех функций xlAuto приведены далее в этой статье.
Хотя среди всех этих функций обратного вызова обязательной является только функция xlAutoOpen, вашей надстройке также может понадобиться экспортировать другие функции в зависимости от ее поведения.
В Excel 2007 представлен новый тип данных XLOPER12, который обеспечивает поддержку сеток большего размера и длинных строк в Юникоде. Тип данных XLOPER12 описан далее в этой статье. В то время как функции xlAuto извлекают или возвращают старый тип данных XLOPER, в Excel 2007 представлены новые версии этих функций, в которых используются типы данных XLOPER12. За исключением функции xlAutoFree12, которую иногда необходимо внедрить во избежание утечек памяти XLOPER12, вы можете безопасно пропустить установку всех функций xlAuto версии 12. В этом случае Excel 2007 и более поздних версий будет вызывать версии XLOPER.
xlAutoOpen
Excel вызывает функцию xlAutoOpen при активации библиотеки XLL. Надстройка будет активирована при запуске сеанса Excel, если она была активна во время последнего сеанса Excel, который нормально завершил работу. Надстройка активируется при загрузке во время сеанса Excel. Надстройку можно выключить и повторно активировать во время сеанса Excel. Вызов функции выполняется после повторной активации.
Функцию xlAutoOpen следует использовать для регистрации функций и команд XLL, инициализации структур данных, настройки пользовательского интерфейса и других задач.
Если ваша надстройка реализует и экспортирует функцию xlAutoRegister или xlAutoRegister12, Excel может попытаться активировать и зарегистрировать функцию или команду, не вызывая функцию xlAutoOpen. В этом случае следует убедиться, что ваша надстройка инициализирована в достаточной мере для правильной работы функции или команды. В противном случае вам может не удаться зарегистрировать функцию или команду либо выполнить необходимые действия по инициализации.
xlAutoClose
Excel вызывает функцию xlAutoClose при выключении библиотеки XLL. Надстройка будет отключена после нормального завершения сеанса Excel. Если пользователь отключает надстройку во время сеанса Excel, выполняется вызов функции.
Функцию xlAutoClose следует использовать для отмены регистрации функций и команд, освобождения ресурсов, отмены настроек и других задач.
При отмене регистрации функций и команд возникает известная проблема. Дополнительные сведения см. в статье Известные проблемы, возникающие при разработке XLL для Excel.
xlAutoAdd
Excel вызывает функцию xlAutoAdd, когда пользователь с помощью диспетчера надстроек активирует библиотеку XLL во время сеанса Excel. Вызов этой функции не выполняется, когда Excel при запуске загружает предустановленную надстройку.
С помощью этой функции можно отобразить настраиваемое диалоговое окно с уведомлением об активации надстройки, считать данные из реестра или записать их в реестр, а также проверить сведения о лицензировании.
xlAutoRemove
Excel вызывает функцию xlAutoRemove, когда пользователь с помощью диспетчера надстроек отключает библиотеку XLL во время сеанса Excel. Вызов этой функции не выполняется, если сеанс Excel закрывается (правильно или ненормально) при установленной надстройке.
С помощью этой функции можно отобразить настраиваемое диалоговое окно с уведомлением об отключении надстройки, а также считать данные из реестра или записать их в реестр.
xlAddInManagerInfo и xlAddInManagerInfo12
Начиная с Excel 2007, Excel в первую очередь вызывает функцию xlAddInManagerInfo12, а не xlAddInManagerInfo, если она экспортирована с помощью библиотеки XLL. Функция xlAddInManagerInfo12 должна работать так же, как функция xlAddInManagerInfo, во избежание характерных для версий различий в поведении библиотеки XLL. Функция xlAddInManagerInfo12 должна возвращать тип данных XLOPER12, а функция xlAddInManagerInfo — тип данных XLOPER.
xlAutoRegister и xlAutoRegister12
Excel вызывает функцию xlAutoRegister при вызове функции XLM REGISTER или аналогичной функции xlfRegister, предусмотренной в API C, если для регистрируемой функции отсутствуют типы возвращаемого значения и аргумента. С помощью функции xlAutoRegister библиотека XLL может выполнить поиск в своих внутренних списках экспортированных функций и команд, чтобы зарегистрировать функцию с аргументом и вернуть указанные типы.
Начиная с Excel 2007, Excel в первую очередь вызывает функцию xlAddInRegister12, а не xlAddInRegister, если она экспортирована с помощью библиотеки XLL.
Если функция xlAddInRegister/ xlAddInRegister12 пытается зарегистрировать функцию, не предоставив типы аргумента и возвращаемого значения, наблюдается рекурсивный цикл вызовов, вследствие чего стек вызовов постепенно переполняется, а Excel закрывается или перестает отвечать на запросы.
xlAutoFree и xlAutoFree12
Excel вызывает функцию xlAutoFree или xlAutoFree12 только после того, как функция листа XLL возвращает тип данных XLOPER/ XLOPER12 с установленным флагом о наличии памяти, которую все еще необходимо освободить с помощью библиотеки XLL. Благодаря этому библиотека XLL может вернуть динамически выделяемые массивы, строки и внешние ссылки на лист без утечек памяти. Тип данных XLOPER12 поддерживается, начиная с Excel 2007. Дополнительные сведения см. в статье Управление памятью в Excel.
Начиная с Excel 2007, при настройке Excel на многопоточный пересчет листа функция xlAutoFree/ xlAutoFree12 вызывается для потока, который только что использовался для вызова функции, возвратившей его. Вызов функции xlAutoFree/ xlAutoFree12 всегда выполняется перед оценкой последующих ячеек листа для этого потока. Это упрощает потокобезопасную разработку библиотеки XLL. Дополнительные сведения см. в статье Многопотоковый пересчет в Excel.
Создание 64-разрядных библиотек XLL
Excel и определяемые пользователем функции можно выполнять в 64-разрядных операционных системах, ведь они более производительны, если сравнивать их с 32-разрядными операционными системами. Excel передает значения в структуры XLOPER12, которые включают сведения о типах данных. При преобразовании значений в структуре XLOPER12 и собственных типах, таких как int или указатели, должны сохраниться значения в большем типе.
Вы можете получить доступ к функции или команде DLL в Microsoft Excel несколькими способами:
с помощью модуля кода Microsoft Visual Basic для приложений (VBA), в котором функция или команда была сделана доступной с помощью выражения Declare;
через лист макросов XLM, используя функции CALL или REGISTER;
непосредственно с листа или из настроенного элемента в пользовательском интерфейсе.
В этой документации не рассматриваются функции XLM. Рекомендуем использовать один из двух других подходов.
Для непосредственного доступа с листа или из настроенного элемента пользовательского интерфейса функцию или команду необходимо сначала зарегистрировать в Excel. Сведения о регистрации команд и функций см. в статье Accessing XLL Code in Excel.
Вызов функций и команд DLL из VBA
Вы можете получать доступ к функциям и командам DLL в VBA с помощью выражения Declare. Это выражение имеет один синтаксис для команд и другой — для функций.
Синтаксис 1: команды
Синтаксис 2: функции
Команды должны возвращать тип void. Функции должны возвращать типы, которые VBA может распознавать ByVal. Это означает, что некоторые типы легче возвращать путем изменения аргументов: строк, массивов, пользовательских типов и объектов.
VBA не может проверить совпадение списка аргументов и возвращаемого значения в модуле Visual Basic со значениями, закодированными в DLL. Это необходимо внимательно проверить самостоятельно, поскольку ошибка может привести к сбою Excel.
Когда аргументы функции или команды не передаются по ссылке или указателю, им должно предшествовать ключевое слово ByVal в объявлении arglist. Если функция C/C++ принимает указатели в качестве аргументов или функция C++ принимает в качестве аргументов ссылки, то их следует передавать ByRef. Ключевое слово ByRef можно не указывать в списках аргументов, поскольку этот режим выбран в VBA по умолчанию.
Типы аргументов в C/C++ и VBA
Следует помнить об указанных ниже фактах при сравнении объявлений типов аргументов в C/C++ и VBA.
Тип String в VBA передается как указатель на структуру BSTR байтовых строк в режиме ByVal и как указатель на указатель в режиме ByRef.
Тип Variant в VBA, содержащий строку, передается как указатель на структуру BSTR строк Юникода из двухбайтовых знаков при передаче в режиме ByVal и как указатель на указатель в режиме ByRef.
Integer VBA — это 16-битный тип, эквивалентный signed short в C/C++.
Long VBA — это 32-битный тип, эквивалентный signed int в C/C++.
VBA и C/C++ допускают определяемые пользователем типы данных (применяются операторы Type и struct соответственно).
VBA и C/C++ поддерживают тип данных Variant, заданный для C/C++ в файлах заголовка Windows OLE/COM как VARIANT.
Массивы VBA — это объекты OLE SafeArrays, определенные для C/C++ в файлах заголовка Windows OLE/COM как SAFEARRAY.
Тип данных Currency в VBA передается как структура типа CY, определенная в файле заголовка Windows wtypes.h, в режиме ByVal и как указатель на него в режиме ByRef.
Ниже приведен пример определений эквивалентных пользовательских типов.
Excel передает только значения Variant указанных ниже типов в определяемую пользователем функцию VBA.
Тип данных VBA | Битовые флаги типа Variant C/C++ | Описание |
---|---|---|
Double | VT_R8 | |
Boolean | VT_BOOL | |
Date | VT_DATE | |
String | VT_BSTR | Строка байтов OLE Bstr |
Диапазон | VT_DISPATCH | Ссылки на ячейку и диапазон |
Переменная, содержащая массив | VT_ARRAY VT_VARIANT | Литеральные массивы |
Ccy | VT_CY | 64-битное целое число, масштабированное для достижения точности 4 знака после запятой. |
Переменная, содержащая ошибку | VT_ERROR | |
VT_EMPTY | Пустые ячейки или пропущенные аргументы |
Вы можете проверить тип переданного аргумента Variant в VBA с помощью VarType, если функция не возвращает тип значений диапазона при вызове со ссылками. Чтобы определить, является ли Variant объектом ссылки Range, можно использовать функцию IsObject.
В VBA можно создавать Variant, содержащие массивы переменных, назначая свойство Value Range для Variant. Ячейки в исходном диапазоне, отформатированные с использованием стандартного денежного формата для действующих региональных параметров, преобразуются в элементы массива типа Currency. Ячейки, отформатированные как даты, преобразуются в элементы массива типа Date. Ячейки, содержащие строки, преобразуются в Variant BSTR с расширенными символами. Ячейки, содержащие ошибки, преобразуются в Variant типа VT_ERROR. Ячейки, содержащие значения True или False типа Boolean, преобразуются в Variant типа VT_BOOL.
Variant хранит значение True как –1, а значение False — как 0. Числа, не отформатированные как даты или суммы валют, преобразуются в Variant типа VT_R8.
Аргументы строк и переменных
Excel внутренне работает со строками Юникода из расширенных символов. Когда пользовательская функция VBA объявляется как принимающая аргумент String, Excel преобразует предоставленную строку в байтовую строку в соответствии с региональными стандартами. Если вам нужно, чтобы функции передавалась строка Юникода, пользовательская функция VBA должна принимать Variant вместо аргумента String. Тогда функция DLL сможет принять эту строку BSTR из расширенных символов типа Variant из VBA.
Чтобы из DLL возвращались строки Юникода в VBA, следует изменить имеющийся аргумент строки Variant. Для этого следует объявить функцию DLL как принимающую указатель на Variant в коде C/C++, а также объявить аргумент в коде VBA как ByRef varg As Variant . Память предыдущей строки следует освободить, а значение новой строки, созданное с использованием строки OLE Bstr, работает только в DLL.
Чтобы байтовая строка возвращалась в VBA из DLL, следует изменить имеющийся аргумент BSTR байтовой строки. Для этого следует объявить функцию DLL как принимающую указатель на BSTR в коде C/C++, а также объявить аргумент в коде VBA как ByRef varg As String.
Строки, переданные такими способами из VBA, следует обрабатывать только с помощью строковых функций BSTR OLE. Это позволит избежать проблем, связанных с памятью. Например, необходимо вызывать функцию SysFreeString, чтобы освободить память, прежде чем перезаписывать переданную строку, и функцию SysAllocStringByteLen или SysAllocStringLen, чтобы выделить место для новой строки.
Вы можете создавать ошибки листов Excel как Variants в VBA с помощью функции CVerr с аргументами, показанными в следующей таблице. Ошибки листов также можно возвращать в VBA из DLL с помощью объектов Variants типа VT_ERROR со следующими значениями в поле ulVal.
Обратите внимание на то, что значение Variant ulVal эквивалентно значению аргумента CVerr с шестнадцатеричным значением x800A0000.
Вызов функций DLL непосредственно с листа
Вы не сможете получить доступ к функциям DLL Win32 с листа, если не используете, к примеру, интерфейсы VBA или XLM либо не сообщите Excel заранее о функции, ее аргументах и типе возвращаемого значения. Этот процесс называется регистрацией.
Ниже приведены способы, которыми можно получить доступ к функциям DLL на листе.
Объявите функцию в VBA, как показано выше, и получите доступ к ней через пользовательскую функцию VBA.
Сначала обеспечьте вызов функции DLL с помощью CALL на листе макросов XLM, а затем — доступ к ней с помощью определяемой пользователем функции XLM.
Используйте команду XLM или VBA, чтобы вызвать функцию XLM REGISTER, которая предоставляет сведения, необходимые Excel для опознания функции при ее вводе в ячейке листа.
Преобразуйте DLL в XLL и зарегистрируйте функцию с помощью функции xlfRegister C API после активации XLL.
Четвертый подход изолированный: код, регистрирующий функции, и код функций хранятся в одном объекте кода. Изменение надстройки не включает изменение листа XLM или модуля кода VBA. Чтобы сделать это с широкими возможностями управления, оставаясь в рамках возможностей API C, необходимо преобразовать DLL в XLL и загрузить получившуюся надстройку с помощью диспетчера настроек. Это позволяет Excel вызывать функцию, предоставленную библиотекой DLL, при загрузке или активации надстройки, из которой затем можно зарегистрировать все функции, которые содержит XLL, и выполнять другие задачи инициализации DLL.
Вызов команд DLL непосредственно из Excel
Команды DLL Win32 недоступны напрямую из диалоговых окон и меню Excel без интерфейса, например VBA, или без предварительной регистрации команд.
Получать доступ к командам DLL можно следующими способами:
Объявите команду в VBA так, как описано выше, и получите к ней доступ с помощью макроса VBA.
Сначала обеспечьте вызов команды DLL с помощью CALL на листе макросов XLM, а затем — доступ к ней с помощью макроса XLM.
Используйте команду XLM или VBA, чтобы вызвать функцию XLM REGISTER, которая предоставляет сведения, необходимые Excel для опознания команды при ее вводе в диалоговом окне, которое запрашивает имя команды макроса.
Преобразуйте DLL в XLL и зарегистрируйте команду с помощью функции xlfRegister C API.
Excel игнорирует возвращаемое значение, если оно не вызывается с листа макросов XLM. В этом случае возвращаемое значение преобразуется в значение TRUE или FALSE. Таким образом, следует возвращать значение 1, если команда выполнена успешно, и 0, если она завершилась с ошибкой или была отменена пользователем.
Память DLL и многочисленные экземпляры DLL
Когда приложение загружает библиотеку DLL, ее исполняемый код загружается в глобальную кучу, чтобы его можно было запустить, и в глобальной куче выделяется место для его структур данных. Windows использует сопоставление памяти, чтобы эти области памяти отображались как часть процесса приложения и приложение могло получать к ним доступ.
Если второе приложение затем загрузит библиотеку DLL, Windows не будет создавать еще одну копию ее исполняемого кода, так как эта память доступна только для чтения. Windows сопоставляет память исполняемого кода DLL с процессами в обоих приложениях. Тем не менее выделяется дополнительное место для личной копии структур данных DLL, а эта копия сопоставляется только со вторым процессом. Это гарантирует, что ни одно из приложений не будет конфликтовать с данными DLL другого приложения.
Это означает, что разработчикам DLL не следует беспокоиться о том, что несколько приложений (или несколько экземпляров одного приложения) будут получать доступ к статическим и глобальным переменным и структурам данных. Каждый экземпляр всех приложений получает собственную копию данных DLL.
Разработчикам DLL следует позаботиться о том, чтобы один и тот же экземпляр приложения не вызывал DLL много раз из разных потоков, так как это может привести к состязанию за данные этого экземпляра. Дополнительные сведения см. в статье Управление памятью в Excel.
Public acad As Object
If . Then
Set acad = CreateObject("AutoCad.Application.16"
else
Set acad = CreateObject("AutoCad.Application.17"
End if
ICQ: 427682013
ICQ: 427682013
ICQ: 427682013
Public ACADApp As Object
.
Sub ЗагрузкаПриложенияAcad2000()
Set ACADApp = CreateObject("AutoCAD.Application.17"
.
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer )
' Здесь мне нужно перебрать все элементы в пространстве листов.
' определяю переменную
Dim elem As AutoCAD.AcadEntity
For Each elem In ACADApp.ActiveDocument.PaperSpace
.
Next elem
Ошибка вылезает на строке
пишет User-defined type not defined
Также не помогает замена AutoCAD.AcadEntity на ACADApp.AcadEntity и на ACADApp.Application.AcadEntity.
При раннем связывании такой ошибки не возникает и все работает как надо.
Что я делаю не так?
ICQ: 427682013
ICQ: 427682013
Эта строка как и все объявления проверяется на начальном этапе компиляции и т.к. у "ACADApp As Object" нет св-ва .AcadEntity то вылетает ошибка.
Надо бы так:
Dim elem As Object
Set elem = AutoCAD.AcadEntity ' позднее связывание.
У меня нет автокада, так что проверить не могу.
Имена процедур и функций лучше использовать на английском языке, и код пишется внутри этих процедур и функций, а не после.
Процедуры обрабатываются нормально. А код я вроде и так внутри написал (хотя на не локализованном офисе может быть это и не будет работать). Единственное - забыл в самом конце End Sub, но ведь здесь только кусок кода.
To: EUGY
К сожалению не получается.
Ругается на elem: Object doesn't support this property or method (Error 438)
Если elem не определять явно
то все равно никак.
Если вместо ACADApp. указывать AutoCad., то ругается, что переменная AutoCad не определена.
Через
Set elem = New ACADApp.AcadEntity
тоже ничего хорошего не происходит.
Корневой объект AutoCAD ActiveX Automation Object Model — объект Application. Все остальные объекты его наследники. На верхней ступени находятся объекты:
Preferences
Documents
MenuBar
MenuGroups
ICQ: 427682013
Public elem As Object
Public ACADApp As Object
.
Sub ЗагрузкаПриложенияAcad200х()
Set ACADApp = CreateObject("AutoCAD.Application"
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer )
Set elem = ACADApp
Dim objSelSet
Dim objSelCol
Dim intType(0) As Integer
Dim varData(0) As Variant
.
BlockName = "Штамп"
Set objSelCol = ACADApp.ActiveDocument.SelectionSets
For Each objSelSet In objSelCol
If objSelSet. Name = "BlockSelect" Then
objSelSet.Delete
Exit For
End If
Next
Set objSelSet = objSelCol.add("BlockSelect"
intType(0) = 2
varData(0) = BlockName
objSelSet. Select 5, filtertype:=intType, filterdata:=varData
For Each elem In objSelSet
If elem.EntityName = "AcDbBlockReference" Then
With elem
.
call ЗаполнитьСтроку
End With
End If
Next elem
ACADApp.ActiveDocument.Close savechanges:= False
End Sub
Sub ЗакрытиеПриложенияAcad200x()
On Error GoTo ExitSub
Application.StatusBar = "Закрытие AutoCAD. "
ACADApp.Quit
ExitSub:
Application.StatusBar = ""
End Sub
Читайте также: