【问题标题】:Is it possible to run a VBA file from a VB6 application?是否可以从 VB6 应用程序运行 VBA 文件?
【发布时间】:2016-01-05 05:09:13
【问题描述】:

我在 Access .mdb 文件中有大量用 VBA 编写的代码,其中包含表单并连接到 Access 数据库。我需要将此代码迁移到 VB6 应用程序。全部重写是不切实际的,因为太多了。

有没有一种方法可以从带有按钮的 VB6 表单中调用该 VBA 文件,从而允许用户通过简单地单击相应的按钮来启动这些 VBA 模块中的每一个? VB6 中哪一行代码允许启动 VBA 文件?

更新

我终于成功地弄清楚了如何使用这条指令从我的 VB6 表单中启动一个 VBA mdb 文件:

Call Shell("C:\Program Files (x86)\Microsoft Office\OFFICE11\MSACCESS.EXE C:\presto.mdb /runtime /cmd", 1)

所以 VBA 项目现在从 VB6 表单启动,但它在启动时崩溃,显示此错误“运行时错误‘3024’找不到文件‘C:\db.mdb’”。 我觉得我已经完成了解决方案的一半。但我不知道我在这里错过了什么?

【问题讨论】:

  • VBA 文件本身没有意义。它们必须在托管应用程序中。如果发生这种情况,您有一个 VBA 文件不引用托管应用程序的任何功能并且只是一个抽象库,那么您可以将其粘贴到 VB6 表单中。否则无论如何它都会失败,因为它需要运行主机应用程序。
  • 您的 VBA 代码用于什么应用程序?
  • VBA 和 VB6 使用相同的运行时,所以正如@GSerg 指出的那样,至少从核心语言的角度来看,您不需要“重写”。
  • @TimWilliams - 完全正确;这取决于您使用的主机应用程序(Excel、Word 等)的哪些功能。
  • MDB 不是 VBA 文件。 MDB 是一个 MS Access 数据库,其中包含数据和(可选)一个 VBA 项目。如果您设法将所有代码重写为 VB6(您必须认真对待它,因为当您在数据库内部和外部时数据访问机制不同),那么您仍然必须携带原始 mdb文件,因为它是带有数据的数据库。此时您可能只是不接触 mdb 文件并按原样使用它。如果您想在未安装 Office 的计算机上使用它,可以从 Microsoft 获得免费的 MS Access Viewer。

标签: ms-access vb6 vba migrate


【解决方案1】:

如果不知道 VB6 应用程序的结构和访问文件以及它们的作用,几乎不可能给出任何有用的答案。

您想做的事情并不容易,正如 cmets 中所述,VBA 项目并非旨在以这种方式工作。

不过这里有一些建议。

  1. 调查RunMacro 命令,看看它是否对您有用。
  2. 您可以尝试使用autohotkey 之类的工具来记录您想要的鼠标点击并从您的 VB6 应用程序中回放。
  3. 查看作为业务逻辑的 VBA 部分,并直接将代码复制并粘贴到您的 VB6 应用程序中。这可能会也可能不会起作用,具体取决于代码。
  4. 开始缓慢的重写过程(但不要在 VB6 中重写,使用 VB.Net、C# 或做一个网络应用程序或至少类似于 2015 年应用程序的东西)。

如果您希望我的诚实建议开始迁移到更现代的解决方案,例如 VB.NET,那么您在 2020 年不会遇到更严重的问题。

没有解决您的问题的灵丹妙药。

【讨论】:

  • VB.Net 变化很快,因此您可能不得不接受成本更高的持续维护周期。
【解决方案2】:

最好在 VB6 中设计一个带有按钮的新表单,如您所说,还带有一些文本/列表/您想要显示结果的任何内容,然后复制/粘贴 VBA将代码写入 button_click(s) 事件以执行它并向该 vba 代码添加一些输出到您决定放在 VB6 表单上的文本/列表/任何内容。

编辑:好的,所以考虑到您的评论,也许这个技巧可以帮助避免重写数千行代码:在 VBA 代码中添加一个 while 循环,在系统上存在标志时触发一些 Sub 或 Function (例如一个特定的 c:\temp\fileFlag.txt)所以一旦出现 VBA 代码就会被调用......如果 VB6 控制标志,它会完成这项工作吗? :)

【讨论】:

  • 感谢您的建议。但这是不可能的。正如我所说,每个 VBA 文件都是一个完整的项目。我们没有时间用 VB6 重写 10 年的工作。所以我们需要的是简单地从一个 VB6 表单按钮中调用这些 VBA 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多