我需要用户单击"信任对VBA项目对象模型的访问",以便我正在构建的应用程序可以帮助他们将代码导入VBE.
我可以显示一个消息框或提供文档,告诉他们如何更改设置(如果他们这样做,则会发出有关反响的警告).但是这个设置仍然埋藏在Excel UI中5次点击...事实上,即使我很难记住在哪里找到它.
所以我想做的是以编程方式打开它们的窗口.
我可能会使用臭名昭着的变幻无常的SendKeys方法,但我想知道是否有更好的方法...
(我看,你实际上可以设置通过宏用VBS脚本来改变当目标Office应用程序并不运行它们按该键的值,获得了用户的VBA项目对象模型这个MSDN文章,但我更希望的是用户手动启用此选项或选择不这样做.
编辑:VBA 或 VSTO解决方案很好,或者您能想到的任何其他内容.
我注意到,每当我删除单元格时,我的UDF都会重新计算.这会在删除整个列时导致大量延迟,因为UDF会为其使用的每个单元调用.因此,如果您使用1000 UDFS,则删除列或单元将调用1000次.
举例来说,将以下UDF放在一个模块中,然后使用= HelloWorld()从工作表中多次调用它
Function HelloWorld()
HelloWorld = "HelloWorld"
Debug.Print Now()
End Function
Run Code Online (Sandbox Code Playgroud)
然后删除一行.如果您的体验与我的一样,您会看到每次使用都会调用一次.
任何人都有任何想法是否可以停止这种行为?我也有兴趣为什么它应该被调用.看起来像Excel的依赖树中的缺陷对我来说,但可能有一个很好的理由.
编辑:经过实验,我发现了更多触发UDFS的操作:
请注意,手动计算模式不是多个方面的选项.
第一,鉴于它是一个应用程序级别的设置,它只会带来太大的风险,即有人会使用他们碰巧打开的任何一个电子表格的输出,而不会意识到它们处于手动计算模式.
其次,我实际上并没有设计一个特定的电子表格,而是正在编写一本关于非开发人员如何利用编写良好的现成代码(如UDF)来执行本来可能超出他们的事情的书.示例包括动态连接或拆分文本,或Charles Williams概述的完全匹配二进制搜索UDF,请参阅https://fastexcel.wordpress.com/2011/07/22/developing-faster-lookups-part-2-how-to- build-a-faster-vba-lookup / (是的,我给他们很多警告,通常一个基于公式的原生解决方案将胜过UDF.但正如你从上面引用的线程中看到的那样,仔细编写函数可以表现得很好).
我不知道用户将如何使用这些.
在没有编程解决方案的情况下,看起来我只需要在书中指出,如果用户使用资源密集型UDFS,用户在添加或删除单元格时可能会遇到严重延迟或调整ListObjects的大小.即使这些UDF被有效写入.