Загрузка надстроек при программном создании экземпляра Excel

Я пытаюсь создать новый экземпляр Excel с помощью VBA, используя:

Set XlApp = New Excel.Application

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

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


person Jon Fournier    schedule 17.10.2008    source источник


Ответы (4)


Я снова рассмотрел эту проблему, и в коллекции Application.Addins, похоже, есть все надстройки, перечисленные в меню «Инструменты-> Надстройки», с логическим значением, указывающим, установлена ​​​​надстройка или нет. Итак, сейчас мне кажется, что я перебираю все надстройки, и если .Installed = true, то я устанавливаю .Installed на False и обратно на True, и это, кажется, правильно загружает мои надстройки.

Function ReloadXLAddins(TheXLApp As Excel.Application) As Boolean

    Dim CurrAddin As Excel.AddIn

    For Each CurrAddin In TheXLApp.AddIns
        If CurrAddin.Installed Then
            CurrAddin.Installed = False
            CurrAddin.Installed = True
        End If
    Next CurrAddin

End Function
person Jon Fournier    schedule 30.04.2009
comment
+1 к твоему же вопросу! Вроде обмана. ;-) Хороший ответ, однако, это определенно добавляет к совокупности знаний. - person Mike Rosenblum; 11.10.2009
comment
Да, это обходной путь для проблемы с не загруженными надстройками. - person A9S6; 04.12.2009
comment
Слишком долго раздражался на это. Хороший ответ. - person JDunkerley; 17.12.2012
comment
как я могу использовать эту функцию? Я получаю ошибку VALUE, когда вставляю это на лист. - person JoaMika; 04.05.2014
comment
Вы не можете использовать эту функцию из электронной таблицы. Вы можете попробовать удалить переменную TheXLApp из объявления функции и вместо использования TheXLApp в теле подпрограммы использовать Application. Хотя я не знаю, сработает ли это. Вы также можете изменить его, чтобы он возвращал числовое значение, чтобы вы могли запускать функцию только в том случае, если она еще не запущена. - person Jon Fournier; 05.05.2014
comment
В качестве предупреждения: если вы работаете с несколькими экземплярами Excel, этот подход МОЖЕТ оставить ваши надстройки отключенными от экземпляра, в котором они ранее были включены. Однако, похоже, это зависит от того, какой тип надстройки загружается. - person tobriand; 20.04.2016
comment
Что я передаю в качестве аргумента при вызове функции? Не могли бы вы объяснить первую строку. Почему вы создаете объект приложения? Я открываю excel из vbscript, поэтому должен ли я использовать тот же объект приложения excel, который я там создаю? (вместо TheXLApp) - person ThomasRones; 16.11.2017
comment
@OligarchicTendencies, которые вы просто передаете объекту приложения Excel, с которым работаете. Я написал это как функцию, потому что мое приложение запускает Excel несколькими способами в зависимости от того, что мы делаем, поэтому я просто вызываю это, когда запускаю приложение Excel. - person Jon Fournier; 17.11.2017
comment
Это также работает для надстроек Word после Set oWord = CreateObject("Word.Application"). Просто измените Excel на Word в функции. - person Andre; 07.08.2019

К сожалению, использование CreateObject("Excel.Application") будет иметь тот же результат, что и использование New Excel.Application.

Вам нужно будет загрузить надстройки, которые вам нужны по отдельности, по пути и имени файла, используя метод Application.Addins.Add(string fileName).

person Mike Rosenblum    schedule 17.10.2008
comment
Это очень полезно в моей ситуации, когда я запускаю Excel и хочу, чтобы надстройка, которая обычно не загружается, была активной. - person 4AM; 03.05.2017

Я оставляю этот ответ здесь для всех, кто столкнулся с этой проблемой, но использует JavaScript.

Немного предыстории... В моей компании есть стороннее веб-приложение, которое использует JavaScript для запуска Excel и создания электронной таблицы на лету. У нас также есть надстройка Excel, которая переопределяет поведение кнопки «Сохранить». Надстройка дает вам возможность сохранить файл локально или в нашей онлайн-системе управления документами.

После обновления до Windows 7 и Office 2010 мы заметили проблему с нашим веб-приложением для создания электронных таблиц. Когда JavaScript сгенерировал электронную таблицу в Excel, кнопка «Сохранить» внезапно перестала работать. Вы бы нажали сохранить, и ничего не произошло.

Используя другие ответы здесь, я смог создать решение на JavaScript. По сути, мы создаем объект приложения Excel в памяти, а затем перезагружаем конкретную надстройку, чтобы вернуть наше поведение кнопки сохранения. Вот упрощенная версия нашего исправления:

function GenerateSpreadsheet()
{
    var ExcelApp = getExcel();
    if (ExcelApp == null){ return; }

    reloadAddIn(ExcelApp);

    ExcelApp.WorkBooks.Add;
    ExcelApp.Visible = true;
    sheet = ExcelApp.ActiveSheet;

    var now = new Date();
    ExcelApp.Cells(1,1).value = 'This is an auto-generated spreadsheet, created using Javascript and ActiveX in Internet Explorer';

    ExcelApp.ActiveSheet.Columns("A:IV").EntireColumn.AutoFit; 
    ExcelApp.ActiveSheet.Rows("1:65536").EntireRow.AutoFit;
    ExcelApp.ActiveSheet.Range("A1").Select;

    ExcelApp = null;
}

function getExcel() {
   try {
       return new ActiveXObject("Excel.Application");
   } catch(e) {
       alert("Unable to open Excel. Please check your security settings.");
       return null;
   }
}

function reloadAddIn(ExcelApp) {
    // Fixes problem with save button not working in Excel,
    // by reloading the add-in responsible for the custom save button behavior
    try {
        ExcelApp.AddIns2.Item("AddInName").Installed = false;
        ExcelApp.AddIns2.Item("AddInName").Installed = true;
    } catch (e) { }
}
person Ben Brandt    schedule 06.06.2013

Пытаться:

Set XlApp = CreateObject("Excel.Application")

person Ken Paul    schedule 17.10.2008