VBS基础
基本概念:VB & VBS & VBA
VB、VBScript和VBA(Visual Basic For Application)这三种语言,既有联系又有区别。三种语言的语法一致,但是具体的应用场景又有区别。
- VB是一种编译型的语言,主要用于开发Windows应用程序,代码编译后生成二进制的可执行程序。
- VBScript是一种脚本型的语言,这种脚本语言的宿主程序是WSH(Windows Scripting Host),脚本程序运行时,加载的是Windows上下文环境。VBS强大的一点在于可以调用系统的COM对象,比如我可以创建Excel.Application对象,而且系统注册的Excel.Application对象可自动识别系统的Excel运行版本,创建对应的对象。
- VBA也是一种脚本语言,但是这种脚本语言的宿主是应用程序,如Excel,AutoCAD,CATIA。加载的上下文环境也是应用程序的上下文环境。其中使用最普遍的就是Excel VBA程序了。
帮助文档
VBS最好的文档当然是微软官方的MSDN了,上面介绍的特别全面。
脚本格式
VBS的脚本有两种文档格式,一种是vbs后缀,另一种是wsf(windows script format)。wsf是采用XML格式存储,支持JScript和VBScript。如果想执行这两种脚本,直接双击就可以,其实后台调用的是wscript程序执行的脚本。执行VBScript脚本有两种程序:
- cscript:命令行模式运行VBScript脚本。
- wscrip:交互模式运行VBScript脚本,可弹出GUI窗体与用户交互,这种脚本执行模式是Windows默认的脚本执行程序。
内建函数
VBScript中有一些内建函数,可以直接使用。
类对象
这点是我没想到的,我以为vbs语法比较简单。实际VBS还是支持类声明的,用来构造业务对象的数据结构挺方便。
1 Dim cfg 2 Set cfg = new SheetConfigType 3 Set cfg = nothing 4 5 Class SheetConfigType 6 7 public Index 8 public CustomRowHeight 9 10 private Sub Class_Initialize() 11 'do nothing 12 End Sub 13 14 private sub Class_Terminate() 15 'do nothing 16 End Sub 17 18 End Class
对象赋值
当给变量赋普通值时使用 i = 5 这种语法就可以。将一个对象类型赋给变量时,需要采用类似 Set cfg = new SheetConfigType 这种语法,注意前面多了一个Set关键字。
运行环境
VBS和VBA的运行环境还是有区别的,VBS默认只加载了Windows运行环境。在Excel里面录制的宏,是不能直接拿来用的。像Selection、Range这种对象在Excel VBA中可以直接使用,在VBS中是需要先创建再使用的。
1 <job id="ExcelReport"> 2 <reference guid="{00020813-0000-0000-C000-000000000046}" 3 comment="MSExcel 2002 tag library, under HKEY_CLASSES_ROOTTypeLib"/> 4 <script language="VBScript"> 5 Option Explicit 6 On Error Resume Next 7 Dim xlsPath, excelApp, workbook, sheet 8 xlsPath = WScript.Arguments(0) 9 Set excelApp = CreateObject("Excel.Application") 10 excelApp.DisplayAlerts = False 11 Set workbook = excelApp.Workbooks.Open(xlsPath) 12 For Each sheet In workbook.Worksheets 13 'do something 14 Next 15 workbook.Close 16 excelApp.Quit 17 </script> 18 </job>
异常处理
在VBS中如果脚本运行出现异常,异常直接就被抛出了,后面的脚本是不会被执行的。这就会造成一个问题,比如创建了一个Excel对象,执行到一半,脚本崩溃,但这个Excel对象还在进程中,并没有被回收销毁。解决方案也很简单,在脚本前面加一行代码: On Error Resume Next 。如果脚本异常,继续执行下一行,这样脚本肯定能跑到进程关闭那行的。但是调试的时候,不要写这行,不然很难定位到底是哪出BUG了,发布的时候再加上。