VBScript开发Excel常见问题

VBS基础

基本概念:VB & VBS & VBA

VB、VBScript和VBA(Visual Basic For Application)这三种语言,既有联系又有区别。三种语言的语法一致,但是具体的应用场景又有区别。
  1. VB是一种编译型的语言,主要用于开发Windows应用程序,代码编译后生成二进制的可执行程序。
  2. VBScript是一种脚本型的语言,这种脚本语言的宿主程序是WSH(Windows Scripting Host),脚本程序运行时,加载的是Windows上下文环境。VBS强大的一点在于可以调用系统的COM对象,比如我可以创建Excel.Application对象,而且系统注册的Excel.Application对象可自动识别系统的Excel运行版本,创建对应的对象。
  3. VBA也是一种脚本语言,但是这种脚本语言的宿主是应用程序,如Excel,AutoCAD,CATIA。加载的上下文环境也是应用程序的上下文环境。其中使用最普遍的就是Excel VBA程序了。

帮助文档

VBS最好的文档当然是微软官方的MSDN了,上面介绍的特别全面。

脚本格式

VBS的脚本有两种文档格式,一种是vbs后缀,另一种是wsf(windows script format)。wsf是采用XML格式存储,支持JScript和VBScript。如果想执行这两种脚本,直接双击就可以,其实后台调用的是wscript程序执行的脚本。执行VBScript脚本有两种程序:
  1. cscript:命令行模式运行VBScript脚本。
  2. wscrip:交互模式运行VBScript脚本,可弹出GUI窗体与用户交互,这种脚本执行模式是Windows默认的脚本执行程序。

内建函数

VBScript中有一些内建函数,可以直接使用。

Abs

Array

Asc

Atn

CBool

CByte

CCur

CDate

CDbl

Chr

CInt

CLng

Conversions

Cos

CreateObject

CSng

CStr

Date

DateAdd

DateDiff

DatePart

DateSerial

DateValue

Day

 

Escape

Eval

Exp

Filter

FormatCurrency

FormatDateTime

FormatNumber

FormatPercent

GetLocale

GetObject

GetRef

Hex

Hour

InputBox

InStr

InStrRev

Int, Fix

IsArray

IsDate

IsEmpty

IsNull

IsNumeric

IsObject

Join

LBound

LCase

Left

Len

LoadPicture

Log

LTrim; RTrim; and Trim

Maths

Mid

Minute

Month

MonthName

MsgBox

Now

Oct

Replace

RGB

Right

Rnd

Round

ScriptEngine

ScriptEngineBuildVersion

ScriptEngineMajorVersion

ScriptEngineMinorVersion

Second

SetLocale

Sgn

Sin

Space

Split

Sqr

StrComp

String

StrReverse

Tan

Time

Timer

TimeSerial

TimeValue

TypeName

UBound

UCase

Unescape

VarType

Weekday

WeekdayName

Year

类对象

这点是我没想到的,我以为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了,发布的时候再加上。

原文地址:https://www.cnblogs.com/dalianliyan/p/4976061.html