从VB6应用程序运行VBA文件是否可行?

3

我有大量使用VBA编写的代码,存储在Access .mdb文件中,包含表单和连接到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)

现在从VB6表单启动VBA项目,但是它会在启动时崩溃,显示以下错误“运行时错误‘3024’,无法找到文件‘C:\db.mdb'”。我感觉我已经解决了一半的问题,但是不知道我漏掉了什么?


2
VBA文件本身没有意义,它们必须在托管应用程序中。如果您有一个不涉及托管应用程序任何功能的VBA文件,只是一个抽象库,那么您可以将其原样粘贴到VB6表单中。否则,它将失败,因为它需要运行主机应用程序。 - GSerg
把一段有意义的VBA代码块拖放到VB6的IDE中,看看会发生什么。 - bugmagnet
1
MDB不是VBA文件。MDB是一个包含数据和(可选)VBA项目的MS Access数据库。如果您设法将所有代码重写为VB6(因为当您在数据库内部和外部时,数据访问机制是不同的,所以您必须认真对待它),那么您仍然需要携带原始的mdb文件,因为它是包含数据的数据库。此时,您可能只需不触摸mdb文件并将其按原样使用。如果您想在未安装Office的计算机上使用它,则可以从Microsoft获取免费的MS Access Viewer。 - GSerg
VBA和VB6 不使用相同的运行时。 - Bob77
我相信在源代码层面上有大量的代码共享,但它们不使用相同的运行时DLL。链接的问题是关于VB6和VBA源代码之间的源代码兼容性,并且没有涉及到运行时组件的任何重要内容。即使安装了Office的版本,没有VB6运行时程序,VB6程序也无法运行 - 虽然与Office运行时程序不同,VB6运行时程序现在作为Windows的一部分预安装。 - Bob77
显示剩余6条评论
2个回答

1
没有了解您的VB6应用程序和访问文件以及它们的功能,几乎不可能给出任何有用的答案。
如评论所述,您想要做的并不容易实现,VBA项目不是设计成以这种方式工作的。
但是以下是一些建议。
1.研究RunMacro命令,看看它是否对您有用。
2.您可以尝试使用autohotkey等工具来记录鼠标点击位置,并从您的VB6应用程序中重新播放。
3.查看提取业务逻辑的VBA部分,并直接将代码复制粘贴到您的VB6应用程序中。这可能会起作用,也可能不会,这取决于代码。
4.开始缓慢重写(但不要在VB6中重写,使用VB.Net、C#或类似2015年的Web应用程序)。

如果你想听我的诚恳建议,开始迁移到更现代的解决方案,例如VB.NET,这样你在2020年就不会有更严重的问题了。

对于你的问题,没有万能的解决方法。


VB.Net 变化迅速,因此您可能不得不接受更昂贵的持续维护周期。 - Bob77

0

最好设计一个VB6的新表单,如您所说,有一些文本/列表/其他内容来显示结果,然后将VBA代码复制/粘贴到button_click(s)事件中执行,并在该VBA代码中添加输出到您决定放在VB6表单上的文本/列表/其他内容。

编辑:好的,考虑到您的评论,也许这个技巧可以帮助避免重新编写成千上万行的代码:在VBA代码中添加一个while循环,当系统中存在标志(例如特定的c:\temp\fileFlag.txt)时触发某个子程序或函数,因此只要出现了标志,就会调用VBA代码...如果VB6控制标志,它会完成工作吗?:)


我很感谢您的建议。但这是不可能实现的。正如我所说,每个VBA文件都是一个完整的项目。我们没有时间在VB6中重新编写10年的工作。因此,我们需要的只是从VB6表单按钮中调用这些VBA文件。 - AndroWeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接