Excel的独立代码



是否可以编写VBA代码来对任何Excel文件执行操作?

当我在Visual Studio中创建项目时,它会要求将Excel文件链接到它。我编写的所有代码都在ThisWorkbook.vb中,因此仅作用于链接到该项目的Excel


理想情况下,我想要一个脚本:

  1. 当用户双击时,应允许他/她选择一个Excel文件,以便对该文件执行操作
  2. 如果无法实现上述操作,我至少希望从Excel文件中调用VBA脚本

基本上,VBA代码应该独立于任何Excel文件。

我查看了VBScript,但它的语法似乎略有不同。

您提到过Visual Studio、VBA和VBScript。我概述的解决方案直接使用VBA,而不是Visual Studio或VBScript。(不过,您可以按照我下面概述的内容来调整Visual Studio(C#或VB)。)希望它有帮助,所以来吧:

这是我所做的,它最终产生了一个.xlam Excel插件,正如上面@chris所评论的那样。

概述

我从普通的.xslx工作簿开始,在其中添加了一个VBA项目,使其成为.xlsm。然后创建一些VBA子(宏)。然后为工作簿创建一些Excel QAT(快速访问工具栏)按钮,这些按钮绑定到(即调用)VBA子/宏。然后将工作簿(其中包含VBA)转换为.xlam,即Excel加载项。完成所有操作后,可以从任何工作簿访问这些按钮(VBA代码可以访问任何用户工作簿以及.xlsm中的原始工作簿)。此外,与.xlam关联的工作簿是不可见的。所以看起来你只是在QAT中添加了一些按钮,这些按钮出现在所有用户.xlsx窗口上。xlam对用户来说非常容易安装(尽管我提供了卸载/重新安装/检查版本的按钮)。您可以独立于用户的工作簿升级.xlam;因此,用户的工作簿只能是数据(.xlsx,没有VBA)。

详细信息

编写一些Excel Subs以便以后使用

您需要注意,按钮只能在没有参数的情况下调用宏(VBA Subs),因此宏必须检查ActiveSheet和ActiveWorkbook以及Selection等内容,以确定按钮被按下的工作表,从而确定真正要操作的用户数据。(如果您需要引用包含VBA代码的工作簿,请使用"ThisWorkbook")。您应该意识到可能存在命名冲突,所以请尝试用相当长的名称命名无参数的子,如MySomewhatUniqueProjectName_button1等。

将按钮添加到.xlsm

使用Excel 2010(我认为这适用于2007或更高版本),我将工作簿特定的按钮放在功能区的QAT部分,这些按钮连接到VBA代码中的宏(VBA子)。

为此,您可以从快速访问工具栏自定义下拉菜单(Excel窗口最上面一行的向下小箭头,从左到右的最后一个图标)中选择"更多命令…"。当出现"自定义快速访问工具栏"对话框时,从(第二个)"自定义快速存取工具栏:"标题(从上到右)中,从下拉列表中选择"For XYZ.xlsm",而不是"For all documents(default)"。在"从中选择命令:"下,使用下拉菜单中的"宏"(而不是"常用命令")。一旦选择了这两项内容,就可以使用"Add>>"将VBA子从左框移动到右框。每个这样移动的按钮都将成为您的QAT中可见的按钮。当你这样做的时候,你还可以编辑按钮的图标和文本,根据需要添加一个分隔符(我总是以分隔符结尾,以防其他.xlam使用QAT)。(现在是保存此.xlsm的好时机。)

将.xlsm转换为.xlam

然后,我只需将.xlsm保存为.xlam文件,就可以将其转换为Excel加载项。这将导致(1)隐藏与您所拥有的代码关联的工作簿(尽管它本身仍然可以访问)。此外,现在(2)无论何时加载Excel,都将加载(不可见,因为现在它是.xlam)工作簿。(为了在用户使用Excel但不运行我的VBA代码时保持快速,我在加载.xlam时不运行任何代码,只在按下按钮时运行代码。)您可以使用Excel的外接程序管理器管理外接程序。要更新外接程序,你必须使用一些技巧。虽然您可以在Excel未运行时对其进行复制,但另一方面,您不能直接卸载加载项,只能从Excel中禁用它。但一旦禁用,您可以删除.xlam,然后重新启动Excel,转到加载项管理器尝试使用(现在已不存在的)加载项,Excel会说找不到它,所以您想删除它吗?说是,它将被卸载。

仅供参考,注意事项

我保留了.xlsm以便以后编辑,但您实际上可以调试和编辑.xlam,然后用一些小技巧将其转换回.xlsm:在VBA中找到它的"ThisWorkbook"条目,然后将"IsAddIn"属性设置为false,它的工作簿将突然出现,您可以另存为.xlsm,也可以编辑它的工作簿并将属性设置回true以直接重新保存为.xlam。)

答案1

你也可以在VB.Net中做到这一点。只是做一个常规项目。(@SLaks评论)

这对我来说效果很好,正是我想要的。

答案2

@ErikEidt 发布的非常描述性的答案

我还没有尝试过,但这似乎是一种让宏工作的好方法。

最新更新