受欢迎的博客标签

vba 详细运行原理介绍及 vba 手册

Published

VB、VBA、VB.Net 之间的关系与区别

VB

VB是一门编程语言。VB拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以使用DAO、RDO、ADO连接数据库,或者创建ActiveX控件。程序员可以使用VB提供的组件快速建立一个应用程序。

VBA

VBA is a scripting language, using which you build your macros. 

Visual Basic for Applications(VBA)是Visual Basic的一种宏语言.

微软在1994年发行的Excel5.0版本中开始具备了VBA的宏功能。

     Visual Basic for Applications支持构建用户定义函数(udf)、自动化进程以及通过动态链接库(dll)访问Windows API和其他低级功能。

VB.Net

VB.NET 完全集成到 Visual Studio 集成开发环境中。基于.NET Framework 。

 

Visual Basic 版本历史列表

Visual Basic is from the version 1 to current is 13

Visual Basic version 1.0 to version 6.0:=VB6,  program language is VB6.

Visual Basic version 7.0 to current version :=Visual Basic.Net,a diffferent program language than VB6. 

VB.net is built on the .NET framework; Visual Basic 6 is not.

 

Visual Basic 16.0/Visual Studio 2019 版本 16.0
有关新功能,请参阅 Visual Basic 16.0。

Visual Basic 15.5/Visual Studio 2017 版本 15.5
有关新功能,请参阅 Visual Basic 15.5。

Visual Basic 15.3/Visual Studio 2017 版本 15.3
有关新功能,请参阅 Visual Basic 15.3。

Visual Basic 15 / Visual Studio 2017
有关新功能,请参阅 Visual Basic 2017。

Visual Basic/Visual Studio 2015
有关新功能,请参阅 Visual Basic 14。

Visual Basic/Visual Studio 2013
.NET Compiler Platform(“Roslyn”)的技术预览

Visual Basic/Visual Studio 2012
Async 和 await 关键字、迭代器、调用方信息特性

Visual Basic、Visual Studio 2010
自动实现的属性、集合初始值设定项、隐式行继续符、动态、泛型协变/逆变、全局命名空间访问

Visual Basic/Visual Studio 2008
语言集成查询 (LINQ)、XML 文本、本地类型推断、对象初始值设定项、匿名类型、扩展方法、本地 var 类型推断、lambda 表达式、if 运算符、分部方法、可以为 null 的值类型

Visual Basic/Visual Studio 2005
My 类型和帮助程序类型(对应用、计算机、文件系统、网络的访问)

Visual Basic/Visual Studio .NET 2003
移位运算符、循环变量声明

Visual Basic/Visual Studio .NET 2002
Visual Basic.NET 的首次发布
以上的Visual Basic 全部是基于 .net 的版本,属于托管代码类型
----------分界线------------
Visual Basic 6.0/Visual Studio 6.0

detail:https://docs.microsoft.com/zh-cn/dotnet/visual-basic/whats-new/

 

VBA在Office文档中可以以下面三种形似存在

1、源代码。宏模块的原始源代码被压缩,并存储在模块流的末尾。可以删除源代码,并不影响宏的执行

2、P-Code。与VB语言相同,VBA同样有P-Code,通过内置的VB虚拟机来解释P-Code并执行,平常我们Alt+F11打开所看到的正是反编译的P-Code。

3、ExeCodes。当P-Code执行一次之后,其会被一种标记化的形式存储在__SRP__流中,之后再次运行时会提高VBA的执行速度,可以将其删除,并不影响宏的执行。

​ 每一个流模块中都会存在一个未被文档化的PerformanceCache,其中包含了被编译后的P-Code代码,如果_VBA_PROJECT流中指定的Office版本与打开的Office版本相同,则会忽略流模块中的源代码,去执行P-Code代码

detail:https://blog.csdn.net/qq_38474570/article/details/97167995

 

VBA代码通常只能在主机应用程序中运行,而不能作为独立的程序运行。

VBA可以使用OLE自动化从一个应用程序控制另一个应用程序。例如,VBA可以从Microsoft Excel数据自动创建Microsoft Word报告,Excel从轮询传感器自动收集这些数据。VBA可以使用,但不能创建ActiveX/COM dll,后来的版本增加了对类模块的支持。

 


     VBA内置在大多数Microsoft Office应用程序中,包括用于Mac OS X的Office(2008版除外),以及其他Microsoft应用程序,包括Microsoft MapPoint和Microsoft Visio。VBA还在微软以外的公司发布的应用程序中得到了实现,至少部分实现了,这些公司包括ArcGIS、AutoCAD、CorelDraw、LibreOffice、Reflection、SolidWorks、和WordPerfect。
 
VBA编写的代码被编译成Microsoft P-Code(伪代码),这是一种专有的中间语言.

主机应用程序(Access、Excel、Word、Outlook和PowerPoint)将其作为独立于文档流的单独流存储在COM结构化存储文件(例如.doc或.xls)中。

中间代码然后由虚拟机(由主机应用程序托管)执行。see:VB/VBA的虚拟机

尽管VBA与许多旧的基本方言(特别是间接派生自Microsoft BASIC的Microsoft BASIC)相似,但它与除Visual BASIC之外的任何一种语言都不兼容,Visual BASIC可以直接导入VBA模块和类的源代码,并且共享相同的库和虚拟机。兼容性终止于Visual Basic版本6;

VBA与Visual Basic . net (VB.NET)不兼容。VBA是微软的专利,除了COM接口之外,它不是一个开放的标准。

see:https://mp.weixin.qq.com/s/5c_FRBZ6QF6ccnNbH8LviA

 

Activex,OLE,COM都是微软的一些技术标准。

Ole被Activex取代,Activex被COM取代.

Activex DLL

Activex有两种扩展名OCX和DLL。实际上你可以把它们的扩暂名字调换。

Com DLL对象

文件名虽然为dll后缀,但与传统dll不同.

必须在使用前在注册表中注册,主要也就是给windows通知该Com对象(如在HKEY_CLASSES_ROOT下设置相应的项)。注册过程由拥有“ComRegisterFunctionAttribute”属性的函数负责

 COM作为ActiveX的更新技术,扩展名也有可能是DLL DLL文件还有可能是动态链接库。主要是装载一些函数,可以动态加载。

 

useful links

Excel-vba 开发使用手册(https://github.com/Youchien/concise-excel-vba)


 Office VBA 参考(https://docs.microsoft.com/en-us/office/open-xml/how-to-parse-and-read-a-large-spreadsheet)