Vba excel включить references
At some point you may run into a situation when your Excel tool needs to interact with other office application. For example sending an email via Outlook, export output to Word or PowerPoint, upload data to Access etc.
Each program has its own object model, in order to work with other application Excel has to create a link to the other application’s object library via binding. In VBA automation there are two types of binding early binding and late binding. Both of them have their advantages and disadvantages , in the below table I collected the main ones (without attempting to be comprehensive, for more details simply search in Google):
At first look it seems that Early binding beats Late binding except in version dependency. It is really hard to tell if not impossible which approach to use. Usually it depends on the circumstances, if you are 100% sure that users are going to use your tool on a computer which has the same parameters as yours then go for early binding. It makes your life easier during development, code is more readable. In case of the slightest chance that your code might be used on ‘unknown ‘ computer choose late binding. Or if you have no information about the IT infrastructure you can go with the mixed solutions presented at the end of this article :).
Adding Object Library reference manually via VBE -> Tools -> References
Open VBE editor -> ‘Tools’ menu -> Select ‘References’ -> Search for the desired Object Library -> Put a tick in the check box and click ‘Ok’
Example of Early binding (Word)
It requires Word Object Library, without having it the below error message will pop-up:
So let’s see an easy example how to create a new Word document from Excel with Early binding:
Example of Late binding (Word)
The same example using Late binding:
Early vs Late binding
At first look there is not a big difference between the two (only in creating a new instance of Word), but the early binding version solely works in Excel 2016, while the late binding version does not care about the version number.
Other differences come up you are writing your code in case of early binding you can count on VBA Intellisense help:
In case of late binding Intellisense does not work, you have to know the properties, methods etc. by heart or look them up.
Additional inconvenience you can not use built-in constants. For example if you copy over an Excel range to a Word table and you would like the table to Autofit Window:
- Early binding: wordTable.AutoFitBehavior (wdAutoFitWindow)
- Late binding: wordTable.AutoFitBehavior (2) , you have to search for the exact value of the constant, for example in the object browser:
Summarizing Early binding makes your life easier, but you are doomed if your application is used in an earlier version of Office. Fortunately there is a solution to mix the two binding making your tool version independent and enjoy the benefits of Intellisense and built-in constants.
Most common Office Programs’ GUID & how to add object libraries
It is possible to add Object Library via VBA either referencing to the file directly containing it. (You can look up the relevant file –> VBE –> Tools –> References –> select the references and check its location (if it is not visible hold the mouse over the location until you see the pop-up box)
Other approach is to add object library by its GUID (Globally Unique Identifier). One of the biggest advantage of using the GUID is that it is constant and does not change with the version of the program. For example Microsoft Word GUID is: and it is the same in Word 2010, Word 2013, Word 2016 etc. I am almost 100% sure there are other ways to add an object library, from now on I am focusing on adding object library by GUID.
Most common Office GUID:
How to work with Object Library references via VBA
First of all to make your life easier I suggest to add Microsoft Visual Basic for Application Extensibility Library reference to your project. If you do not add it you can not use the ‘Reference’ variable type and you have to declare your reference variable as an Object or Variant. Of course you can add this Object Library via VBA too (see Add Object Library reference to VBAProject programmatically).
Function to check if reference is already added by its GUID
As a first step I suggest to double-check if an object library reference is already added or not, since if it is already added and you try to add it again your code will stop with the below error message:
F_isReferenceAdded function checks if an Object Library is already added as reference by its GUID. It is a boolean function returns TRUE if Object Library reference is already added and FALSE if it is not.
Add Object Library reference to VBAProject programmatically
It is simple two steps and you only need to know the GUID of the object library:
- check if the VBAProject has already have a particular reference (F_isReferenceAdded function)
- if not add the Object Library reference
The References.AddFromGuid method requires three parameters:
- guid – string expression
- major – long, the major version number of the reference
- minor – long, the minor version number of the reference
By using 0 as major and 0 as minor VBA will add the latest available reference.
Remove Object Library reference programmatically
Similarly to add a reference I suggest to check first if the reference is existing in the VBAProject using the F_isReferenceAdded function.
To remove a reference you need to use the References.Remove method, it requires one argument a Reference object that represents the reference you wish to remove. Since I am focusing on GUID at first we need to identify the reference by its GUID, it is obvious I am using a function for that task.
The F_idReferenceByGUID function returns a reference object identified by its GUID:
To remove a reference our tool has to perform three steps:
- check if the VBAProject has already have a particular reference (F_isReferenceAdded function)
- if yes then get reference object (F_idReferenceByGUID)
- remove the reference
Loop through and list references in VBA project
Easiest way to get an object library GUID is to add the reference manually then run the below code it lists the reference name and GUID in the Immediate Window.
If you are interested in the source file of an object library use Reference.FullPath property.
Apply early binding and still make your tool version independent
To achieve this you have to be careful when you are writing your program, but it is feasible. There are certain rules you have to follow though:
- add the object library manually your program requires
- write your code using early binding
- call your object library procedure in a separate procedure
- before the calling add the object library via VBA
- after the calling remove the object library via VBA
As result you will have a version independent, but still easy to maintain program.
Let’s take an example. In the example we create a Word document, add some text to a paragraph and format the paragraph.
As a final step do not forget to remove the object library before release.
It is also Worth to mention Compile your project while you have the object library added, otherwise you get ‘User-defined type not defined’ error message:
I am getting an error saying "Can't find project or library" error message when I try to run a VBA project. I am trying to go into the References to see if there is something there that is causing an issue, but when I click on it, it does nothing.
I have only seen this when a Macro was still running but I scrolled away to look at something else, then I forgot about the Macro still running. but this way References is also disabled (grayed out). In your case it is not disabled, is it?
10 Answers 10
This worked for me - a. Copy/paste the problematic file to a new location. The error seems to be resolved in the file in the new location. b. Delete the problematic file in the original location (optional) c. Copy/paste the corrected file back to the original location.(optional)
I also managet to fix it by disabling all macros, saving the file, and then enabling them from the "Macro Security" in the Developer tab.
This has happened to me twice in the last week. For me not only did nothing open under "tools / references" but although the VBA modules were visible they were completely empty. I don't know the cause, but I speculate that it is some combination of:
- The Power Pivot addin (I'm using Office 365 FWIW)
- Dax Studio (this was present second time but not first)
- The MS scripting runtime reference/library
The first time I managed to retrieve the situation, through a complex procedure; I'm not sure what part of the process worked the magic and for me it's not replicable. The second time (this morning) I adopted a simpler procedure.
- I did the Office repair. That didn't work for me either.
- I opened an empty .xlsm and went into the VBE.
- I added a reference to the scripting runtime (Tools/References behaved as expected)
- Leaving this empty .xlsm open I opened the s/sheet that was giving me the problem.
- Voila: I got all my VBA back, Tools/References is OK.
Happy bunny - for now.
This can happen for any number of reasons, as VBA and excel are very sensitive. What i would suggest is unprotecting your workbook in any way that it is protected for now. Then try accessing your file via "safe mode" by holding ctrl when opening excel. Take the time to back up any important VBA codes. If you can't fix the errors in safe mode you may need to recreate the workbook with the saved VBA codes.
Also if you have a personal XLSB workbook it may have been corrupted. Go to your excel's XLSB file location and check by opening it and seeing if there are any issues.
I recently had this issue because i protected a sheet that VBA was trying to access when running a code so make sure everything is in order of when it was last working.
After opening in Safe Mode, go in to VBA and under Debug -> Compile VBA Project
This has happened to me before. As usual, I'd suggest restarting Office. If that does not work, then go to Control Panel> Uninstalled Software> Microsoft Office. click on "Modify" and then once the wizard comes up, select "Repair".
Добрый день, мне необходимо программным путем подключить references, которые мы ставим через tools->references .
вот код, который работает:
Все хорошо если я запускаю этот код изнутри настройки при запуски Excel. А мне хотелось бы чтобы эта reference добавлялась в проект без открытия Excel. Есть ли способы так сделать? Заранее спасибо!
Программно добавить на форму компонент
Здравствуйте! Подскажите, пожалуйста, как программно добавить компоненту на форму при выборе.
Как программно добавить в listbox некоторые значения?
Понимаю вопрос дурацкий, но у меня никак не получается. Как называется эта волшебная.
Программно снять защиту с листа чтобы добавить строку
Добрый день! Есть макрос на добавление строки: Sub add_row() Rows(ActiveCell.Row).Insert.
Как к формуле в ячейке добавить текст сформированный программно?
Как к формуле в ячейке добавить текст сформированный программно. Может СЦЕПИТЬ(), но как?
Никак. Все ссылки на библиотеки хранятся внутри файла и относятся к конкретному VB проекту, а не к приложению в целом.
а нету чего либо типо коллекции где я выбираю нужный проект в коде и добавляю к нему уже референс
Добавлено через 41 минуту
а можно ли при запуске экселя внутри проекта добавить референс который нужен, или компилятор ругаться будет раньше чем начнет выполнение это кода?
Обращение должно идти к конкретной книге, далее к её проекту VBA и уже там к библиотекам: ThisWorkbook.VBProject.References. Поэтому коллекция вполне осязаема - это книги Excel. Но книга должна быть открыта.
Вообще, вполне вероятно, что при открытии книги проект сразу будет ругаться на отсутствие библиотек, если подключение к ним идет через раннее связывание. Однако, если подключение применяется в кодах, которые не выполняются в момент открытия книги - то прием с подключением библиотеки сработает. Но оптимальный вариант - это позднее связывание(если оно поддерживается библиотекой). Тогда и подключать библиотеки не придется.
Кстати, в Вашем коде выше есть изъян: доверие к VBA проекту устанавливается на уровне приложения и поставить его кодом при запуске книги не получится, т.к. требуется перезагрузка Excel.
Есть программка (то есть макрос) на VBA, формирующая отчетики в Word из Excel. Я ее делаю на 2003 версии офиса. Программка будет стоять и может даже носться с одного комьютера на другой и мне нужна уверенная ее работа на версиях Excel 2003 и выше.
Проблема следующая: если открыть .xls-файл с программой на Excel 2007 или 2010 в References прописываются новые библиотеки. Если после этого открываем снова на 2003 версии вылезает вот такая дрянь: MISSING:Microsoft Word 12.0(зависит от версии где открывали) Object Library - во вложении картинка. С этим понятно начинаются разные веселые глюки - например функцию Str() он у меня не признает.
Но тут еще все понятно конечно - Excel просто прописал ту библиотеку которая поновее. Как с этой бедой бороться мне ясно - убираем галочку где MISSING и ставим напротив аналогичной библиотеки. Все работает
А теперь вопрос: Как избежать автоматического прописывания более поздних версий библиотек в References? (извините если сказал глупость)
Один вариант я знаю: установить пароль на проект - тогда Эксель без моего разрешения не будет самоуправствовать. Чего еще можно придумать? А то надоела эта билиберда - на работе отредактируешь макрос, а дома каждый раз приходится лезть в эти References.
Работа надстройки для Excel 97 в более поздних версиях
Доброго времени суток. Имеется надстройка для Excel 97. Возможно ли заставить ее работать на более.
Автоматическое подключение библиотек
есть ли ide, в которых(при статической линковке) линкер подключает только нужное. или все и так это.
Программа с использованием библиотек MS Office 2010 не работает с Office 2003
Есть юзерформа, вызывается кнопкой с листа в ворде. в юзерформе идёт обмен данными с таблицей.
Отсутствие библиотек Office.Interop.Excel и Office.Core
Добрый день! Сижу уже несколько дней с одной проблемой: Нужно доработать программу выгрузки.
Во втором случае в VBE не будет появляться выпадающий список свойств и методов объекта WordApp, и константы из библиотеки Ворда типа wdLine, wdReplaceAll будут неопределены - их надо заменить на числа.
То есть на этапе разработки и отладки удобнее раннее связывание, а потом, для обеспечения совместимости - позднее связывание.
Всем нам приходится - кому реже, кому чаще - повторять одни и те же действия и операции в Excel. Любая офисная работа предполагает некую "рутинную составляющую" - одни и те же еженедельные отчеты, одни и те же действия по обработке поступивших данных, заполнение однообразных таблиц или бланков и т.д. Использование макросов и пользовательских функций позволяет автоматизировать эти операции, перекладывая монотонную однообразную работу на плечи Excel. Другим поводом для использования макросов в вашей работе может стать необходимость добавить в Microsoft Excel недостающие, но нужные вам функции. Например функцию сборки данных с разных листов на один итоговый лист, разнесения данных обратно, вывод суммы прописью и т.д.
Макрос - это запрограммированная последовательность действий (программа, процедура), записанная на языке программирования Visual Basic for Applications (VBA). Мы можем запускать макрос сколько угодно раз, заставляя Excel выполнять последовательность любых нужных нам действий, которые нам не хочется выполнять вручную.
Способ 1. Создание макросов в редакторе Visual Basic
Для ввода команд и формирования программы, т.е. создания макроса необходимо открыть специальное окно - редактор программ на VBA, встроенный в Microsoft Excel.
- В старых версиях (Excel 2003 и старше) для этого идем в меню Сервис - Макрос - Редактор Visual Basic(Toos - Macro - Visual Basic Editor).
- В новых версиях (Excel 2007 и новее) для этого нужно сначала отобразить вкладку Разработчик (Developer) . Выбираем Файл - Параметры - Настройка ленты (File - Options - Customize Ribbon) и включаем в правой части окна флажок Разработчик (Developer) . Теперь на появившейся вкладке нам будут доступны основные инструменты для работы с макросами, в том числе и нужная нам кнопка Редактор Visual Basic(Visual Basic Editor)
:
К сожалению, интерфейс редактора VBA и файлы справки не переводятся компанией Microsoft на русский язык, поэтому с английскими командами в меню и окнах придется смириться:
Макросы (т.е. наборы команд на языке VBA) хранятся в программных модулях. В любой книге Excel мы можем создать любое количество программных модулей и разместить там наши макросы. Один модуль может содержать любое количество макросов. Доступ ко всем модулям осуществляется с помощью окна Project Explorer в левом верхнем углу редактора (если его не видно, нажмите CTRL+R). Программные модули бывают нескольких типов для разных ситуаций:
-
Обычные модули - используются в большинстве случаев, когда речь идет о макросах. Для создания такого модуля выберите в меню Insert - Module. В появившееся окно нового пустого модуля можно вводить команды на VBA, набирая их с клавиатуры или копируя их из другого модуля, с этого сайта или еще откуда нибудь:
Обычный макрос, введенный в стандартный модуль выглядит примерно так:
Давайте разберем приведенный выше в качестве примера макрос Zamena:
С ходу ясно, что вот так сразу, без предварительной подготовки и опыта в программировании вообще и на VBA в частности, сложновато будет сообразить какие именно команды и как надо вводить, чтобы макрос автоматически выполнял все действия, которые, например, Вы делаете для создания еженедельного отчета для руководства компании. Поэтому мы переходим ко второму способу создания макросов, а именно.
Способ 2. Запись макросов макрорекордером
Макрорекордер - это небольшая программа, встроенная в Excel, которая переводит любое действие пользователя на язык программирования VBA и записывает получившуюся команду в программный модуль. Если мы включим макрорекордер на запись, а затем начнем создавать свой еженедельный отчет, то макрорекордер начнет записывать команды вслед за каждым нашим действием и, в итоге, мы получим макрос создающий отчет как если бы он был написан программистом. Такой способ создания макросов не требует знаний пользователя о программировании и VBA и позволяет пользоваться макросами как неким аналогом видеозаписи: включил запись, выполнил операци, перемотал пленку и запустил выполнение тех же действий еще раз. Естественно у такого способа есть свои плюсы и минусы:
- Макрорекордер записывает только те действия, которые выполняются в пределах окна Microsoft Excel. Как только вы закрываете Excel или переключаетесь в другую программу - запись останавливается.
- Макрорекордер может записать только те действия, для которых есть команды меню или кнопки в Excel. Программист же может написать макрос, который делает то, что Excel никогда не умел (сортировку по цвету, например или что-то подобное).
- Если во время записи макроса макрорекордером вы ошиблись - ошибка будет записана. Однако смело можете давить на кнопку отмены последнего действия (Undo) - во время записи макроса макрорекордером она не просто возрвращает Вас в предыдущее состояние, но и стирает последнюю записанную команду на VBA.
Чтобы включить запись необходимо:
- в Excel 2003 и старше - выбрать в меню Сервис - Макрос - Начать запись(Tools - Macro - Record New Macro)
- в Excel 2007 и новее - нажать кнопку Запись макроса (Record macro) на вкладке Разработчик (Developer)
Затем необходимо настроить параметры записываемого макроса в окне Запись макроса:
- Имя макроса - подойдет любое имя на русском или английском языке. Имя должно начинаться с буквы и не содержать пробелов и знаков препинания.
- Сочетание клавиш - будет потом использоваться для быстрого запуска макроса. Если забудете сочетание или вообще его не введете, то макрос можно будет запустить через меню Сервис - Макрос - Макросы - Выполнить(Tools - Macro - Macros - Run) или с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или нажав ALT+F8.
- Сохранить в. - здесь задается место, куда будет сохранен текст макроса, т.е. набор команд на VBA из которых и состоит макрос.:
- Эта книга - макрос сохраняется в модуль текущей книги и, как следствие, будет выполнятся только пока эта книга открыта в Excel
- Новая книга - макрос сохраняется в шаблон, на основе которого создается любая новая пустая книга в Excel, т.е. макрос будет содержаться во всех новых книгах, создаваемых на данном компьютере начиная с текущего момента
- Личная книга макросов - это специальная книга Excel с именем Personal.xls, которая используется как хранилище макросов. Все макросы из Personal.xls загружаются в память при старте Excel и могут быть запущены в любой момент и в любой книге.
После включения записи и выполнения действий, которые необходимо записать, запись можно остановить командой Остановить запись (Stop Recording) .
Запуск и редактирование макросов
Управление всеми доступными макросами производится в окне, которое можно открыть с помощью кнопки Макросы (Macros) на вкладке Разработчик (Developer) или - в старых версиях Excel - через меню Сервис - Макрос - Макросы (Tools - Macro - Macros) :
- Любой выделенный в списке макрос можно запустить кнопкой Выполнить(Run) .
- Кнопка Параметры(Options) позволяет посмотреть и отредактировать сочетание клавиш для быстрого запуска макроса.
- Кнопка Изменить(Edit) открывает редактор Visual Basic (см. выше) и позволяет просмотреть и отредактировать текст макроса на VBA.
Создание кнопки для запуска макросов
Чтобы не запоминать сочетание клавиш для запуска макроса, лучше создать кнопку и назначить ей нужный макрос. Кнопка может быть нескольких типов:
Кнопка на панели инструментов в Excel 2003 и старше
Откройте меню Сервис - Настройка (Tools - Customize) и перейдите на вкладку Команды (Commands) . В категории Макросы легко найти веселый желтый "колобок" - Настраиваемую кнопку (Custom button) :
Перетащите ее к себе на панель инструментов и затем щелкните по ней правой кнопкой мыши. В контекстом меню можно назначить кнопке макрос, выбрать другой значок и имя:
Кнопка на панели быстрого доступа в Excel 2007 и новее
Щелкните правой кнопкой мыши по панели быстрого доступа в левом верхнем углу окна Excel и выберите команду Настройка панели быстрого доступа (Customise Quick Access Toolbar) :
Затем в открывшемся окне выберите категорию Макросы и при помощи кнопки Добавить (Add) перенесите выбранный макрос в правую половину окна, т.е. на панель быстрого доступа:
Кнопка на листе
Этот способ подходит для любой версии Excel. Мы добавим кнопку запуска макроса прямо на рабочий лист, как графический объект. Для этого:
- В Excel 2003 и старше - откройте панель инструментов Формы через меню Вид - Панели инструментов - Формы (View - Toolbars - Forms)
- В Excel 2007 и новее - откройте выпадающий список Вставить (Insert) на вкладке Разработчик (Developer)
Выберите объект Кнопка (Button) :
Затем нарисуйте кнопку на листе, удерживая левую кнопку мыши. Автоматически появится окно, где нужно выбрать макрос, который должен запускаться при щелчке по нарисованной кнопке.
Создание пользовательских функций на VBA
Создание пользовательских функций или, как их иногда еще называют, UDF-функций (User Defined Functions) принципиально не отличается от создания макроса в обычном программном модуле. Разница только в том, что макрос выполняет последовательность действий с объектами книги (ячейками, формулами и значениями, листами, диаграммами и т.д.), а пользовательская функция - только с теми значениями, которые мы передадим ей как аргументы (исходные данные для расчета).
Чтобы создать пользовательскую функцию для расчета, например, налога на добавленную стоимость (НДС) откроем редактор VBA, добавим новый модуль через меню Insert - Module и введем туда текст нашей функции:
Обратите внимание, что в отличие от макросов функции имеют заголовок Function вместо Sub и непустой список аргументов (в нашем случае это Summa). После ввода кода наша функция становится доступна в обычном окне Мастера функций (Вставка - Функция) в категории Определенные пользователем (User Defined) :
После выбора функции выделяем ячейки с аргументами (с суммой, для которой надо посчитать НДС) как в случае с обычной функцией:
Читайте также: