vba转换为vbs的⽅法_VB、VBA、VBS的区别你搞清楚了吗?
(转)
VB、VBA、VBS的区别你搞清楚了吗?(转)
VB、VBA、vbs三个⼥⼈我都喜欢。
⾸先VBS不应该和VB、VBA放在⼀起⽐较,它是微软按照⾃⼰定义的ActiveX Scripting规范完全从头开始写成的脚本语⾔,虽然它的语法结构和VB⾮常相似,但VBS仅仅依靠⾃动化对象来扩充其功能(只有后期绑定),它不能⽤implements来实现接⼝,不可能在VBS⾥直接使⽤API,没有VarPtr这样能得到指针的函数,⽽VBS缺少的这些功能正是VB和VBA所特有的。当然,这不是说VBS不如VB或
VBA,Windows已经为VBS提供了⾜够强⼤的功能,我们可以⽤VBS来做脚本COM组件,⽽且借⾃动化对象的能⼒VBS可以说能⼒⽆限,所以有病毒⽤VBS来写,对程序员来说VBS最重要的功能莫过于可以给⾃⼰的软件提供宏功能,就象VC中提供的VBS宏功能那样。注意,VBS是Free的,这和在Office中使⽤VBA来提供宏功能不同,要集成VBA需要价格不低的许可证费⽤,关于脚本语⾔可参见MSDN中Platform SDK\Tools and Languages\Scripting。
那么VB和VBA⼜有什么不同呢?好吧,眼见为实,开始我们的实验吧!
如果装了Office 2000以上版本,那么打开OLEVIEW,点击File下的View TypeLib查看位于E:\Program Files\Common
Files\Microsoft Shared\VBA\VBA6下的VBE6.dll的类型库,再⽤同样的⽅法看看MSVBVM60.dll的类型库,你会发现它们的类型库基本上⼀模⼀样,除了VBE6多了⼀个VBEGlobal接⼝和实现这个接⼝的Global对象,这个Global对象我们也可以在VBA编程环境(⽐如⽤WORD的VB编辑器)中⽤对象浏览器看到。它有⼆个⽅法Load和UnLoad,还有⼀个UserForms属性,这是因为VBA6使⽤MS Form 2.0 Form设计器(FM20.dll)来设计和使⽤UserForm窗体(⽽在VB6中,我们可以使⽤多个设计器。⽐如通过使⽤MS Form 2.0 Form设计器,我们就能在VB中使⽤VBA所使⽤的UserForm⽤户窗体)。和VBA的Global对象类似,在VB中也有GLobal对象,从VB的对象浏览器中可以知道它在vb6.olb这个类型库中,这个类型库就是每个⼯程都必须引⽤的VB对象库,所有的VB内置对象都在这⾥。⽽VBA的UserForm中使⽤的对象都在FM20.dll中。
除了上述不同外,VB和VBA还有⼀个最⼤的不同,就是VBA不能⽣成EXE可执⾏⽂件,但可以猜想在IDE环境中VBA和VB都要把代码编译成p-code来执⾏,后⾯我将⽤实验来证明的确是这样,虽然在具体的实现上VB和VBA有很⼤的不同。
从上⾯的分析上可以看到VB和VBA还是有很⼤不同的,这种不同主要体现在编程环境和对象结构上,
但在本质上它们之间却有着不可割舍的⾎源关系。如果刚才你仔细地观察了MSVBVM60.dll的类型库,你就会发现如下的⽚断:
// Generated .IDL file (by the OLE/COM Object Viewer)
[
dllname("VBA6.DLL"),
uuid(35BFBDA0-2BCC-1069-82D5-00DD010EDFAA),
helpcontext(0x000f6ec4)
]
module Strings {
[entry(0x60000000), helpcontext(0x000f665f)]
short _stdcall Asc([in] BSTR String);
[entry(0x60000001), helpcontext(0x000f6e9f)]
BSTR _stdcall _B_str_Chr([in] long CharCode);
……………
vba编程技巧
}
什么?在MSVBVM60.dll中的对象其⽅法却定义在VBA6.DLL中?!VB安装⽬录下不就有个VBA6.DLL吗?再⽤OLEVIEW看看它,哇噻,真是想不到它居然和MSVBVM60.DLL的⼀模⼀样。怎么回事?赶快再拿出DEPEND来看看VBA6.dll、MSVBVM60.dll和VBE6.dll 这三个DLL的输出函数。哈,⼜有新发现,我们可以发现在三个DLL的输出函数中从编号512到717绝⼤部分都是⼀模⼀样的⼀些以rtc开头的函数,⽐如595的rtcMsgBox(rtc是什么?应该是Run Time Component? Control? Code?有谁知道吗?),这说明三个DLL都有着相同的运⾏时VBA函数。
我们再⽤DEPEND来观察⼀下VB6.EXE, 我们可以发现VB6.EXE引⼊了VBA6.DLL中⼀些它特有的以Eb和Tip开头的函数,从这些函数的名称上可以发现它们的功能都是IDE相关的,⽐如79的EbShowCode和82的TipDeleteModule。VB6.EXE恰恰没有引⼊任何rtc开头的函数(注意⼀)。我们再来看看MSVBVM60.DLL,随便⼀个⽤了MsgBox函数的编译后的⽂件,⽤DEPEND来观察它,就会发现它引⼊MSVBVM60.DLL输出的595号rtcMsgBox函数(注意⼆)。并且引⼊MSVBVM60.DLL中很多以下划线开头的函数,⽐如
__vbaVarAbs(注意三)。其实从这个三个"注意"中我们已经可以进⾏⼀些猜想,⽆论对错,你可以先想想。
如果你没有跟着我做实验,⽽仅仅是看这篇⽂章的话,我猜想你应该有点昏了。如果你⾃⼰动⼿做了这些实验,现在你应该充满了疑问⽽急侍看到结论。所以请⼀定要亲⼿试⼀试,学习研究问题的⽅法⽐看结论更重要。
到这⾥⾄少我们可以得出结论:VB和VBA本就是同宗的妹,只不过VB的功夫要⽐妹妹VBA历害些。不过只会单打独⽃是⼥强⼈;妹妹却只会傍⼤款。有⽣育能⼒,是真正的⼥⼈;妹妹却不会⽣崽,但深谱相夫之道,⼀番教导指挥之下可使她⽼公增⾊不少,⽽VBS呢,也是⼤户⼈家的⼥⼉,不过没有VB和VBA妹优秀的⾎统,娇⼩玲珑⼲不得粗活只能指挥些⾃动听话的对象来⼲活,她乐于助⼈品德好不象VBA那样只认⼤款,VB、VBA、vbs三个⼥⼈我都喜欢。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。