【问题标题】:Standalone code for ExcelExcel 的独立代码
【发布时间】:2012-08-18 07:08:03
【问题描述】:

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

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


理想情况下,我想要一个脚本:
  1. 当用户双击时,应该允许他/她选择一个 Excel 文件,以便在该文件上执行操作。
  2. 如果上述方法不可行,我至少想从 Excel 文件中调用 VBA 脚本。

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

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

【问题讨论】:

  • 你也可以在 VB.Net 中做到这一点。做一个常规项目。
  • VBScript 和 VBA 语法 ID 略有不同,但您可以从 vbscript 自动化 Excel,只需稍作更改。例如,请参见此处:support.microsoft.com/kb/198703
  • @SLaks 正如你所说,我尝试通过在新的Module 中使用简单的Main() 创建一个常规项目。有效。现在我只希望能够发布这个项目,希望一切顺利。
  • 没有办法将 VBA 发布为可执行文件 - 也许您的意思是 VB.net?您将选择什么选项很可能主要取决于您喜欢如何做,以及(例如)您是否希望将 .NET 平台的某些方面纳入您的最终解决方案。
  • 将您的代码写成Excel AddIn

标签: vba excel


【解决方案1】:

您提到了 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。)

【讨论】:

    【解决方案2】:

    回答 1

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

    这对我很有效,正是我想要的。

    回答 2

    @ErikEidt 发布的极具描述性的answer

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

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多