Visual Basic 6.0和VBA之间的区别

221

这两者有何区别?我一直以为VBA是VB的某种'残障'版本,但前几天一个朋友问起我时,我不知道实际差异在哪里。

此外,当你使用例如Excel这样的软件时,那是VB还是VBA?

9个回答

188

几乎所有编程目的上,VBA和VB 6.0是一样的。

VBA无法将您的程序编译为可执行二进制文件。您将始终需要宿主(例如Word文件和MS Word)来包含和执行您的项目。您也无法使用VBA创建COM DLL。

除此之外,IDE中有一个区别-与VB 6.0 IDE相比,VBA更加强大。另一方面,在VBA中,宿主应用程序的紧密集成使得应用特定的编程变得简单明了,并且全局对象(如“ActiveDocument”)和事件可以在不声明的情况下使用。

尽管如此,没有任何事情阻止您启动Word,加载VBA IDE并解决与Word毫无关系的问题。我不确定VB 6.0可以做到而VBA不能(从技术上讲),但我正在MSDN上寻找比较表。


8
在microsoft.com网站上似乎没有简明的比较页面,或者它们被隐藏了。简单来说,VB 6.0代码在VBA中运行时不会更改,除非你引用了VBA未提供的COM对象。 - Tomalak
7
VBA和VB6使用相同的dll文件,这就是为什么代码可以在两种语言中运行的原因。不过,VB6有一个类似于打印机对象的东西,但在VBA中不存在,我不知道为什么会这样。除此之外,我认为这两种语言基本上没有区别。 - Dick Kusleika
51
因此,我认为值得补充的是,打开Office文档与打开可执行文件几乎具有相同的风险。 - Oorang
15
除了打印机集合之外,VB还有剪贴板、屏幕和应用对象。表单包是完全不同的,因为在VB中,你必须特别避免使用窗口控件,但在VBA中,使用基于hWnd的API调用更加困难,因为大多数控件都没有窗口。而且,说到控件,你可以在VB中设计自己的控件,并在VBA以及其他地方使用它们。还有很多其他小问题 - 可以查看对象浏览器(在IDE中按F2)。 - Karl E. Peterson
7
请注意,此内容已过时。VBA已更新为VBA 7,并支持64位数据类型(LongLong、LongPtr)等更多的更改。VB仍停留在版本6,因此不支持这些新功能。这个答案讨论了更多的变化。简而言之,现在有些事情VB无法完成,但VBA可以完成。 - Erik A
显示剩余5条评论

51

VBA代表Visual Basic for Applications,是VB的小型“应用程序”脚本兄弟。VBA确实可用于Excel,但也可用于其他办公应用程序。

使用VB,可以创建独立的Windows应用程序,这在VBA中不可能。

然而,开发人员可以将VBA“嵌入”到自己的应用程序中,作为脚本语言来自动化这些应用程序。

编辑:来自VBA FAQ:

问。 什么是Visual Basic for Applications?

答。 Microsoft Visual Basic for Applications(VBA)是一个可嵌入的编程环境,旨在使开发人员能够使用Microsoft Visual Basic的全部功能构建自定义解决方案。使用托管VBA的应用程序的开发人员可以自动化和扩展应用程序功能,缩短自定义业务解决方案的开发周期。

请注意,VB.NET甚至是另一种语言,只与VB共享语法。


9
实际上,微软将VB.Net称为“Visual Basic”。请参见http://msdn.microsoft.com/en-us/vbasic/default.aspx。 - DOK
21
没错,每当我通过谷歌寻找VB或VBA特定的帮助时,这个事实让我想拔光自己的头发。愚蠢的营销决策。 - Tomalak
8
那就是为什么我刚才只是备注了一下;-) - fretje
3
确实如此,但这并不改变一个事实,那就是VB.NET是与我们开发人员所了解的VB6或更早版本不同的另一种语言。 - fretje
4
在这种情况下,微软似乎将VB.Net视为VB的一个变体,至少基于Visual Studio VB页面上的描述是如此-但这并不准确。有趣的是,这篇维基百科文章提供了比微软Visual Studio页面更多的信息 :) http://en.wikipedia.org/wiki/Visual_Basic_.NET。然而,一个MSDN论坛的问题至少涉及到了它们之间的差异: http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvb/thread/15f1ed35-47c4-4ae0-a8a6-16bad23f6947/ - Scott Conover
显示剩余4条评论

46
这里是对一个老问题的更加技术和全面的回答:Visual Basic for Applications(VBA)和Visual Basic(.NET之前)不仅是相似的语言,而且是相同的语言。具体来说:
  • 它们有着相同的规范:即该语言包含什么以及其含义的独立于实现的描述。您可以在此处阅读:[MS-VBAL]:VBA语言规范
  • 它们拥有相同的平台:它们都编译为Microsoft P-Code,然后由完全相同的虚拟机执行,该虚拟机实现在dll msvbvm[x.0].dll中。

在我去年看到的一本旧VB参考书中,作者(Paul Lomax)甚至断言,“VBA”一直是语言本身的名称,无论是在独立应用程序中使用还是在嵌入式上下文中使用(例如MS Office):

在我们继续之前,让我们澄清一个基本点。Visual Basic for Applications (VBA) 是用于编写 Visual Basic (VB) 的语言。VB 本身是一个开发环境;该环境的语言元素是 VBA。
小差异:
托管 vs. 独立:实际上,当大多数人说“VBA”时,他们特指“在 MS Office 中使用的 VBA”,而他们说“VB6”是指“在独立 VBA 编译器的最后一个版本中使用的 VBA(即 Visual Studio 6)”。与 Visual Studio 6 几乎完全相同的 IDE 和编译器与 MS Office 捆绑在一起,但限制在于它不允许编译为独立的 dll 或 exe 文件。这反过来意味着,在嵌入式 VBA 项目中定义的类对非嵌入式 COM 消费者不可访问,因为它们无法注册。
持续发展:微软在Visual Studio 6中停止生产独立的VBA编译器,因为他们转向了.NET运行时作为首选平台。然而,MS Office团队继续维护VBA,并在MS Office 2010中发布了一个新版本(VBA7),带有一个新的虚拟机(现在只称为VBA7.dll)。唯一的主要区别是VBA7有32位和64位版本,并具有一些增强功能来处理两者之间的差异,特别是关于外部API调用方面的差异。

2
我记得在洛马克斯的书中也有同样的引用,但考虑到这个论坛、维基百科等其他声明的相反之处,让我想知道谁是正确的,为什么会有分歧!洛马克斯还写道(第3页):“无论您是使用VBA创建VB应用程序还是自动化Word或Excel中的某些任务,VBA都是相同的语言。”此外,“VBA是一种托管语言,是VB开发工具系列的一部分。” - EJ Mak
1
如果您在VB6中选择帮助,则会进入VBA语言参考。VB6和Word一样,都托管了VBA语言。由于应用程序对象是全局对象(自动化标准),因此VB6为独立程序提供了一个适用的App对象。Word为Word宏提供了一个App对象。请注意,语言是相同的,任何缺失的引用都是指主机提供的对象,例如VB6打印机对象 - 它不是语言的一部分,而是主机的一部分。 - ACatInLove
当我使用VB6和VBA时,VBA会加载VBA运行时库,除非VB6运行时库已经在内存中。如果VB6库已经在内存中,则VBA将链接到该库。 - david

15

您是想将VBA与VB-Classic(VB6..)或VB.NET进行比较吗?

VBA(Visual Basic for Applications)是Microsoft Office应用程序中嵌入的基于VB-Classic的脚本语言。我认为它的语言特性类似于VB5(只是缺少一些内置函数),但:

您可以访问您编写VBA脚本的Office文档,因此您可以:

  • 编写宏(=在办公工作中用于小型重复任务的自动化例程)
  • 为Excel单元格公式定义新函数
  • 处理Office数据

示例:设置Excel单元格的值

ActiveSheet.Cells("A1").Value = "Foo"

VBC 和 .NET 不是脚本语言。你可以使用它们编写独立的应用程序,并使用单独的 IDE,而这是 VBA 无法做到的(VBA 脚本仅"存在"于 Office 中)。

VBA 与 VB.NET 没有任何关系(它们只是具有类似的语法)。


11

实际上,VBA可以用于编译DLL。Office 2000和Office XP开发者版本包括一个可用于制作用作COM插件的DLL的VBA编辑器。

随着VSTO(VS Office工具)软件的出现,这个功能在后来的版本(2003和2007)中被删除,尽管显然你仍然可以通过使用VB6 IDE而不是VSTO(或VS.Net)以类似的方式创建COM插件。


11
这个功能并没有被删除。微软只是没有更新“Office XP Developer”以支持后续版本。您仍然可以安装开发人员工具,并且它可以正常工作。只是微软不再提供支持。这是因为随2003/2007一起安装的VBA版本仍然与XP/2002相同。 - AMissico

6

这是VBA。VBA代表Visual Basic for Applications,用于Office文档的宏。它没有访问VB.NET功能的权限,因此更像是VB6的修改版本,具有附加组件以便能够在文档上工作(例如,在Excel中使用的VBA工作表)。


7
不,VBA不是VB5/6的修改版,而是它的子集。在VB5/6 IDE中查看对象浏览器,您会看到完整的VBA对象库可供使用和滥用。话虽如此,VBA通常(尽管不一定)具有默认加载的附加对象库,并提供与当下宿主环境相关的全局对象。 - Karl E. Peterson

4

VB不是一种编程语言。VB是一个程序,它托管VBA,就像Office托管VBA一样。VB是一组应用程序对象,就像Word和Excel一样,还有一个表单包,就像Office中的表单一样。

因此,你只能在VB中编写VBA代码。

PS这些信息在VB问题页面的INFO选项卡上。

来自VBA信息

VBA 6于1998年发布,包括许多授权主机,其中包括:Office 2000-2010、AutoCAD、PI Processbook以及独立的Visual Basic 6.0


3
这个回答是完全错误的。VBA不是VB6,它们是共享许多特征但是不同实体。那段简短的引用并不能证明什么。说它不是语言因为它在主机上运行也会把像JavaScript这样的语言归为非语言,这显然是不正确的。另外,VB6程序可以编译成独立的程序,这使它们不需要任何主机(除了Windows)。 - Erik A
@ErikA,你误解了他们所说的内容。VB指的是VB6,它是运行VBA的宿主应用程序,就像Office应用程序一样。 VB6只是一个允许您发布二进制文件以创建独立应用程序的应用程序。以上有其他回答解释了细节。 - MILO

4

VBA指的是Visual Basic For Applications,它是一种旨在用于Office套件中的Visual Basic实现。

它们之间的区别在于VBA嵌入在Office文档中(这是Office的一个特性)。VB是开发应用程序的IDE /语言。


1
VB(仅限6.0以下版本)是VBA(Visual Basic for Applications)的超集。我知道其他人已经提到过这一点,但我的理解是,VBA的语义(即词汇)包含在VB6中(除了针对Office产品的特定对象),因此,VBA是VB6的子集。在VBA中,语法(即单词的书写顺序)与在VB6中完全相同,但不同之处在于可用于VBA或VB6的对象不同,因为它们具有不同的目的。具体而言,VBA的目的是通过编程自动化可以在MS Office中完成的任务,而VB6的目的是创建标准EXE、ActiveX控件、ActiveX DLL和ActiveX EXE,这些程序可以独立运行或在其他程序(如MS Office或Windows)中运行。

VB6托管VBA语言。它们是完全相同的。作为宿主,VB6提供了一些对象,就像Word在其托管时所做的那样。 - ACatInLove

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