Excel的独立代码

时间:2012-08-22 19:39:22

标签: excel vba excel-vba

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

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

<小时/> 理想情况下,我想要一个脚本:

  1. 当用户双击时,应允许他/她选择要对该文件执行的操作的 Excel 文件。
  2. 如果上述情况不可行,我至少想从 Excel 文件中调用 VBA 脚本。
  3. 基本上, VBA 代码应独立于任何 Excel 文件。

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

2 个答案:

答案 0 :(得分:4)

您已经提到过Visual Studio,VBA和VBScript。我概述的解决方案直接使用VBA而不是Visual Studio或VBScript。 (但是,您可以根据我在下面概述的内容调整Visual Studio(C#或VB)。)希望它有用,所以这里有:

这是我的工作,最终会产生.xlam Excel AddIn,因为上面的@chris已经评论过了。

<强>概述

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

<强>详情

写一些您想稍后使用的Excel Subs

你需要知道按钮只能调用没有参数的宏(VBA Subs),因此宏必须检查ActiveSheet和ActiveWorkbook以及Selection之类的东西来确定按下按钮的是什么表,因此用户数据是什么真正的经营。 (如果需要在其中引用包含VBA代码的工作簿,请使用“ThisWorkbook”)。您应该知道可能存在命名冲突,因此请尝试使用相当长的名称命名无参数的subs,例如MySomewhatUniqueProjectName_button1等...

将按钮添加到.xlsm

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

为此,您可以从快速访问工具栏自定义下拉列表(Excel窗口最上一行的小箭头,从左到右的最后一个图标)选择“更多命令...”。当出现“自定义快速访问工具栏”对话框时,从(第二个)“自定义快速访问工具栏:”标题(从右到右),从下拉列表中选择“对于XYZ.xlsm”而不是“对于所有文档” (默认)”。从“选择命令来源:”下,从下拉列表中使用“宏”(而不是“热门命令”)。选择这两项内容后,可以使用“添加&gt;&gt;”将VBA subs从左侧框移动到右侧框。每次移动都将成为QAT中可见的按钮。当您这样做时,您还可以编辑按钮的图标和文本,根据需要添加分隔符(如果其他.xlam使用QAT,我总是以分隔符结束)。 (现在是保存这个.xlsm的好时机。)

将.xlsm转换为.xlam

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

仅供参考,注释

我保留.xlsm以后编辑,但你可以实际调试和编辑.xlam,然后稍微将它转换回.xlsm,只需要一点点技巧:在VBA中找到它的“ThisWorkbook”条目,然后是“IsAddIn”属性设置为false,其工作簿将突然出现,您可以保存为.xlsm,或者编辑其工作簿并将属性设置为true以直接重新保存为.xlam。)

答案 1 :(得分:0)

答案1

你也可以在VB.Net中做到这一点。只需做一个常规项目。 (comment来自@SLaks)

这对我很有用,而且正是我所寻找的。

答案2

@ErikEidt发布的非常具有描述性的answer

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