Excel:需要来自VBA宏

时间:2017-12-12 11:50:01

标签: excel vba excel-vba powerquery excel-addins

该方案是Windows Server 2012 R2,64位; Excel 2010,32位。许多用户,只有其中几个拥有管理权限。我从内置管理员安装了Power Query。没有询问任何内容,为所有用户安装了加载项;我的意思是它的设置可以在HKLM下的注册表项中找到,而不是HKCU。

关键是

HKEY_LOCAL_MACHINE -> SOFTWARE -> Wow6432Node -> Microsoft -> Office -> Excel -> AddIns -> Microsoft.Mashup.Client.Excel

,相关值为

LoadBehavior (REG_DWORD)

现在只有少数用户真的需要Power Query。每次启动Excel时,我都不希望它为每个人加载。我为LoadBehavior值尝试了一些不同的设置(请参阅this链接)。我找到了以下内容:

  • 如果LoadBehavior = 2,则不会为任何用户加载加载项。
  • 如果LoadBehavior = 3,则为所有用户加载加载项。但是,如果我为特定用户(在注册表中)创建特定密钥,则用户可以从Excel禁用该加载项。例如,在HKEY_CURRENT_USER中,密钥的路径是:
  

软件 - >微软 - >办公室 - > Excel - > Addins - > -Microsoft.Mashup.Client.Excel

  • 更具体地说,将用户密钥放入LoadBehavior值就足够了,这允许用户决定是否要加载加载项。值3表示"加载",值2表示"无负载"。
  • 我需要恰恰相反:加载项通常没有加载,有些用户允许加载它。我发现可以将HKLM中的LoadBehavior设置为9.这意味着"按需加载"。即,仅当用户根据加载项本身需要操作时才加载加载项。对我来说很好。
  • 此时我可能会忽略特定用户的密钥(例如在HKCU中)。但是,我发现如果我创建它,它优先于HKLM(当后者具有LoadBehavior = 9时)。因此,对于特定用户,可以决定使用加载项"始终加载"模式。只需在HKCU下的密钥中设置LoadBehavior = 3.

这一切似乎都很好。现在问题是我需要从VBA过程调用一些Power Query操作。如果已加载Power Query,则一切正常。但如果没有加载,即使使用"按需加载"设置,操作失败。为了加载Power Query,必须按下Excel GUI上的某个按钮,该按钮调用Power Query操作。

我发现VBA中有一个加载项对象的属性,它指示加载项是否已加载,并且可以设置为从VBA加载或卸载加载项。它是:

Application.COMAddIns.Item("Microsoft.Mashup.Client.Excel").Connect

如果是True,则加载加载项,如果加载False,则加载加载项。

现在应该可以通过将此属性设置为True来加载加载项。但是,在我的方案中情况并非如此:结果是错误(80004005)。这似乎是与没有管理权限的用户相关的问题。请参阅this页面 - 此行为被视为错误。

我的最后一个想法,我将在稍后尝试,是完全删除HKLM下的密钥中的LoadBehavior。我已经检查过,这会阻止用户看到加载项,除非创建了特定于用户的密钥,在这种情况下,用户可以自动设置加载项加载行为。我将看到在这种情况下从VBA请求加载时会发生什么。

与此同时,我很感激任何想法来解决这个问题:Power Query没有正常加载,可能是按需提供所有用户,从VBA自动加载(至少对某些用户来说),所有这一切都没有手动为所有用户添加特定于用户的密钥。可以为少数用户添加此密钥,即实际需要Power Query的用户。

修改

删除或重命名HKLM下的密钥中的LoadBehavior值。然后,只有在HKCU下具有特定密钥的用户才能看到Power Query。如果在此键中,LoadBehavior的值设置为3(或2),则默认情况下加载加载项(分别未加载)。更改.Connect属性的VBA指令工作正常;它将LoadBehavior切换为3(True)和2(False)。幸运的是,我还可以在注册表中设置LoadBehavior = 9(在HKCU下),并且.Connect属性仍然是可写的。在这种情况下,当为此属性分配一个True值时,加载加载项,但LoadBehavior值仍然保持在9,因此在关闭并重新打开Excel时,加载项被卸载,设置为&#34 ;按需加载",可以从VBA加载。

这正是我所寻找的行为;唯一需要注意的是,需要为需要Power Query的所有用户创建密钥。因为在我的情况下,他们可能只用一只手的手指,这个解决方案是可以接受的。

我仍然很想知道是否有人能提供更好的解决方案。

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用Powershell脚本相应地为每个用户更新注册表项?下面的示例有点复杂,第111行具有您需要为许多用户设置的循环。

https://daniel.streefkerkonline.com/2014/04/09/re-enable-microsoft-office-add-ins-with-powershell/

我的另一建议是您不应在Excel 2010中使用VBA来调用与PowerQuery相关的任何内容。考虑到它是一个外接程序,我认为它不包含在Excel 2010的服务协议中。Excel2010中未完全支持与PowerQuery的VBA交互,也未对其进行调试。我注意到有几个补丁完全破坏了PowerQuery中的GUI。可以升级到Excel 2013或2016。

在使用Excel 2016 VBA编辑器与PowerQuery进行交互时,宏代码难以调试和正常工作,并且其引用文献记录很少。向您显示错误不仅会崩溃,而且更加稳定,但对编译器发现的错误进行故障排除非常具有挑战性。