您提到了 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;因此,用户的工作簿只能是数据(.xlsx,没有 VBA)。
详情
写一些你以后想用的 Excel Subs
您需要注意,按钮只能调用不带参数的宏(VBA 子程序),因此宏必须检查 ActiveSheet 和 ActiveWorkbook 和 Selection 等内容,以确定按下按钮的工作表,从而确定用户数据真正操作。 (如果您需要参考您的带有 VBA 代码的工作簿,请使用“ThisWorkbook”)。您应该知道可能存在命名冲突,因此请尝试使用较长的名称命名无参数的 sub,例如 MySomewhatUniqueProjectName_button1 等...
将按钮添加到您的 .xlsm
使用 Excel 2010(我认为这适用于 2007 或更高版本),我将特定于工作簿的按钮放在功能区的 QAT 部分,这些按钮连接到 VBA 代码中的宏(VBA subs)。
为此,您从快速访问工具栏自定义下拉菜单(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。)