您提到了 Visual Studio、VBA 和 VBScript。我概述的解决方案直接使用 VBA 而不是 Visual Studio 或 VBScript。(但是,您可以按照我在下面概述的内容调整 Visual Studio(C# 或 VB)。)希望它有帮助,所以这里是:
这就是我所做的,它最终会产生一个 .xlam Excel 插件,正如上面@chris 所评论的那样。
概述
我从普通的 .xslx 工作簿开始,向其中添加了一个 VBA 项目,使其成为 .xlsm。然后创建一些 VBA Subs(宏)。然后为工作簿创建一些 Excel QAT(快速访问工具栏)按钮,这些按钮绑定到(即它们调用)VBA 子/宏。然后将工作簿(其中包含 VBA)转换为 .xlam,这是一个 Excel 插件。完成后,可以从任何工作簿访问按钮(并且 VBA 代码可以访问任何用户工作簿以及最初在 .xlsm 中的工作簿)。此外,与 .xlam 关联的工作簿是不可见的。所以看起来您已经向 QAT 添加了一些按钮,这些按钮出现在所有用户 .xlsx 窗口上。.xlam 对用户来说很容易安装(尽管我提供了一个按钮来卸载/重新安装/检查版本)。您可以独立于用户的工作簿升级 .xlam;
细节
写一些你以后想用的 Excel Subs
您需要注意,按钮只能在没有参数的情况下调用宏(VBA Subs),因此宏必须检查 ActiveSheet 和 ActiveWorkbook 和 Selection 等内容,以确定按下按钮的工作表,从而真正操作哪些用户数据在。(如果您需要参考您的包含 VBA 代码的工作簿,请使用“ThisWorkbook”)。您应该知道可能存在命名冲突,因此请尝试使用较长的名称命名无参数的 subs,例如 MySomewhatUniqueProjectName_button1 等...</p>
将按钮添加到您的 .xlsm
使用 Excel 2010(我认为这适用于 2007 或更高版本),我将特定于工作簿的按钮放在功能区的 QAT 部分,这些按钮连接到 VBA 代码中的宏(VBA 子程序)。
为此,您从快速访问工具栏自定义下拉菜单(Excel 窗口最顶行的小向下箭头,从左到右的最后一个图标)选择“更多命令...”。当“自定义快速访问工具栏”对话框出现时,从(第二个)“自定义快速访问工具栏:”标题(右上),从下拉列表中选择“对于 XYZ.xlsm”,而不是“对于所有文档” (默认)”。在“Choose Commands From:”下,使用下拉菜单中的“Macros”(而不是“Popular Commands”)。一旦你选择了这两个东西,你可以使用“Add >>”将 VBA subs 从左框移动到右框。每个如此移动的按钮都将成为您的 QAT 中可见的按钮。在执行此操作时,您还可以编辑按钮的图标和文本,根据需要添加分隔符(如果其他 .xlam 使用 QAT,我总是以分隔符结尾)。(现在是保存此 .xlsm 的好时机。)
将 .xlsm 转换为 .xlam
然后我将 .xlsm 转换为 Excel 加载项,只需将其保存为 .xlam 文件即可。这将最终 (1) 隐藏与您拥有的代码关联的工作簿(尽管它本身仍然可以访问。)。此外,现在,(2)(不可见,因为现在它是一个 .xlam)工作簿将在加载 Excel 时加载。(为了在用户使用 Excel 但不运行我的 VBA 代码时保持这种速度,我在加载 .xlam 时不运行任何代码,我只在按下按钮时运行代码。)您可以使用Excel 的插件管理器。要更新 AddIn,您必须使用一些技巧。虽然您可以在 Excel 未运行时复制它,但另一方面,您不能直接卸载 AddIn,您只能从 Excel 中将其禁用。但是一旦禁用,您可以删除 .xlam,然后重新启动 Excel,去插件管理器尝试使用(现已消失的)插件,你会得到 Excel 说它找不到它,所以你想删除它。说是,它将被卸载。
仅供参考,注意事项
我保留 .xlsm 以供以后编辑,但您实际上可以调试和编辑 .xlam,然后通过一些小技巧将其转换回 .xlsm:在 VBA 中找到它的“ThisWorkbook”条目,然后找到“IsAddIn”属性,设置为false,它的工作簿会突然出现,你可以保存为.xlsm,或者编辑它的工作簿并将属性设置回true,直接重新保存为.xlam。)