-1

问题:从 Office 2010 升级到 2013 后,Essbase Excel 加载项(“essexcln.xll”,Oracle 于 2013 年终止支持)导致焦点始终返回到具有活动连接的窗口,当有更多超过 1 个窗口打开。如果 Essbase 加载项在启动时加载,Excel 也会冻结。请注意,Smartview 已替换此加载项,但出于其他原因,我需要继续使用它。当 Essbase 导致这些错误时,我可以手动转到文件 > 选项 > 加载项 > 管理 Excel 加载项并手动检查/取消检查,但我宁愿使用快速键盘快捷键来执行此操作。

解决方法:创建自定义加载项以快速切换 Essbase 加载项installed属性以加载和卸载它。也许加载项是矫枉过正 - 但我并没有真正使用 PERSONAL.XLSB,我希望此功能始终可用。

问题2:卸载Essbase插件后,“插件”菜单栏仍显示自定义命令:“关于Oracle Essbase电子表格插件”。“Essexcln.xll”是出了名的错误,即使手动取消选中该加载项,这个“关于 Oracle Essbase 电子表格加载项”也会持续存在。我的解决方案是使用ActiveMenuBar.Reset- 只有在我卸载了加载项之后。如果我刚刚切换InstalledTrue.

有替代方案ActiveMenuBar.Reset吗?这感觉像是一种 hack - 有点像使用ActiveCellor ActiveSheet- 但我不想手动检查/取消检查插件,无论如何这可能会或可能不会清除“关于 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
4

1 回答 1

0

就目前而言,您的代码效率非常低,以至于很难解释原因。查看您的程序的核心(在删除浪费的空间之后),我们有:

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

...但你仍然是不必要的低效。

没有理由循环通过加载项。快速的谷歌Application.Addins显示最容易通过它的名称来引用加载项。

我从未使用过 Essex,但另一个快速的 Google 查找插件文档告诉我插件的名称是“Oracle Essex”。

因此,一行替换了您的整个过程

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

(或者我不确定它是否打算不是NOT因为您的代码不清楚)-但这要高效得多,并且与您的代码等效-只要您确定插件确实存在(不是与已安装的相同,谷歌它),那么这与您的整个过程相同。

如果您不确定该加载项是否存在,那么 Google 会再次通过指向Stack Overflow 问题的链接来节省时间。

由于我没有插件并且您没有包含任何具体的问题示例,我不能确定这是否完全回答了这个问题,但我向您保证,自己需要一些额外的时间编码方面的勤奋最终将为您和其他人带来很多努力。

注意,我有很多东西要写到“一行”,所以我不能保证没有疏忽,但这里的教训更多是关于编码前的研究。

我建议您研究MSDN上有关插件和工具栏的文档,以及Oracle上针对第 3 方插件的文档(通过上面的链接这些页面的子链接),我相信通过一些努力您的解决方案将变得清晰。

如果没有,我建议您在问题中添加更多信息。...请不要尝试编写任何“加载项加载项”!

祝你好运(欢迎来到 Stack Overflow!)


...毕竟,我注意到您添加了指向图像的链接而不是添加图像,因此它会更加引人注目。如果不单击工具栏,我无法分辨,但我很确定这不是菜单栏命令。那是一个功能区组,它是空的。

于 2018-05-29T21:23:52.693 回答