Как в visual basic подключить библиотеку excel чтобы работало с разными версиями библиотеки

Обновлено: 18.05.2024

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

Класс - это шаблон для создания объектов . Например, пусть у нас есть класс "автомобиль". Он создан по общему чертежу, по единой проектной документации. Но каждый отдельный объект - конкретный экземпляр автомобиля -индивидуален. Например, они различаются цветом, особенностями отделки салона и так далее. Точно также происходит и при работе с программными классами и объектами . Один класс может породить множество различных объектов .

На первых этапах VBA-программирования вам не придется самостоятельно создавать классы , но вы постоянно будете обращаться к объектам из своих процедур. Однако знайте, что VBA в MS Office 2007 поддерживает написание полностью объектно-ориентированных приложений классов и инструментария работы с ними.

Объект - это нечто целостное, неделимое, содержащее в себе данные и код. В объекте может храниться информация и программные инструкции для обработки этой информации.

У объектов есть свойства и методы . Объекты могут откликаться на события . Чтобы объяснить эти важнейшие понятия, разовьем уже использованный пример.

Напомним: наш объект - это автомобиль. Какие свойства есть у автомобиля? Цвет, тип двигателя, скорость движения и так далее. А какие методы ? Что наш автомобиль умеет делать? Например, передвигаться, ехать. Получается, что у автомобиля есть как минимум два метода : "начать движение" и "остановиться". Точно так же, свойства и методы есть и у объектов , которыми мы будем пользоваться в VBA . А как насчет событий ? Например, событием по отношению к автомобилю может быть нажатие педали газа, которое приводит к увеличению скорости.

Детали работы объекта скрыты от пользователя. Обычно пользователю доступны лишь те свойства и методы , которые специально для этого предназначены. Пользователь не может повлиять на внутренние механизмы объекта , работая лишь со специально выделенными для взаимодействия с внешним миром методами и свойствами .

Обращение к методам объектов в VBA ведется таким образом:

Возможны и другие варианты использования методов . Например, если в метод нужно передать какой-то параметр , его вызов будет выглядеть так:

Обратите внимание на то, что объект и метод отделены точкой. Если вы вводите в редакторе VBA имя объекта и ставите после него точку - редактор подскажет вам, какие методы и свойства есть у этого объекта .

С помощью методов объекта мы даем объекту команды. Например, такая команда : Application.Quit , приводит к закрытию приложения. Очевидно, что Application - это объект " Приложение ", а Quit - это метод "Выйти".

Со свойствами обычно работают так:

Такой командой мы присваиваем некое значение свойству объекта .

А так: Переменная=Объект.Свойство можно присвоить некой переменной свойство объекта . Подробнее с переменными мы познакомимся ниже. Пока можете считать переменные специальными "ящиками" в памяти компьютера, в которых можно хранить различные данные.

Свойства - это, как мы уже говорили, признаки объектов . Например, такая команда , txt_User_Name.Text="Александр" , выведет в текстовом поле ( объект txt_User_Name ) слово "Александр" . Очевидно, что эта команда модифицирует свойство объекта Text , которое отвечает за выводимый на объекте текст.

Если вам пока непонятно, что это за текстовые поля и их свойства - просто читайте дальше. В следующей главе мы подробно все это обсудим - и вы сможете соединить теорию, которую вы уже знаете, с практикой.

Событие - это действие, которое объект распознает и на которое реагирует. Например, событием может быть щелчок мышью по кнопке, открытие нового документа и т.д.

Объекты могут объединяться в коллекции объектов . Фактически, коллекции - это объекты , которые содержат в себе другие объекты . Обычно в коллекцию входят объекты , имеющие один и тот же тип - то есть - одинаковые объекты .

В следующей главе мы вплотную займемся работой с объектами , а пока обсудим очень важную тему - объектные модели приложений Office.

2.4. Введение в объектные модели приложений Office

Объекты приложений Office объединены в иерархическую структуру, которую называют объектной моделью. У каждого приложения своя объектная модель , то есть свой набор объектов . Например, в Microsoft Word на верхнем уровне иерархии стоит библиотека классов Word . Она включает в себя множество классов , например - Application , который символизирует приложение Microsoft Word . Application , в свою очередь , включает в себя другие объекты , методы , свойства . Например, такая команда приводит к закрытию Microsoft Word :

Обычно при работе в MS Word опускают вызов объекта Word , то есть вышеприведенную команду вполне может заменить такая:

Вызов объекта Application тоже можно опускать, но делать это допустимо не всегда. Например, команду Application.Quit сократить уже не получится

Как мы уже говорили, в редакторе VBA есть средство для просмотра информации об объектах - Object Browser. Для его вызова служит одноименная кнопка на панели инструментов, или клавиша F2 (рис. 2.3.).

В левой части окна (она называется Classes ) находится список классов и перечислений, входящих в библиотеку Word (или в ту библиотеку, которая выбрана в поле Object Browser ), в окне Members of можно просмотреть методы , свойства и события выбранного в предыдущем окне класса .

Значок с изображением руки в этом окне означает свойство , значок молнии - событие , значок с изображением маленького предмета с черточками - метод .

Здесь нет информации о том, что делает тот или иной метод , что означает то или иное свойство и т.д. Как же узнать подробности? Для начала - задуматься над именами классов , объектов , свойств, методов , событий . Правда, для их понимания нужно знать значения английских слов, которые использованы для их именования.

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

Объектные модели приложений огромны. С одной стороны, для эффективного использования всех объектов , нужно хорошо в них разбираться, с другой же - запомнить все это многообразие очень сложно. К счастью, для повседневной работы вам достаточно знать лишь основные классы и объекты объектных моделей, а если вам понадобится что-нибудь особенное - всегда можно воспользоваться справкой или использовать макрорекордер .

Помимо обычных объектных моделей приложений Office, вы можете использовать в своих программах другие объектные модели. Например, программируя для Word , можете воспользоваться объектной моделью Excel а так же - любыми другими моделями, установленными в системе. Для этого нужно подключить нужные модели из редактора VBA с помощью команды меню Tools -> References (Инструменты o Ссылки) (рис. 2.4.).

В данном случае мы подключаем библиотеку Microsoft Excel (она ценна встроенными функциями) к Microsoft Word , то есть сможем пользоваться некоторыми функциями Excel в Word . Подключенные модели можно просматривать в окне Project Explorer.


Рис. 2.4. Подключение библиотеки объектов Microsoft Excel

Подключив объектную модель Microsoft Excel в Microsoft Word , вы сможете программно работать с документами MS Excel из программ, написанных в MS Word (и наоборот). Если вы собираетесь работать с базами данных - вам понадобится особая объектная модель ADO и т.д.

2.5. Старые и новые версии Office: совместная работа

Сегодня нередко встречается ситуация, когда пользователям приходится одновременно работать со старыми версиями MS Office (например, Office XP, 2003) и новыми (Office 2007). Как вы знаете, эти версии имеют различные форматы файлов. Например, в предыдущих версиях MS Word используется универсальный формат .doc для хранения файлов документов, .dot - для шаблонов, а в новой - .docx и .docm для документов (второй формат поддерживает макросы, а первый - нет), и . dotm - для шаблонов.

Новый Office нормально работает со старыми версиями файлов, в том числе и с файлами, содержащими макросы. Однако, если вы хотите, чтобы, скажем, ваши *.doc - файлы, содержащие макросы, гарантированно работали в Office 2007 - обязательно тестируйте их в среде Office 2007.

Старые версии в исходном виде не умеют работать с новыми файлами. Чтобы они смогли читать новые файлы, нужно установить специальный конвертер, который можно скачать с сайта Microsoft , однако это не гарантирует полную совместимость программного кода. Так, объектные модели приложений Office 2007 дополнены новыми объектами (например, OMath для работы с формулами в MS Word ).

Если вам приходится работать в среде, которая предусматривает параллельное использование двух разных версий Office, лучше всего создавать и отлаживать программы именно в той версии, в которой вы планируете их использовать.

Большая часть материала данной книги справедлива для всех современных версий Office, однако, как уже было сказано, объектные модели приложений различаются, поэтому, используя тот или иной объект в устаревших версиях - обязательно сверяйтесь со справочной системой или исследуйте операции с помощью макрорекордера.

2.6. Выводы

В этой лекции вы узнали самое главное о программировании на VBA . Теперь вы знаете, как найти редактор Visual Basic и где хранится код макроса. Теперь вам нужно научиться пользоваться редактором, ориентироваться в его инструментах. Всему этому посвящена следующая лекция.

Примечание: Мы стараемся как можно оперативнее обеспечивать вас актуальными справочными материалами на вашем языке. Эта страница переведена автоматически, поэтому ее текст может содержать неточности и грамматические ошибки. Для нас важно, чтобы эта статья была вам полезна. Просим вас уделить пару секунд и сообщить, помогла ли она вам, с помощью кнопок внизу страницы. Для удобства также приводим ссылку на оригинал (на английском языке) .

В своем коде можно задействовать другие объекты приложения, задав ссылки на библиотеку объектов этого приложения.

Добавление объекта

На вкладке "Разработчик" откройте окно проекта Visual Basic. Увидеть вкладки «разработчик» отображается ниже, если она еще не открыта.

В меню Сервис выберите пункт Ссылки.

Выбор параметров меню

В разделе Доступные ссылки установите флажок для библиотеки объектов, которую требуется задействовать в вашем проекте Visual Basic.

Диалоговое окно доступные ссылки

Примечание: Чтобы ускорить компиляцию, снимите флажки для библиотек объектов, которые не будут использоваться в проекте.

Чтобы задать порядок доступа к библиотекам объектов, в разделе Доступные ссылки выберите любую библиотеку и переместите ее вверх или вниз с помощью кнопок приоритета.

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

Найдите объект

На верхней панели выберите Excel > настройки > панель инструментов и ленты.

В разделе Настройка ленты выберите Основные вкладки и установите флажок Разработчик.

= Мир MS Excel/Статьи об Excel

AUTOMATION: использование Раннего и Позднего Связывания

Перевод статьи «Using early binding and late binding in Automation» с официального сайта поддержки Майкрософт. Перевод выполнен Романом Вороновым от 14-го июля 2015.

КРАТКОЕ СОДЕРЖАНИЕ

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

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Automation – это процесс, при котором некоторый программный компонент взаимодействует и / или контролирует другой программный компонент посредством Компонентно-Объектной Модели (на англ. COM) Майкрософта. Этот принцип лежит в основе большинства кросс-компонентных взаимодействий в таких языках как Visual Basic (VB) или Visual Basic for Applications (VBA) и стал неотъемлемой частью большинства программ.

Исторически, объект Automation – это любой объект, поддерживающий интерфейс IDispatch. Этот интерфейс позволяет клиенту запрашивать методы и свойства во время исполнения программы. Происходит это даже без предварительного знания об объекте на стадии разработки, с которым будет взаимодействие. Это называется поздним связыванием. Сегодня, однако, термин «Объект Automation» может быть использован в отношении любого объекта COM, даже не поддерживающего интерфейс IDispatch (и, следовательно, недоступного для позднего связывания). В этой статье предполагается, что объект, который Вы автоматизируете, поддерживает как позднее, так и раннее связывание.

Что же такое связывание?

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

Для большего понимания рассмотрим «связывание» применительно к публикации некоторых материалов. Представьте, что Ваш код – это текст книги, где в каком-то параграфе Вы пишите: «подробности смотрите далее в главе 12, на странице Х». Вы не знаете точный номер страницы, пока книга не закончена. Поэтому до того, как параграф будет прочтён, все страницы книги должны быть «связаны» вместе чтобы Вы могли проставить конкретный номер страницы для ссылки. Приходится ждать, пока книга будет закончена, «связана», чтобы можно было обращаться к разным её частям.

Связывание в программировании носит те же черты. Ваш код состоит из частей, которые должны быть собраны вместе до того, как код может быть «прочтён». Связывание – это замена имён функций на адреса в памяти (или, что точнее, на смещения памяти), куда код будет «прыгать» при вызове этих функций. Для COM объектов адрес – это смещение по памяти в таблице указателей объекта (так называемая v-таблица). COM-функция связывается через таблицу указателей.

Структура COM-объекта довольно проста. Когда код содержит ссылку на объект – он содержит косвенное указание на вершину таблицы указателей. А таблица указателей - ни что иное как массив адресов в памяти, каждая запись которого ведёт к разным функциям данного объекта. Например, для вызова 3-й функции COM-объекта нужно прыгнуть сверху таблицы до 3-й записи и пройти к указанной здесь области памяти. Это исполнит код функции и, по завершению, возвратит нас к исполнению следующей строки основного кода.

Все COM объекты наследуются от интерфейса IUnknown («неизвестный» интерфейс, англ.) и первые три записи в таблице указателей являются методами этого интерфейса. Поэтому, например, при необходимости освободить объект – вызывается третья функция в таблице указателей (IUnknown::Release).

К слову, эта работа выполняется языком Visual Basic самостоятельно, «за кулисами» программирования. Как VB программист, Вам не придётся работать с таблицей указателей напрямую. Однако, это - основа связывания COM-объектов, крайне важная для понимания процесса связывания.

Раннее связывание

Описанный выше пример – классическое раннее связывание (или связывание через таблицу указателей). Для всех COM объектов эта форма связывания имеет место всякий раз, когда вызывается IUnknown интерфейс этого объекта. Но что насчёт других функций этого объекта? Как вызвать метод обновления или родительское свойство? Эти привычные функции уникальны для объекта. А если положение этих функций в таблице указателей заведомо неизвестно, то как найти адреса для их вызова?

Ответ, конечно, зависит от того, знаем ли мы (или нет) заведомо об устройстве таблицы указателей объекта. Если мы знаем, то можно проделать тот же трюк, что ранее описан про освобождение объекта через метод интерфейса IUnknown: «прыжком» заданной длины до нужного места в таблице указателей. Это пример того, что принято считать «ранним связыванием».

Для применения раннего связывания к объекту следует ориентироваться в его таблице указателей. На языке Visual Basic это можно сделать через добавление ссылки на библиотеку типов, описывающую объект, его интерфейс (таблица указателей) и на все функции объекта. После чего можно объявить объект принадлежащим к конкретному типу и использовать объект через его таблицу указателей. Например, если необходимо автоматизировать MSO Excel с использованием раннего связывания – следует добавить ссылку на «Microsoft Excel [?].0 Object Library» (где [?] зависит от версии используемого приложения Excel) в меню «References» (ссылки) проекта и объявить переменную с типом «Excel.Application». С этого момента любой вызов Вашей объектной переменной будет работать с ранним связыванием:


Этот приём отлично работает в большинстве случаев. Но что, если на стадии разработки нам заведомо неизвестно, какой объект мы будем использовать? К примеру, что, если необходимо обращаться к множеству версий Excel или к вообще неизвестному объекту?

Позднее связывание

COM включает интерфейс IDispatch. Объекты, использующие IDispatch, имеют либо диспинтерфейс (если IDispatch – единственный поддерживаемый ими интерфейс), либо двойной интерфейс (если плюс к первому у них есть привычный интерфейс, к которому можно применить раннее связывание). При использовании IDispatch интерфейса для связывания считается, что применяется «позднее связывание». При этом точные положения свойств и методов, вызываемых клиентом, в ходе работы программы определяются методами самого IDispatch. Возвращаясь к примеру с книгой: представьте, что вместо указания нужной страницы в тексте есть сноска, пройдя по которой мы найдём содержание, в котором ещё нужно будет найти номер нужной страницы. И всё это во время чтения нашей условной книги.

Магия интерфейса поддерживается двумя функциями: GetIDsOfName («получить идентификаторы имён» с англ.) и Invoke («вызов» с англ.). Первая функция связывает имена функций с особым идентификатором. А когда идентификатор нужной функции известен – оную можно вызвать с помощью функции Invoke. Такая форма вызова методов называется «поздним связыванием».

Запомните, в Visual Basic способ связывания задаётся объявлением объекта. Когда объект инициализируется как переменная типа «Object» - мы, по сути, говорим Visual Basic’у использовать интерфейс IDispatch, тем самым применяя позднее связывание:


Как видите, весь остальной код такой же, как и при раннем связывании. Единственное отличие при написании кода – в объявлении переменной.

Заметьте, что «позднее связывание» касается вызываемой функции, а не способа её вызова. Из ранее изложенного материала следует, что к интерфейсу IDispatch уже применяется «раннее связывание». Для задания свойства видимости, Visual Basic обращается к таблице указателей (IDispatch::Invoke). И уже COM-объект несёт ответственность за перенаправление запроса к корректной функции для отрисовки Excel приложения. Подобное перенаправление позволяет Visual Basic клиенту быть скомпилированным (при этом, привязанным к корректному адресу функции) и вместе с этим не знать саму функцию, с которой будет дальше работать.

Связывание идентификатора

Некоторые клиенты автоматизации (в первую очередь пакеты MFC и Visual Basic 3.0, хотя также касается Visual Basic 5.0, 6.0) используют смешанную форму позднего связывания – связывание идентификатора. Если COM объект известен на этапе разработки, идентификаторы вызываемых функций могут быть захвачены и направлены на IDispatch::Invoke напрямую. При этом нет необходимости в вызове GetIDsOfNames во время работы программы. Этим значительно увеличивается производительность, так как вместо двух вызовов COM на каждую функцию - происходит только один.

Связывание идентификатора нельзя выбрать напрямую в Visual Basic 5.0 или 6.0. Оно используется для объектов, которые обозначены в библиотеке типов, но не содержат обычного интерфейса (объекты только с одним диспинтерфейсом) и для элементов управления ActiveX. При этом везде, где это возможно, Visual Basic будет использовать раннее связывание по умолчанию.

Какое связывание стоит использовать?

Ответ на этот вопрос зависит в первую очередь от структуры Вашего проекта. Microsoft рекомендует раннее связывание в большинстве случаев. Однако, могут быть причины выбрать и позднее связывание. Раннее связывание – предпочтительный метод. Его достоинство – в привязке приложения напрямую к адресу вызываемой функции, никаких поисков ссылок в режиме исполнения программы. С точки зрения скорости исполнения – минимум вдвое быстрее позднего связывания.

Раннее связывание также обеспечивает безопасность при работе с типами. Когда у Вас привязана ссылка к библиотеке типов компонента, Visual Basic поддерживает IntelliSense технологию (автоматическое предложение свойств и методов по первым введённым символам), что позволяет кодировать каждую функцию корректно. Visual Basic также предупредит, если тип данных параметра или возвращаемого значения некорректен, что сэкономит время на написании и исправлении кода.

Позднее связывание по-прежнему применимо в ситуациях, когда конкретный интерфейс объекта ещё не известен на стадии разработки. Если предполагается, что Ваше приложение будет обращаться к множеству неизвестных серверов или ему потребуется вызывать функции по имени (например, с помощью CallByName функции в Visual Basic 6.0), тогда потребуется позднее связывание. Позднее связывание также полезно при работе с вопросами совместимости между разными версиями компонента, интерфейс которого от версии к версии претерпевал изменения.

Преимущества раннего связывания призывают использовать оное везде, где это возможно.

Сохранение совместимости между версиями

Если предстоит использовать компонент, который Вы не предоставляете вместе с установочным пакетом и нет уверенности в версии, с которой предстоит взаимодействовать – стоит уделить особое внимание раннему связыванию с интерфейсом, совместимым со всеми версиями компонента. Или (в некоторых случаях) используйте позднее связывание для вызова метода, который может быть в конкретной версии, и с достоинством ударьте в грязь лицом, если этот метод отсутствует.

Приложения Microsoft Office – хороший пример подобных COM-серверов. Офисные приложения обычно расширяют свои интерфейсы для добавления нового функционала или для коррекции предыдущих меж-версионных наработок. Если требуется автоматизировать офисное приложение, раннее связывание рекомендуется с самой ранней версией продукта из предполагаемых в системе Вашего клиента. Например, если нужно разработать решение для Excel 95, Excel 97, Excel 2000 и Excel 2002 – следует использовать библиотеку типов для Excel 95 (XL5en32.olb) для обеспечения совместимости со всеми тремя версиями.

Офисные приложения показывают, как объектные модели с большими двойными интерфейсами могут испытывать серьёзные ограничения при переносе на некоторые платформы. Наилучшим будет выбрать IDispatch интерфейс для работы на разных платформах. Более подробно о поддержке совместимости с офисными приложениями можно посмотреть ЗДЕСЬ (ссылка на англоязычную статью).

Более детальную информацию по COM, таблицам указателей и использованию автоматизации можно найти в книгах:
1). Rogerson, Dale, Inside COM, MSPRESS, ISBN: 1-57231-349-8.
2). Curland, Matt, Advanced Visual Basic 6, DevelopMentor, 0201707128.

Идентификатор статьи: 245115, последнее обновление от 5 ноября 2007 года в 16:31:03, версия 7.2
Применимо к:
- Microsoft Office Ultimate 2007
- MicrosoftOffice Enterprise 2007
- MicrosoftOffice Professional 2007
- MicrosoftOffice Professional Plus 2007
- MicrosoftOffice Standard 2007
- MicrosoftOffice Home and Student 2007
- MicrosoftOffice Basic 2007
- MicrosoftOffice 2003, All Editions
- MicrosoftOffice XP Developer Edition
- MicrosoftOffice 2000 Developer Edition
- MicrosoftVisual Basic 5.0 Professional Edition
- MicrosoftVisual Basic 6.0 Professional Edition
- MicrosoftVisual Basic 5.0 Enterprise Edition
- MicrosoftVisual Basic Enterprise Edition for Windows 6.0
Ключевые слова: kbautomation kbinfo KB245115

Вы сами написали макрос и кому-то выслали. Макрос хороший и рабочий. Вы сами проверили и перепроверили. Но тут Вам сообщают - "Макрос не работает". Выдает ошибку - Can't find project or library. Вы запускаете файл - нет ошибки. Еще раз - нет. Как ни пытаетесь, какие данные не подсовываете, а ошибки такой нет. Вы уверены, что файл рабочий полностью(и верно - ведь у Вас работает), а Вам пытаются доказать обратное. Вы начинаете долго объяснять как пользоваться, что делать и т.д. и т.п. Ошибка не исчезает. Что делать-то? В чем проблема? Даже офис переустановили - у Вас работает, у них нет. А проблема проста: как и любой программе, VBA нужно иметь свой набор библиотек и компонентов, посредством которых он взаимодействует с Excel(и не только). И в разных версиях Excel эти библиотеки и компоненты могут различаться. И когда Вы делаете у себя программу, то VBA ставит ссылку(или же Вы сами) на какой-либо компонент либо библиотеку, которая может отсутствовать на другом компьютере. Вот тогда и появляется эта ошибка. Что же делать? Все очень просто:

  1. Открываете редактор VBA
  2. Идете в Tools-References
  3. Находите там все пункты, напротив которых красуется MISSING. Снимаете с них галочки.
  4. Жмете Ок.
  5. Сохраняете файл.

Эти действия необходимо проделать, когда выполнение кода прервано и ни один код проекта не выполняется. Возможно, придется перезапустить Excel. И все это должен проделать человек, у которого данная ошибка возникла. Это не всегда удобно. А поэтому лично я рекомендовал бы не использовать сторонние библиотеки и раннее связывание, если это не вызвано необходимостью. Всегда проверяйте ссылки в файлах перед отправкой получателю. Оставьте там лишь те ссылки, которые необходимы, либо которые присутствуют на всех версиях. Смело можно оставлять следующие(это касается именно VBA-Excel):

  • Visual Basic for application(эту ссылку Вы попросту не сможете отключить);
  • Microsoft Excel XX.0 Object Library(вместо X версия приложения - 12, 11 и т.д.)-эту ссылку Вы не сможете отключить;
  • Microsoft Forms X.0 Object Library(эту ссылку Вы не сможете отключить);
  • OLE Automation(хотя она тоже не нужна - но и вреда никакого).

Может я перечислил не все - но эти точно имеют полную совместимость между разными версиями Excel.

Еще, для автоматического поиска и отключения ошибочных ссылок на такие библиотеки можно делать и макросом:

Sub Remove_MISSING() Dim oReferences As Object, oRef As Object Set oReferences = ThisWorkbook.VBProject.References For Each oRef In oReferences If (oRef.IsBroken) Then oReferences.Remove Reference:=oRef Next End Sub

Но для работы этого макроса необходимо:

  1. проставить доверие к проекту VBA:
    Excel 2010-2019 - Файл-Параметры-Центр управления безопасностью-Параметры макросов-поставить галочку "Доверять доступ к объектной модели проектов VBA"
    Excel 2007 - Кнопка Офис-Параметры Excel-Центр управления безопасностью-Параметры макросов-поставить галочку "Доверять доступ к объектной модели проектов VBA"
    Excel 2003 - Сервис - Параметры-вкладка Безопасность-Параметры макросов-Доверять доступ к Visual Basic Project
  2. проект VBA не должен быть защищен.

Так же Can't find project or library возникает если у Вас просто не подключена какая-либо библиотека, которая используется в коде. Тогда не будет MISSING. Надо просто определить, в какую библиотеку входит константа, объект или свойство, которое выделяет редактор при выдаче ошибки, и подключить эту библиотеку.
Например, есть такой кусок кода:

В качестве примера мы рассмотрим подключение библиотеки SDL к нашему проекту в Visual Studio 2017 (работать будет и с более новыми версиями Visual Studio).

Шаг №1: Создаем папку для хранения библиотеки

Создаем папку Libs на диске C ( C:\Libs ).

Шаг №2: Скачиваем и устанавливаем библиотеку



Шаг №3: Указываем путь к заголовочным файлам библиотеки

Открываем свой любой проект в Visual Studio или создаем новый, переходим в "Обозреватель решений" > кликаем правой кнопкой мыши (ПКМ) по названию нашего проекта > "Свойства" :


В "Свойства конфигурации" ищем вкладку "С/С++" > "Общие" . Затем выбираем пункт "Дополнительные каталоги включаемых файлов" > нажимаем на стрелочку в конце > "Изменить" :


В появившемся окне кликаем на иконку с изображением папки, а затем на появившееся троеточие:


Заголовочные файлы находятся в папке include внутри нашей библиотеки, поэтому переходим в нее ( C:\Libs\SDL2-2.0.9\include ) и нажимаем "Выбор папки" , а затем "ОК" :



Шаг №4: Указываем путь к файлам с реализацией библиотеки

Переходим на вкладку "Компоновщик" > "Общие" . Ищем пункт "Дополнительные каталоги библиотек" > нажимаем на стрелочку в конце > "Изменить" :


Опять же, нажимаем на иконку с папкой, а затем на появившееся троеточие. Нам нужно указать следующий путь: C:\Libs\SDL2-2.0.9\lib\x86 . Будьте внимательны, в папке lib находятся две папки: x64 и x86 . Даже если у вас Windows разрядности x64, указывать нужно папку x86 . Затем "Выбор папки" и "ОК" :


После этого переходим в "Компоновщик" > "Ввод" . Затем "Дополнительные зависимости" > нажимаем на стрелочку в конце > "Изменить" :


В появившемся текстовом блоке вставляем:


Затем переходим в "Компоновщик" > "Система" . После этого "Подсистема" > нажимаем на стрелочку вниз > выбираем "Консоль (/SUBSYSTEM:CONSOLE)" > "Применить" > "ОК" :



Шаг №5: Копируем dll-ку в папку с проектом

Переходим в папку x86 ( C:\Libs\SDL2-2.0.9\lib\x86 ), копируем SDL2.dll и вставляем в папку с вашим проектом в Visual Studio. Чтобы просмотреть папку вашего проекта в Visual Studio, нажмите ПКМ по названию вашего проекта > "Открыть содержащую папку" :


Затем вставляем скопированный файл (SDL2.dll) в папку с проектом (где находится рабочий файл .cpp):


Шаг №6: Тестируем

Теперь, чтобы проверить, всё ли верно мы сделали — копируем и запускаем следующий код:

Читайте также: