Надстройка Excel — альтернатива ActiveMenuBar.Reset

Проблема: после обновления Office 2010 до 2013 надстройка Essbase Excel ("essexcln.xll", поддержка которой Oracle прекратилась в 2013 году) приводит к тому, что фокус всегда возвращается к окну с активное соединение, когда открыто более 1 окна. Если надстройка Essbase загружается при запуске, Excel также зависает. Обратите внимание, что Smartview заменил эту надстройку, но по другим причинам мне нужно продолжать ее использовать. Я могу вручную перейти в меню «Файл» > «Параметры» > «Надстройки» > «Управление надстройками Excel» и вручную проверить/снять отметку, когда Essbase вызывает эти ошибки, но я бы предпочел сделать это с помощью быстрого сочетания клавиш.

Временное решение. Создайте пользовательскую надстройку, чтобы быстро переключать свойство надстройки Essbase installed для ее загрузки и выгрузки. Возможно, надстройка — это излишество, но на самом деле я не использую PERSONAL.XLSB, и мне бы хотелось, чтобы эта функция была доступна в любое время.

Проблема 2. Когда надстройка Essbase выгружена, в строке меню «Надстройка» по-прежнему отображается настраиваемая команда: «О надстройке электронных таблиц Oracle Essbase». «Essexcln.xll», как известно, содержит ошибки, и это «О надстройке электронных таблиц Oracle Essbase» может задерживаться, даже если надстройка не отмечена вручную. Мое решение — использовать ActiveMenuBar.Reset — только после того, как я выгрузил надстройку. Я не хочу выполнять сброс, если я только что переключил Installed на True.

Есть ли альтернатива ActiveMenuBar.Reset? Это похоже на взлом — вроде как использование ActiveCell или ActiveSheet — но я не хочу вручную проверять/снимать галочку надстройки, которая в любом случае может очищать или не очищать «About Essbase...».

Примечания: Да, возможно, не самый эффективный цикл через Add-ins, но их так мало, что мне все равно. Я бы предпочел избегать использования ActiveMenuBar.

Панель меню надстроек

Sub Toggle_Essbase_AddIn()

Dim x As AddIn
Dim installed As Boolean

For Each x In Application.AddIns
    If x.Name = "essexcln.xll" Then
        ' Get initial installed status
        installed = x.installed
        ' Toggle
        x.installed = Not x.installed
        ' Reset menu bar if Essbase was initially installed
        If installed Then
            ActiveMenuBar.Reset
        End If

        Exit Sub
    End If
Next x

End Sub

person Community    schedule 22.03.2018    source источник


Ответы (1)


В нынешнем виде ваш код невероятно неэффективен до такой степени, что трудно объяснить, почему. Глядя на ядро ​​​​вашей процедуры (после удаления неиспользуемого пространства), мы имеем:

Sub Toggle_Essbase_AddIn()
    Dim x As AddIn, installed As Boolean
    If x.Name = "essexcln.xll" Then
        installed = x.installed
        x.installed = Not x.installed
        If installed Then
            ActiveMenuBar.Reset
        End If
        Exit Sub
    End If
End Sub

Во-первых, эта строка абсолютно ничего не делает:

x.installed = Not x.installed

...поскольку после было установлено значение installed.

Я могу только предположить, что вы намеревались переключить значение, которое передается переменной installed?

Это избавит вас от путаницы, если вы проявите немного больше творчества с именами переменных, вместо того, чтобы рисковать словом, которое для всех интенсивных целей может считаться Reserved< /эм>. Не разбирая семантику, лучше не называть ваши переменные словами, которые VBA хочет использовать для других целей, и это прекрасный пример того, почему. Даже если VBA не запутается, вы можете, и у вас есть почти бесконечное количество других, более значимых имен на выбор.

Предполагая, что целью было переключить значение, которое передается переменной installed, вы могли бы пойти:

If x.Name = "essexcln.xll" Then
    installed = not x.installed
    If installed Then
        ActiveMenuBar.Reset
    End If
    Exit Sub
End If

Желательно, чтобы вы использовали команды Exit с осторожностью или вообще не использовали их — только когда нет возможности выйти из цикла/подпрограммы/если «естественным образом», но я не буду вдаваться в это сейчас, так как сейчас это не имеет значения.

...или еще лучше:

installed = Not ( x.Name = "essexcln.xll" )
If installed Then
    ActiveMenuBar.Reset
End If

...или еще короче:

If Not ( x.Name = "essexcln.xll" ) then ActiveMenuBar.Reset

... так что теперь вся ваша подпрограмма будет:

Sub Toggle_Essbase_AddIn()

    Dim x As AddIn
    Dim installed As Boolean

    For Each x In Application.AddIns
        If Not ( x.Name = "essexcln.xll" ) then ActiveMenuBar.Reset
    Next x

End Sub

... но вы по-прежнему излишне неэффективны.

Нет причин перебирать AddIns. Быстрый просмотр в Google Application.Addins показывает, что проще всего обращаться к надстройке по ее имени.

Я никогда не пользовался Essex, но еще один быстрый Google, чтобы найти документация надстройки говорит мне, что надстройка называется "Oracle Essex".

Поэтому одна строка заменяет всю процедуру:

If Not AddIns("Oracle Essbase").Installed Then ActiveMenuBar.Reset

(или я не уверен, что это должно было НЕ быть NOT, потому что ваш код был неясен) - но это гораздо эффективнее и делает эквивалент вашего кода - если вы уверены, что надстройка действительно существует (не то же самое, что установлено, погуглите), то это делает то же самое, что и вся ваша процедура.

Если вы не уверены, существует ли надстройка, Google снова спасает вас, предоставляя ссылку на Вопрос о переполнении стека.

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

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

Я предлагаю вам изучить документацию о надстройках и панелях инструментов в MSDN, а также документацию по надстройкам сторонних производителей в Oracle ( по ссылкам выше, и подссылкам с этих страниц), и я уверен, что приложив некоторые усилия, ваше решение станет ясным.

Если нет, я предлагаю вам добавить больше информации к вашему вопросу. ...и, пожалуйста, не пытайтесь писать "надстройки для надстроек"!

Удачи (и добро пожаловать в Stack Overflow!)


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

person ashleedawg    schedule 29.05.2018
comment
1) Во-первых, эта строка абсолютно ничего не делает: - это не моя проблема, и она работает нормально. Это эквивалентно проверке/снятию флажка надстройки Управление надстройками Excel. 2) Быстрые решения из предложенного вами поиска Google, которые дают больше ответа на мой вопрос, намекают на использование надстроек «Управление Excel» - именно то, чего я хотел избежать в первую очередь. 3) FWIW, меня не очень волнует этот вопрос, я задал его скорее из любопытства, так как в настоящее время он работает. Пожалуйста, не думайте, что я не провел свое исследование и/или не унижаю честную попытку. - person ; 30.05.2018
comment
Кроме того, ваша ссылка на Essbase указывает на файл esstoolb.xls. Вот правильная ссылка essexcln.xll - но это совершенно не подходит для моего вопроса. - person ; 30.05.2018
comment
@BigBen Я упомянул, что будут некоторые упущения; Я уже потратил слишком много времени на один вопрос. Внимание: вопросы просто из любопытства многие не одобряются. Тем не менее мой ответ демонстрирует один пример упрощения избыточного кода и указывает правильное направление для других нынешних и будущих пользователей (точка переполнения стека) - жаль слышать, что вы не нашли в этом ценности. Удачи. - person ashleedawg; 30.05.2018