交流:关于VBS和VBA的一些区别

经验创意 · 5008 次浏览
湘喑 创建于 2022-07-27 11:32

Quicker配合VBS脚本,可以非常方便的对Excel表格进行一些VBA才能实现的操作,虽然效率比不上VBA,但能随时保存自己的代码为动作随时调用,方便性太强了。观察了一段时间,我们Quicker很多使用者会使用VBA,但对VBS不太熟悉,所以这里和大家交流一下心得,希望能对大家有所帮助,都是自己总结的,未必准确,欢迎指正。

区别一:

VBA是直接依附于Excel程序的,在部分时间它的代码可以直接忽略对象的上级主体,如获取当前工作表,直接使用set sh = activesheet即可。而VBS脚本、VB程序等是外部接口连接的,要先获取到Excel对象,然后再对对象进行操作,所以它们的代码是这样的:

Set application = GetObject(,"excel.application")

Set sh = application.activesheet

获取了applicationsh对象后,后面就可以调用它的子对象了,如获取当前选择区域,set rng = application.selection;获取当前工作表名:name = sh.name等等。

总之,VBSVB不能忽略Excel对象的上级主体,大家可以动手实践一下,将当前工作表的A1单元格的值设为1,代码是怎样的。

PS:当Excel程序处于打开状态时可以使用getobject的方法获取其对象,若未打开则该方法会产生错误。一般可以使用Set application = CreateObject("excel.application")的方法直接创建一个进程,但该进程窗口默认是隐藏的,要加一句application.visible = true 使窗口可见。如果是同时安装了ExcelWPS,可以用GetObject(,"KET.application")来获取WPS程序对象用于区分Excel

区别二:

VBA中的方法可以使用参数名:=参数这种形式,而VBS不行

如选择一个区域,VBA代码可以为Set Rng = Application.InputBox("请选择区域", Type:=8)

Application.InputBox的参数有Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type8个,除了第1个标题参数是必选,其余都是可选,我们可以直接忽略其它参数,用Type:=设置其数据类型参数。而在VBS中则不行,VBS中调用对象的方法时,参数可以为空,但不能跳过,VBS代码如下:

Set Rng = Application.InputBox("请选择区域", , , , , , , 8)

区别三

VBA中参数可以为VBA的常数(一般为xl开头的),如选择性粘贴单元格格式:

Rng.copy

Rng2.pastespecial xlPasteFormats

VBS中无法识别这种常数,以上代码在VBS中运行无效果,但VBS可以识别常数的值,xlPasteFormats的值为-4122,所以VBS代码为

Rng.copy

Rng2.pastespecial -4122

粘贴值:Rng2.pastespecial -4163

粘贴列宽:Rng2.pastespecial 8

区别四

VBA中定义数组 dim arr( 1 to 2,1 to 5),可以自定义数组下标,而VBS中默认数组下标为0,所以只能dim arr(1,4),但将单元格区域的值赋值给数组后,如Arr = application.selection,数组arr就同VBA一致了,都是下标为1

其它的欢迎大家补充


回复内容
CL 2022-07-27 12:33
#1

感谢分享~

Cesar 2022-07-28 16:12
#2

我是因为不会VB的语法转用C#操作office了哈哈

紫cm煞 2022-07-28 18:33
#3

感谢分享~ 老佬

雾岚i 2022-07-29 17:31
#4

windows系统自带的powershell也可以操作excel, 感觉系统自带的powershell ISE比VBA的编辑器好用多了:


$excel = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.application")

ZTOA10 2022-08-12 18:33
#5

感谢分享~这个是vb大佬,我的vb基础入门就是跟这个大佬请教的

回复主贴