VBscript语言基础小结

VBscript语言基础小结

在前面短短的几篇文章中,我们通过一系列可运行的实例,已经把VBscript语言的最基本的知识介绍给了读者。用这种方法叙述语言框架当然免不了有疏漏。在本文中我们把遗漏的语言元素补上,对VBscript语言的基础教程作一个小结,入门篇就结束了。进一步的学习请看我的—《VBscript和javascript语言实用技法之研究》(进阶篇)。

一 VBScript 的数据类型

VBScript 只有一种数据类型,称为 VariantVariant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为 Variant 是 VBScript 中唯一的数据类型,所以它也是 VBScript 中所有函数的返回值的数据类型。但是, Variant包含各种子类型,下表显示 Variant 包含的子类型:

 

子类型描述
Empty未初始化的 Variant。对于数值变量,值为 0;对于字符串变量,值为零长度字符串 ("")。
Null不包含任何有效数据的 Variant
Boolean包含 TrueFalse
Byte包含 0 到 255 之间的整数。
Integer包含 -32,768 到 32,767 之间的整数。
Currency-922,337,203,685,477.5808 到 922,337,203,685,477.5807。
Long包含 -2,147,483,648 到 2,147,483,647 之间的整数。
Single包含单精度浮点数,负数范围从 -3.402823E38 到 -1.401298E-45,正数范围从 1.401298E-45 到 3.402823E38。
Double包含双精度浮点数,负数范围从 -1.79769313486232E308 到 -4.94065645841247E-324,正数范围从 4.94065645841247E-324 到 1.79769313486232E308。
Date (Time)包含表示日期的数字,日期范围从公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日。
String包含变长字符串,最大长度可为 20 亿个字符。
Object包含对象。
Error包含错误号。
您可以使用转换函数来转换数据的子类型。另外,可使用 VarType 函数返回数据的 Variant 子类型。

二 常量和变量

什么是常数?常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。VBScript 定义了许多固有常数。详细信息,请参阅 VBScript 语言参考。您可以使用Const语句在VBScript 中创建用户自定义常数。使用Const语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:

Const MyString = "这是一个字符串。"
Const MyAge = 49

什么是变量?变量实际上是赋予了名称(变量名)的一块内存地址,只要通过变量名引用变量就可以查看或更改变量的值。在VBScript中因为只有一个基本数据类型,因此所有变量的数据类型都是 Variant
在VBScript中也可以未经声明就使用变量,但是,先声明后引用是一种好习惯,何况其它语言的变量必须先声明后引用。声明变量的一种方式是使用 Dim 语句、Public 语句和 Private 语句在脚本中显式声明变量。

给变量命名必须遵循 VBScript 的标准命名规则。变量命名必须遵循:
  • 第一个字符必须是字母。
  • 不能包含嵌入的句点。
  • 长度不能超过 255 个字符。
  • 在被声明的作用域内必须唯一。

变量的作用域与存活期

变量的作用域由声明它的位置决定。如果在过程中声明变量,则只有该过程中的代码可以访问或更改变量值,此时变量具有局部作用域并被称为 过程级变量。如果在过程之外声明变量,则该变量可以被脚本中所有过程所识别,称为 Script 级变量,具有脚本级作用域。

变量存在的时间称为存活期。Script 级变量的存活期从被声明的一刻起,直到脚本运行结束。对于过程级变量,其存活期仅是该过程运行的时间,该过程结束后,变量随之消失。在执行过程时,局部变量是理想的临时存储空间。可以在不同过程中使用同名的局部变量,这是因为每个局部变量只被声明它的过程识别

三 运算符和表达式

VBScript有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。由运算符和常量变量连接而成的式子称为表达式。任何表达式经运算后都有一个最终结果,这个结果的子类型被看作是表达式的类型。

下面列举所有的运算符。

算术运算符 +, -, *, /, /(整除), Mod(取余),^(求幂)  

连接运算符 & ( 连接字符串)

赋值运算符 = (或称为赋值语句)

比较运算符 >, <, =, >=, <=, <>

逻辑运算符 NOT(非), AND(与), OR(或), XOR(异或), IMP(蕴涵), EQV(等价)

逻辑运算中的与,或,非这三种是必须掌握的,后三种不常用,可以不掌握。详细信息,请参阅 VBScript 语言参考。

运算符优先级

当表达式包含多个运算符时,将按预定顺序计算每一部分,这个顺序被称为运算符优先级。可以使用括号越过这种优先级顺序,强制首先计算表达式的某些部分。运算时,总是先执行括号中的运算符,然后再执行括号外的运算符。但是,在括号中仍遵循标准运算符优先级。 运算符的优先级如下所示(高>>低):

   算术运算符>>比较运算符>>逻辑运算符。

比较运算符都是同级的,逻辑运算符优先级为:NOT>>AND>>OR。算术运算符的优先级是不言而喻的。

四 语句

语句是任何编程语言的基本要素,程序就是由一系列语句组成的。在前面的几篇文章中我们使用了绝大多数基本语句。下面把基本语句及其语法功能列成简表以方便查询。

语句名称语法形式功能描述

Call

[Call] name [argumentlist]

将控制权传递给 Sub 或 Function 过程。call 动词可省略。

Const

Const constname = expression      

声明用于代替文字值的常数。

Dim

Dim  varname[([subscripts])], . .

声明变量并分配存储空间

Do...Loop

Do [{While | Until} condition]
  [statements]
[Exit Do]
  [statements]
Loop

While:当条件为 True 时重复执行某语句块。

Until:当条件变为 True 之前重复执行某语句块。

Erase

Erase array

重新初始化固定大小数组的元素,并释放动态数组的存储空间。

Execute

Execute statements

执行一个或多个指定的语句。

Exit

Exit Do [ For| Function| Property| Sub]

退出 Do...Loop、For...Next、Function 或 Sub 代码块。

For...Next

For counter = start To end [Step step]
  [statements]
Next

以指定次数重复执行一组语句。

For Each...Next

For Each element In group  
   [statements]
Next

对数组或集合中的每个元素重复执行一组语句。

Function

Function name [(arglist)]
  ...
End Function

声明 Function 过程的名称、参数以及构成其主体的代码。

If...Then...Else

If condition Then
   statements
Else
  statements
End If

根据表达式的值有条件地执行一组语句。

On Error

On Error Resume Next

启动错误处理程序。

Option Explicit

Option Explicit

强制要求显式声明脚本中的所有变量。该语句必须出现在脚本的任何其他语句之前。

Private

Private varname [([subscripts])][, ...].

定义私有变量并分配存储空间。在 Class块中定义私有变量。

Public

Public  varname [([subscripts])][, ...]

定义公有变量并分配存储空间。在 Class 块中定义私有变量。

Randomize

Randomize [number]

初始化随机数生成器。

ReDim

ReDim   varname (subscripts) [, . . .

在过程级中声明动态数组变量并分配或重新分配存储空间。

Rem

Rem comment 或 ' comment

包含程序中的解释性注释。

Select Case

Select Case testexpression
  Case expressionlist-1

    statements-1
 . .
[Case Else  expressionlist-n
  [elsestatements-n]
End Select

根据表达式的值执行几组语句之一。

Set

Set objectvar = objectexpression
Set object.eventname = GetRef(procname)

将对象引用赋给变量或属性,或者是用一个事件关联一个过程引用。

Sub

Sub name [(arglist)]
  ...
End Sub

声明 Sub 过程的名称、参数以及构成其主体的代码。

While...Wend  

While condition  
  [statements]
Wend

当指定的条件为 True 时,执行一系列的语句。为熟悉就语法的所设,建议使用Do  Loop语句。

With

With object     
   statements
End With

在对一个对象执行一系列的语句时,With 与End With内部可省略写对象名

 除了Do Loop 和 While 两种循环语句外,其它语句在前面的几篇文章中都使用到了。下面是由微软公司给出的例子说明如何使用 Do...Loop 语句:

Do Until DefResp = vbNo
  MyNum = Int (6 * Rnd + 1)	'  产生 1 到 6 之间的随机数。
  DefResp = MsgBox (MyNum & " 想要另一个数吗?", vbYesNo)
Loop

Dim Check, Counter
Check = True: Counter = 0		' 初始化变量。
Do					'外层循环。
  Do While Counter < 20		'内层循环。
    Counter = Counter + 1		' 增加计数器。
    If Counter = 10 Then		' 如果条件为 True...
      Check = False			' 将标志值设置为 False。
      Exit Do				' 终止内层循环。
    End If
  Loop
Loop Until Check = False		' 立即终止外层循环。

其中vbYesNo是VBscript预制的常数,值=4,表示显示按钮vbNo=7用来接收消息框函数的返回值,表示按钮被单击

五 函数与子程序

数与子程序都是一个过程。分别有function 和 sub语句来定义。它们的区别是:

  1. 数返回一个唯一的值,而子程序不返回值。
  2. 调用函数时必须加括号,即使没有参数。调用子程序则不能和、加括号,参数值表直接跟在后面。
  3. 函数一般形如变量出现在表达式中,子程序形如语句单独出现。

VBscript预定义了许多内置函数,随时可直接使用。我们在前面已经详细介绍了数值函数、字符串函数和日期函数。下面仅补上类型转换函数。一般格式 Cxxxx(表达式)。

函数名返回类型

CBool

 布尔型

CByte 字节

CCur

 货币

CDate

 日期 

CDbl

 双精度

CInt

 整数

CLng

 长整数

CSng

 单精度

CStr

 字符串

此外,还有一个Filter 函数。其功能是过滤一个字符串数组,返回符合条件的子集合数组。语法:

Filter(InputStrings, Value[ , Include[ , Compare]] )

Filter 函数的语法有以下参数:

 

参数描述
InputStrings必选。一维数组,要在其中搜索字符串。
Value必选。要搜索的字符串。
Include可选。Boolean 值,指定返回的子字符串是否包含Value。如果 IncludeTrueFilter 将返回包含子字符串 Value 的数组子集。如果 Include FalseFilter 将返回不包含子字符串 Value 的数组子集。
Compare可选。数字值指出使用的比较字符串类型.请参阅值设置部分.

 最后,作为本文的结束,我们给出一个有用的实例程序。在数据库的应用中,最基本的工作是查询,而查询的结果得到一张表,是以二维数组的形式存在的。我们的实例就是用程序来生成一张表格,把查询结果显示在屏幕上。

目标任务 自动生成一个表格,其行列数由一个作为参数的数组决定。

代码

Sub TableGenalete (Arrayname)
dim width1,row,col
row = Ubound(Arrayname,1)
col = Ubound(Arrayname,2)
width1 = cStr(INT(100/col)) & "%"
document.write (TABLE_("100%","1")) 
document.write ("<TR>")
for j =0 to col-1
  TDmass = TD_( width1,"#c0c0c0")
  week = weekdayName(weekday(j+1))
  TDmass = replace(TDmass,"AA",Week )
  document.write TDmass
Next
document.write ("</TR>") 
for i=0 to row-1
document.write ("<TR>") 
  for j =0 to col-1
    TDmass = TD_( width1,"#dddddd")
    TDmass = replace(TDmass,"AA",Arrayname(i,j))
    document.write TDmass
 Next
 document.write ("</TR>") 
Next
document.write ("</TABLE>")
End sub

代码注释

TableGenalete子程序将在页面上生成一个表格。第一个单循环生成表头行,为了显示时醒目,该行内容为“星期日”到“星期六”。下一个两重循环逐行生成表格的每一个单元格和它的内容——数组Arrayname的对应元素。单元格的HTML代码<TD ...>由自定义函数TD_()产生,它设定了两个参数—宽度和背景颜色。也就是说,这两个参数是可变的,其它的是默认值。

为了演示观看效果,还需要一段主程序来调用它代码如下。

dim Myarray(5,7)
for i=0 to 4 
  for j=0 to 6
    Myarray(i,j)= cStr(10*i+j+1)
  next
next 
TableGenalete Myarray

两个自定义函数如下:

function TD_(width1,bgcolor1)
dim ss
ss = "<TD width=" & CHR(34) & "50%" &CHR(34) & " bgcolor 
   =" & CHR(34) & "#FFFFFF" &CHR(34)& ">AA</TD>"
ss = replace(ss,"50%",width1)
if bgcolor1<>"" then
ss = replace(ss, "#FFFFFF" ,bgcolor1)
End if
TD_=ss
End function

function TABLE_(width1,border1)
dim ss
ss = "<TABLE width=" & CHR(34) &"100%" &CHR(34) & " border='1' >"
ss = replace (ss, "100%",width1)
ss = replace (ss, "1" , border1)
TABLE_=ss
End function

函数的功能是建立写HTML代码所需要的字符串,其中的AA在调用时由相应的数组元素来替换它。如果你不替换,也不妨碍程序的运行。该函数还可以简化,把AA和后面的部分放到主函数中去实现,而这里省去replace的使用,您自己试试。

运行代码

文 东方一峰 2002-12-27

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值