posts - 5, comments - 2, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2007年10月12日

    我们在C/C++和C#这类强类型语言中,强行转换变量类型简直就是家常便饭。可是JavaScript这个动态类型脚本语言的变量号称是没有类型的,那么我们怎么转换它的变量的类型呢?而且还要强行转

    JavaScript的变量确实是没有类型的,就是说你var variable后,可以随便的给variable赋值,不会有任何问题。可是赋给变量的值本身自己却是有类型的,比如:String、Object、Boolean和Number等等。所以JS的变量还是有类型转换的,当然很多时候JS解析引擎会默认处理很多的type convert。不过有的时候也需要我们强行转换数据类型,最常见的就是:''+数字+数字,这种情况来生成字符串累加。

    象:''+数字+数字,这样的语法真的是比较的ugly,想我们在C中使用(int)xxx和C++中int(xxx)来做类型转换多么的清晰明了。其实JavaScript也支持这样的类型转换语法的,例如:

    <script language="javascript">
    
var str = '100';
    
var num = Number(100);
    alert(
typeof(num) + ': ' + num);
    
var obj = Object(str);
    alert(
typeof(obj) + ': ' + obj);
    
var bool = Boolean(str);
    alert(
typeof(bool) + ': ' + bool);

    
var num = 100;
    
var str = String(num);
    alert(
typeof(str) + ': ' + str);
    
var bool = Boolean(num);
    alert(
typeof(bool) + ': ' + bool);
    
var obj = Object(num);
    alert(
typeof(obj) + ': ' + obj);

    
var bool = true;
    
var str = String(bool);
    alert(
typeof(str) + ': ' + str);
    
var num = Number(bool);
    alert(
typeof(num) + ': ' + num);
    
var obj = Object(bool);
    alert(
typeof(obj) + ': ' + obj);

    
var obj = {};
    
var str = String(obj);
    alert(
typeof(str) + ': ' + str);
    
var num = Number(obj);
    alert(
typeof(num) + ': ' + num);
    
var bool = Boolean(obj);
    alert(
typeof(bool) + ': ' + bool);
    
</script>

    除了Number(obj)转换失败,其它强行转换表达式都能取得有意义的转换效果。

    使用强行转换表达式最大的好处就是可以使程序代码变得清晰,为本身就类型混乱的JavaScript编程减少混淆的可能。

    至少我觉得类似:var str = String(3) + String(3); 比 var str = '' + 3 + 3; 表意更清晰。
    还有默认转换比较混乱的地方,比如:"88"-8和"88"+8,前者的默认转换是把字符串转为数字(结果80),而后者又是把数字转为字符串(结果"888")@_@,真是乱。所以使用变量类型强制转换,就可能避免这类默认转换带来的潜在理解出错的问题。

posted @ 2007-10-12 19:32 Eagle 阅读(296) | 评论 (0)编辑 收藏

2007年8月4日

本机ip[客户端]:
request.servervariables("remote_addr")

从哪个页面转到当前页面的:
Request.ServerVariables("HTTP_REFERER")

 得到本页地址:
<%="http://" + Request.ServerVariables("SERVER_NAME") + ":" + Request.ServerVariables("SERVER_PORT") + request.ServerVariables("script_name")+"?"+request.ServerVariableS("QUERY_STRING")%>
<%=server.URLencode("http://" + Request.ServerVariables("SERVER_NAME") + ":" + Request.ServerVariables("SERVER_PORT") + request.ServerVariables("script_name")+"?"+request.ServerVariableS("QUERY_STRING"))%> 

 

本机ip:<%=request.servervariables("remote_addr")%>
服务器名:<%=Request.ServerVariables("SERVER_NAME")%>
服务器IP:<%=Request.ServerVariables("LOCAL_ADDR")%>
服务器端口:<%=Request.ServerVariables("SERVER_PORT")%>
服务器时间:<%=now%>
IIS版本:<%=Request.ServerVariables("SERVER_SOFTWARE")%>
脚本超时时间:<%=Server.ScriptTimeout%>
本文件路径:<%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%>
服务器CPU数量:<%=Request.ServerVariables("NUMBER_OF_PROCESSORS")%>
服务器解译引擎:<%=ScriptEngine & "/"& ScriptEngineMajorVersion&"."&ScriptEngineMinorVersion&"."& ScriptEngineBuildVersion %>
服务器操作系统:<%=Request.ServerVariables("OS")%>
支持的文件类型:<%=Request.ServerVariables("HTTP_Accept")%>
访问的文件路径:<%=Request.ServerVariables("HTTP_url")%>
用户代理的信息:<%=Request.ServerVariables("HTTP_USER_AGENT")%>
获取url中的文件名和传过来的值:request.ServerVariables("script_name")+"?"+request.ServerVariableS("QUERY_STRING")

其中ServerVariables就是服务器的环境变量了,该变量包含的内容比较多,我们同样先采用for循环进行遍历查看下。
<%for each i in request.servervariables%> 
<%=i%>:
<%=request.servervariables(i)%>
<hr> 
<%Next%>

Request.ServerVariables("HTTP_REFERER")的工作方式

下列情况是从浏览器的地址栏正常取得Request.ServerVariables("HTTP_REFERER")的:
1.直接用<a href>
2.用Submit或<input type=image>提交的表单(POST or GET)
3.使用Jscript提交的表单(POST or GET)

下面我们再看看Request.ServerVariables("HTTP_REFERER")不能正常取值的情况:
1.从收藏夹链接
2.单击''主页''或者自定义的地址
3.利用Jscript的location.href or location.replace()
4.在浏览器直接输入地址
5.<%Response.Redirect%>
6.<%Response.AddHeader%>或<meta http-equiv=refresh>转向
7.用XML加载地址

显然,Request.ServerVariables("HTTP_REFERER")在多数情况下是不能正常工作的

Request.ServerVariables集合

ALL_HTTP客户端发送的所有HTTP标题文件。
ALL_RAW检索未处理表格中所有的标题。
APPL_MD_PATH检索ISAPIDLL的(WAM)Application的元数据库路径。
APPL_PHYSICAL_PATH检索与元数据库路径相应的物理路径。IIS通过将APPL_MD_PATH转换为物理(目录)路径以返回值。
AUTH_PASSWORD该值输入到客户端的鉴定对话中。只有使用基本鉴定时,该变量才可用。
AUTH_TYPE这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。
AUTH_USER未被鉴定的用户名。
CERT_COOKIE客户端验证的唯一ID,以字符串方式返回。可作为整个客户端验证的签字。
CERT_FLAGS如有客户端验证,则bit0为1。如果客户端验证的验证人无效(不在服务器承认的CA列表中),bit1被设置为1.
CERT_ISSUER用户验证中的颁布者字段(O=MS,OU=IAS,CN=username,C=USA)。
CERT_KEYSIZE安全套接字层连接关键字的位数,如128。
CERT_SECRETKEYSIZE服务器验证私人关键字的位数。如1024。
CERT_SERIALNUMBER用户验证的序列号字段。
CERT_SERVER_ISSUER服务器验证的颁发者字段。
CERT_SERVER_SUBJECT服务器验证的主字段。
CERT_SUBJECT客户端验证的主字段。
CONTENT_LENGTH客户端发出内容的长度。
CONTENT_TYPE内容的数据类型。同附加信息的查询一起使用,如:HTTP查询GET、POST和PUT。
GATEWAY_INTERFACE服务器使用的CGI规格的修订。格式为CGI/revision。
LOGON_USER用户登录WindowsNT®的帐号。
PATH_INFO客户端提供的额外路径信息。可以使用这些虚拟路径和PATH_INFO服务器变量访问脚本。如果该信息来自URL,在到达CGI脚本前就已经由服务器解码了。
PATH_TRANSLATEDPATH_INFO转换后的版本,该变量获取路径并进行必要的由虚拟至物理的映射。
QUERY_STRING查询HTTP请求中问号(?)后的信息。
REMOTE_ADDR发出请求的远程主机的IP地址。
REMOTE_HOST发出请求的主机名称。如果服务器无此信息,它将设置为空的MOTE_ADDR变量。
REMOTE_USER用户发送的未映射的用户名字符串。该名称是用户实际发送的名称,与服务器上验证过滤器修改过后的名称相对。
REQUEST_METHOD该方法用于提出请求。相当于用于HTTP的GET/HEAD/POST等等。
SCRIPT_NAME执行脚本的虚拟路径。用于自引用的URL。
SERVER_NAME出现在自引用UAL中的服务器主机名、DNS化名或IP地址。
SERVER_PORT发送请求的端口号。
SERVER_PORT_SECURE包含0或1的字符串。如果安全端口处理了请求,则为1,否则为0。
SERVER_PROTOCOL请求信息协议的名称和修订。格式为protocol/revision。
SERVER_SOFTWARE应答请求并运行网关的服务器软件的名称和版本。格式为name/version。

被发现隐起的
Request.ServerVariables("NUMBER_OF_PROCESSORS")
Request.ServerVariables("OS")
Request.ServerVariables("WINDIR")
Request.ServerVariables("TEMP")
Request.ServerVariables("TMP")
Request.ServerVariables("ComSpec")
Request.ServerVariables("Os2LibPath")
Request.ServerVariables("Path")
Request.ServerVariables("PATHEXT")
Request.ServerVariables("PROCESSOR_ARCHITECTURE")
Request.ServerVariables("PROCESSOR_IDENTIFIER")
Request.ServerVariables("PROCESSOR_LEVEL")
Request.ServerVariables("PROCESSOR_REVISION")

Request.ServerVariables("HTTP_X_FORWARDED_FOR") 是可以获得位于代理(网关)后面的直接IP,当然必须这个代理支持

微软的英文版解释
http://www.microsoft.com/windows2000/en/server/iis/htm/asp/vbob5vsj.htm 

posted @ 2007-08-04 12:12 Eagle 阅读(342) | 评论 (0)编辑 收藏

2007年7月21日

VBA语法概述

 

1,标识符:是一种标识变量、常量、过程、函数、类等语言构成单位的符号,利用它可以完成对变量、常量、过程、函数、类等的引用。命名规则如下: A, 字母打头,由字母、数字和下划线组成,如 A987b_23Abc B, 字符长度小于40,(Excel2002以上中文版等,可以用汉字且长度可达254个字符) C, 不能与VB保留字重名,如public, private, dim, goto, next, with, integer, single等

 

2,运算符:是代表VB某种运算功能的符号。

 

A, 赋值运算符 =

 

B, 数学运算符 &、+ (字符连接符)、+(加)、-(减)、Mod(取余)、\(整除)、*(乘)、/(除)、-(负号)、^(指数)

 

C, 逻辑运算符Not(非)、And(与)、Or(或)、Xor(异或)、Eqv(相等)、Imp(隐含)

 

D, 关系运算符 = (相同)、<>(不等)、>(大于)、<(小于)、>=(不小于)、<=(不大于)、Like、Is

 

E, 位运算符 Not(逻辑非)、And(逻辑与)、Or(逻辑或)、Xor(逻辑异或)、Eqv(逻辑等)、Imp(隐含)

 

3,数据类型:VBA共有12种数据类型,具体见下表,此外用户还可以根据以下类型用Type自定义数据类型。

 

数据类型 类型标识符 字节
字符串型 String $ 字符长度(0-65400)
字节型 Byte 1
布尔型 Boolean 2
整数型 Integer % 2
长整数型 Long & 4
单精度型 Single ! 4
双精度型 Double # 8
日期型 Date 8 公元100/1/1-9999/12/31
货币型 Currency @ 8
小数点型 Decimal 14
变体型 Variant 以上任意类型,可变
对象型 Object 4

 

4, 变量与常量:

 

1)VBA允许使用未定义的变量,默认是变体变量Variant。

 

2)在模块通用说明部份,加入 Option Explicit 语句可以强迫用户进行变量定义。

 

3)变量定义语句及变量作用域
Dim          变量 as 类型   '定义为局部变量,如 Dim  xyz as integer
Private      变量 as 类型   '定义为私有变量,如 Private xyz as byte
Public       变量 as 类型   '定义为公有变量,如 Public  xyz as single
Global       变量 as 类型   '定义为全局变量,如 Globlal xyz as date
Static       变量 as 类型   '定义为静态变量,如 Static  xyz as double
一般变量作用域的原则是,那部份定义就在那部份起作用,模块中定义则在该模块那作用。

 

4)常量为变量的一种特例,用Const定义,且定义时赋值,程序中不能改变值,作用域也如同变量作用域。如下定义:Const Pi=3.1415926 as single

 

5,数组:是包含相同数据类型的一组变量的集合,对数组中的单个变量引用通过数组索引下标进行。在内存中表现为一个连续的内存块,必须用Global或Dim语句来定义。定义规则如下: Dim 数组名([lower to ]upper [, [lower to ]upper, ….]) as type ;Lower缺省值为0。二维数组是按行列排列,如XYZ(行,列)。

 

除了以上固定数组外,VBA还有一种功能强大的动态数组,定义时无大小维数声明;在程序中再利用Redim语句来重新改变数组大小,原来数组内容可以通过加preserve关键字来保留。如下例: Dim array1() as double : Redim array1(5) : array1(3)=250 : Redim preserve array1(5,10)

 

6,注释和赋值语句

 

1)注释语句是用来说明程序中某些语句的功能和作用;VBA中有两种方法标识为注释语句。

 

ü 单引号 ’ ;如:’定义全局变量;可以位于别的语句之尾,也可单独一行

 

ü Rem ;如:Rem定义全局变量;只能单独一行

 

2)赋值语句是进行对变量或对象属性赋值的语句,采用赋值号 =,如X=123:Form1.caption=”我的窗口”。对对象的赋值采用:set myobject=object 或 myobject:=object

 

7,书写规范:

 

1)VBA不区分标识符的字母大小写,一律认为是小写字母;

 

2)一行可以书写多条语句,各语句之间以冒号 : 分开;

 

3)一条语句可以多行书写,以空格加下划线 _ 来标识下行为续行;

 

4)标识符最好能简洁明了,不造成歧义。

 

8,判断语句

 

1)If…Then…Else语句
If condition Then [statements][Else elsestatements]
如1:If A>B And C<D Then A=B+2 Else A=C+2
如2:If x>250 Then x=x-100
或者,可以使用块形式的语法:
If condition Then
[statements]
[ElseIf condition-n Then
[elseifstatements] ...
[Else
[elsestatements]]
End If
如1:
If Number < 10 Then
Digits = 1
ElseIf Number < 100 Then
Digits = 2
Else
Digits = 3
End If
2)Select Case…Case…End Case语句
如1:
Select Case Pid
Case “A101”
Price=200
Case “A102”
Price=300
……
Case Else
Price=900
End Case

 

3)Choose 函数: choose(index, choce-1,choice-2,…,choice-n),可以用来选择自变量串列中的一个值,并将其返回,index 必要参数,数值表达式或字段,它的运算结果是一个数值,且界于 1 和可选择的项目数之间。choice 必要参数,Variant表达式,包含可选择项目的其中之一。如: GetChoice? = Choose(Ind, "Speedy", "United", "Federal")

 

4)Switch函数: Switch(expr-1, value-1[, expr-2, value-2 _ [, expr-n,value-n]]) switch函数和Choose函数类似,但它是以两个一组的方式返回所要的值,在串列中,最先为TRUE的值会被返回。 expr 必要参数,要加以计算的 Variant 表达式。value 必要参数。如果相关的表达式为 True,则返回此部分的数值或表达式,没有一个表达式为 True,Switch 会返回一个 Null值。

 

9,循环语句

 

1)For Next语句 以指定次数来重复执行一组语句
For counter = start To end [Step step]     ' step 缺省值为1
[statements]
[Exit For]
[statements]
Next [counter]
如1:
For Words = 10 To 1 Step -1             ' 建立 10 次循环
For Chars = 0 To 9                    ' 建立 10 次循环
MyString = MyString & Chars            ' 将数字添加到字符串中
Next Chars                            ' Increment counter
MyString = MyString & " "           ' 添加一个空格
Next Words
2)For Each…Next语句:主要功能是对一个数组或集合对象进行,让所有元素重复执行一次语句
For Each element In group
Statements
[Exit for]
Statements
Next [element]
如1:
For Each rang2 In range1
With range2.interior
.colorindex=6
.pattern=xlSolid
End with
Next
这上面一例中用到了 With…End With 语句,目的是省去对象多次调用,加快速度;语法为:
With object
[statements]
End With
3)Do…loop语句 在条件为true时,重复执行区块命令
Do {while |until} condition      ' while 为当型循环,until为直到型循环,顾名思义,不多说啦
Statements
Exit do
Statements
Loop
或者使用下面语法
Do                                ' 先do 再判断,即不论如何先干一次再说
Statements
Exit do
Statements
Loop {while |until} condition

 

10,其他类语句和错误语句处理

 

A, 其他循环语句:结构化程序使用以上判断和循环语句已经足够,建议不要轻易使用下面的语句,虽然VBA还支持。

 

1)Goto line 该语句为跳转到line语句行

 

2)On expression gosub destinatioinlist 或者 on expression goto destinationlist 语句为根据 exprssion表达式值来跳转到所要的行号或行标记

 

3)Gosub line…line…Return语句, Return 返回到 Gosub line行,如下例:
Sub gosubtry()
Dim num
Num=inputbox(“输入一个数字,此值将会被判断循环”)
If num>0 then Gosub Routine1 :Debug.print num:Exit sub
Routine1:
Num=num/5
Return
End sub
4)while…wend语句,只要条件为TRUE,循环就执行,这是以前VB老语法保留下来的,如下例: while condition 'while I<50 [statements] 'I=I+1 wend 'Wend

 

B, 错误语句处理:执行阶段有时会有错误的情况发生,利用On Error语句来处理错误,启动一个错误的处理程序。语法如下:
On Error Goto Line   '当错误发生时,会立刻转移到line行去
On Error Resume Next     '当错误发生时,会立刻转移到发生错误的下一行去
On Erro Goto 0                '当错误发生时,会立刻停止过程中任何错误处理过程

 

11,过程和函数:过程是构成程序的一个模块,往往用来完成一个相对独立的功能。过程可以使程序更清晰、更具结构性。VBA具有四种过程:Sub 过程、Function函数、Property属性过程和Event事件过程。

 

A, Sub过程:Sub 过程的参数有两种传递方式:按值传递(ByVal?)和按地址传递(ByRef?)。如下例: {{ Sub password (ByVal? x as integer, ByRef? y as integer) If y=100 then y=x+y else y=x-y x=x+100 End sub

 

Sub call_password () Dim x1 as integer Dim y1 as integer x1=12 y1=100 Call password (x1,y1) ‘调用过程方式:1. Call 过程名(参数1, 参数2…) ; 2. 过程名 参数1, 参数2… debug.print x1,y1 ‘结果是12、112,y1按地址传递改变了值,而x1按值传递,未改变原值 End sub }}

 

B, Function函数:函数实际是实现一种映射,它通过一定的映射规则,完成运算并返回结果。参数传递也两种:按值传递(ByVal?)和按地址传递(ByRef?)。如下例:
Function password(ByVal x as integer, byref y as integer) as boolean
If y=100 then y=x+y else y=x-y
x=x+100
if y=150 then password=true else password=false
End Function
Sub call_password ()
Dim x1 as integer
Dim y1 as integer
x1=12
y1=100
if password then ‘调用函数:1. 作为一个表达式放在=右端 ; 2. 作为参数使用
debug.print x1
end if
End sub

 

C, Property属性过程和Event事件过程:这是VB在对象功能上添加的两个过程,与对象特征密切相关,也是VBA比较重要组成,技术比较复杂,可以参考相关书籍。

 

12,内部函数在VBA程序语言中有许多内置函数,可以帮助程序代码设计和减少代码的编写工作。
A.测试函数
IsNumeric(x)                                    ‘是否为数字, 返回Boolean结果,True or False
IsDate(x)                                       ‘是否是日期, 返回Boolean结果,True or False
IsEmpty(x)                                   ‘是否为Empty, 返回Boolean结果,True or False
IsArray(x)                                         ‘指出变量是否为一个数组。
IsError(expression)                                ‘指出表达式是否为一个错误值
IsNull(expression)                                ‘指出表达式是否不包含任何有效数据 (Null)。
IsObject(identifier)                                ‘指出标识符是否表示对象变量
B.数学函数
Sin(X)、Cos(X)、Tan(X)、Atan(x)  三角函数,单位为弧度
Log(x) 返回x的自然对数
Exp(x)返回 ex
Abs(x) 返回绝对值
Int(number)、Fix(number) 都返回参数的整数部分,区别:Int 将 -8.4 转换成 -9,而 Fix 将-8.4 转换成 -8
Sgn(number) 返回一个 Variant (Integer),指出参数的正负号
Sqr(number) 返回一个 Double,指定参数的平方根
VarType(varname) 返回一个 Integer,指出变量的子类型
Rnd(x)返回0-1之间的单精度数据,x为随机种子
C.字符串函数
Trim(string)                                 去掉string左右两端空白
Ltrim(string)                                 去掉string左端空白
Rtrim(string)                                 去掉string右端空白
Len(string)                                 计算string长度
Left(string, x)                         取string左段x个字符组成的字符串
Right(string, x)                         取string右段x个字符组成的字符串
Mid(string, start,x)                 取string从start位开始的x个字符组成的字符串
Ucase(string)                                 转换为大写
Lcase(string)                                 转换为小写
Space(x)                                 返回x个空白的字符串
Asc(string)                                 返回一个 integer,代表字符串中首字母的字符代码
Chr(charcode)                                返回 string,其中包含有与指定的字符代码相关的字符

D.转换函数
CBool(expression)                        转换为Boolean型
CByte(expression)                         转换为Byte型
CCur(expression)                         转换为Currency型
CDate(expression)                         转换为Date型
CDbl(expression)                         转换为Double型
CDec(expression)                         转换为Decemal型
CInt(expression)                         转换为Integer型
CLng(expression)                         转换为Long型
CSng(expression)                         转换为Single型
CStr(expression)                         转换为String型
CVar(expression)                         转换为Variant型
Val(string)                                 转换为数据型
Str(number)                                转换为String

E.时间函数
Now                    返回一个 Variant (Date),根据计算机系统设置的日期和时间来指定日期和时间。
Date                  返回包含系统日期的 Variant (Date)。
Time            返回一个指明当前系统时间的 Variant (Date)。
Timer                   返回一个 Single,代表从午夜开始到现在经过的秒数。
TimeSerial(hour, minute, second) 返回一个 Variant (Date),包含具有具体时、分、秒的时间。
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
返回 Variant (Long) 的值,表示两个指定日期间的时间间隔数目
Second(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一分钟之中的某个秒
Minute(time) 返回一个 Variant (Integer),其值为 0 到 59 之间的整数,表示一小时中的某分钟
Hour(time)          返回一个 Variant (Integer),其值为 0 到 23 之间的整数,表示一天之中的某一钟点
Day(date)         返回一个 Variant (Integer),其值为 1 到 31 之间的整数,表示一个月中的某一日
Month(date)         返回一个 Variant (Integer),其值为 1 到 12 之间的整数,表示一年中的某月
Year(date)         返回 Variant (Integer),包含表示年份的整数。
Weekday(date, [firstdayofweek]) 返回一个 Variant (Integer),包含一个整数,代表某个日期是星期几

 

13, 文件操作

 

1)文件

 

Dir[(pathname[, attributes])] ;pathname 可选参数,用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("");

 

attributes 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。

 

2)删除

 

Kill pathname 从磁盘中删除文件, pathname 参数是用来指定一个文件名

 

RmDir? pathname 从磁盘中删除删除目录,pathname 参数是用来指定一个文件夹

 

3)打开

 

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength] 能够对文件输入/输出 (I/O)。

 

pathname 必要。字符串表达式,指定文件名,该文件名可能还包括目录、文件夹及驱动器。

 

mode 必要。关键字,指定文件方式,有 Append、Binary、Input、Output、或 Random 方式。如果未指定方式,则以 Random 访问方式打开文件。

 

access 可选。关键字,说明打开的文件可以进行的操作,有 Read、Write、或 Read Write 操作。

 

lock 可选。关键字,说明限定于其它进程打开的文件的操作,有 Shared、Lock Read、Lock Write、和 Lock Read Write 操作。

 

filenumber 必要。一个有效的文件号,范围在 1 到 511 之间。使用 FreeFile? 函数可得到下一个可用的文件号。 reclength 可选。小于或等于 32,767(字节)的一个数。对于用随机访问方式打开的文件,该值就是记录长度。对于顺序文件,该值就是缓冲字符数。说明 对文件做任何 I/O 操作之前都必须先打开文件。Open 语句分配一个缓冲区供文件进行 I/O 之用,并决定缓冲区所使用的访问方式。如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。如果文件已由其它进程打开,而且不允许指定的访问类型,则 Open 操作失败,而且会有错误发生。如果 mode 是 Binary 方式,则 Len 子句会被忽略掉。

 

重要 在 Binary、Input 和 Random 方式下可以用不同的文件号打开同一文件,而不必先将该文件关闭。在 Append 和 Output 方式下,如果要用不同的文件号打开同一文件,则必须在打开文件之前先关闭该文件。

 

4)读入

 

Input #filenumber, varlist 从已打开的顺序文件中读出数据并将数据指定给变量

 

Get [#]filenumber, [recnumber], varname将一个已打开的磁盘文件读入一个变量之中。

 

5)写入

 

Write #filenumber, [outputlist] 将数据写入顺序文件

 

Print #filenumber, [outputlist] 将格式化显示的数据写入顺序文件中

 

Put [#]filenumber, [recnumber], varname 将一个变量的数据写入磁盘文件中。

 

6)关闭 Close [filenumberlist] 关闭 Open 语句所打开的输入/输出 (I/O) 文件

 

注意 如果今后想用 Input # 语句读出文件的数据,就要用 Write # 语句而不用 Print # 语句将数据写入文件。因为在使用 Write # 时,将数据域分界就可确保每个数据域的完整性,因此可用 Input # 再将数据读出来。使用 Write # 还能确保任何地区的数据都被正确读出。Write 与 Print # 语句不同,当要将数据写入文件时,Write # 语句会在项目和用来标记字符串的引号之间插入逗号。Write # 语句在将 outputlist 中的最后一个字符写入文件后会插入一个新行字符,即回车换行符,(Chr(13) + Chr(10))。

 

7)其他文件函数 LOF(filenumber) 返回一个 Long,表示用 Open 语句打开的文件的大小,该大小以字节为单位。

 

EOF(filenumber) 返回一个 Integer,它包含 Boolean 值 True,表明已经到达为 Random 或顺序 Input 打开的文件的结尾。

 

Loc(filenumber) 返回一个 Long,在已打开的文件中指定当前读/写位置

 

Seek(filenumber) 返回一个 Long,在 Open 语句打开的文件中指定当前的读/写位置

posted @ 2007-07-21 19:54 Eagle 阅读(1241) | 评论 (1)编辑 收藏

- - - - - - - - - - - - - - - - - - - -
VBA语法基础(下)
- - - - - - - - - - - - - - - - - - - -
基本语句
1、控制程序流程语句
(1) GoTo语句
该语句将执行的程序转到指定的标签所在的语句指令,但不能转移到过程之外的指令。例如,在进行错误捕捉时,发生错误后,程序转移至标签所在处执行。
(2) If…Then语句
这种类型的语句用于条件判断中,当满足条件时,执行相应的语句;当条件不满足时,执行其它的操作。
基本语法为:
If <条件> Then <条件满足时的执行语句>
If … Then语句有几种形式分别用于不同的情况:
①当只有一个条件时,可使用下面的结构:
If <条件> Then <条件满足时的执行语句> [Else <条件不满足时的执行语句>]
其中,Else子句可选。如果该语句不在同一行中,则应在后面加上End If语句,即:
If <条件> Then
  [指令]
End If
或:
If <条件> Then
  [指令]
Else
  [指令]
End If
当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的语句或结束If…Then语句的执行。
②当有两个或多个条件时,可使用嵌套的If … Then 结构:
If <条件> Then
  [指令]
ElseIf <条件1> Then
  [指令]
[Else]
  [指令]
End If
上面只是两层嵌套,可以根据情况使用多层嵌套。当条件为真时,执行Then后面的语句并结束If…Then语句的执行,否则判断条件1,当条件1为真时,执行Then后面的语句并结束If…Then语句的执行,否则执行Else后面的指令。
(3) Select Case语句
当需要作出三种或三种以上的条件判断时,最后使用Select Case语句。其基本语法为:
Select Case <测试表达式>
  [Case 条件表达式1]
     [指令]
  [Case 条件表达式2]
     [指令]
  ……
  [Case Else]
     [指令]
End Select
当某个条件表达式与测试表达式相匹配时,则执行其后的指令,否则执行Else(如果有的话)后的指令,然后结束Select Case块的执行。
此外,Select Case语句还可以嵌套。
(有关程序控制语句的进一步介绍和示例请见后面的一系列文章)
2、循环语句
循环即重复执行某段代码。在VBA中,有多种可以构成循环的语句结构。
(1) For … Next 循环
其语法如下:
For <计数器=开始数> To <结束数> [step 步长]
  [指令]
  [Exit For]
  [指令]
Next [计数器]
从开始到结束,反复执行For和Next之间的指令块,除非遇到Exit For语句,将提前跳出循环。其中,步长和Exit For语句以及Next后的计数器均为可选项。
For…Next循环中可以再包含For…Next循环,即For…Next循环可以嵌套使用。
(2) Do While循环
只有在满足指定的条件时才执行Do While循环。有两种形式:
■ 第一种形式
Do [While 条件]
  [指令]
  [Exit Do]
  [指令]
Loop
当条件满足时执行指令。
■ 第二种形式
Do
  [指令]
  [Exit Do]
  [指令]
Loop [While 条件]
先执行指令,然后再判断条件,如果条件满足则再次执行指令。
其中Exit Do语句表示提前退出指令块。
(3) Do Until循环
与Do While循环一样,也有两种形式;
■ 第一种形式
Do [Until 条件]
  [指令]
  [Exit Do]
  [指令]
Loop
■ 第二种形式
Do
  [指令]
  [Exit Do]
  [指令]
Loop [Until 条件]
执行指令,直到条件满足时退出循环。
(4) While … Wend循环
其语法为:
While <条件>
  [指令]
Wend
当条件满足时,则执行指令。
(有关循环语句的进一步介绍和示例请见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
过程
过程由一组完成所要求操作任务的VBA语句组成。子过程不返回值,因此,不能作为参数的组成部分。
其语法为:
[Private|Public] [Static] Sub <过程名> ([参数])
  [指令]
  [Exit Sub]
  [指令]
End Sub
说明:
(1) Private为可选。如果使用Private声明过程,则该过程只能被同一个模块中的其它过程访问。
(2) Public为可选。如果使用Public声明过程,则表明该过程可以被工作簿中的所有其它过程访问。但是如果用在包含Option Private Module语句的模块中,则该过程只能用于所在工程中的其它过程。
(3) Static为可选。如果使用Static声明过程,则该过程中的所有变量为静态变量,其值将保存。
(4) Sub为必需。表示过程开始。
(5) <过程名>为必需。可以使用任意有效的过程名称,其命名规则通常与变量的命名规则相同。
(6) 参数为可选。代表一系列变量并用逗号分隔,这些变量接受传递到过程中的参数值。如果没有参数,则为空括号。
(7) Exit Sub为可选。表示在过程结束之前,提前退出过程。
(8) End Sub为必需。表示过程结束。
如果在类模块中编写子过程并把它声明为Public,它将成为该类的方法。
(关于过程的详细介绍和示例见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
函数
函数(function)是能完成特定任务的相关语句和表达式的集合。当函数执行完毕时,它会向调用它的语句返回一个值。如果不显示指定函数的返回值类型,就返回缺省的数据类型值。
声明函数的语法为:
[Private|Public] [Static] Function <函数名> ([参数]) [As 类型]
  [指令]
  [函数名=表达式]
  [Exit Function]
  [指令]
  [函数名=表达式]
End Function
说明:
(1) Private为可选。如果使用Private声明函数,则该函数只能被同一个模块中的其它过程访问。
(2) Public为可选。如果使用Public声明函数,则表明该函数可以被所有Excel VBA工程中的所有其它过程访问。不声明函数过程的作用域时,默认的作用域为Public。
(3) Static为可选。如果使用Static声明函数,则在调用时,该函数过程中的所有变量均保持不变。
(4) Function为必需。表示函数过程开始。
(5) <函数名>为必需。可以使用任意有效的函数名称,其命名规则与变量的命名规则相同。
(6) 参数为可选。代表一系列变量并用逗号分隔,这些变量是传递给函数过程的参数值。参数必须用括号括起来。
(7) 类型为可选。指定函数过程返回的数据类型。
(8) Exit Function为可选。表示在函数过程结束之前,提前退出过程。
(9) End Function为必需。表示函数过程结束。
通常,在函数过程执行结束前给函数名赋值。
函数可以作为参数的组成部分。但是,函数只返回一个值,它不能执行与对象有关的动作。
如果在类模块中编写自定义函数并将该函数的作用域声明为Public,这个函数将成为该类的方法。
(关于Function过程的详细介绍和示例见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
事件处理过程
要对一个控件事件编写事件处理程序,应先打开窗体的代码窗口并从可用对象的下拉列表中选择所需的控件。然后,从该控件的可用事件下拉列表中选择所用的事件。此时,对事件处理程序的定义语句就会自动出现在代码窗口中,就可以直接编写事件处理程序了。
在Excel中,有下面几类事件,即Excel应用程序事件、工作簿事件、工作表事件、图表事件、用户窗体事件等。
(关于Excel中事件处理的介绍请见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
类模块
类模块是存放共享变量以及共享代码的存储库。创建一个类模块,实际上也是在创建一个COM(组件对象模型)接口。因此,类模块允许通过一个由属性、方法和事件组成的可编程接口向外界描述应用程序,同时保证保留对应用程序的控制权。也就是说,类模块能够让程序实现“封装”,这样,在其它工程中可以直接使用某类模块而不需要访问源代码。此外,可以使用类来创建自已的库,如果要使用的话,只需要在任何新的工程中添加一个对该类的引用就行了。并且,如果要改变程序,只需对类模块改动就行了,而不需要在程序的每个部分都作改动。
(有关类模块知识的详细介绍请见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
属性过程
属性过程(property procedure)是特殊的过程,用于赋予和获取自定义属性的值。属性过程只能在对象模块如窗体或类模块中使用。
有三种属性过程:
Property Let
  给属性赋值
Property Get
  获取属性的值
Property Set
  将对象引用赋给属性引用
- - - - - - - - - - - - - - - - - - - -
调用子过程和函数过程
子过程可以用下面三种方法调用。第一种使用Call语句:
Call DoSomething(参数1参数2,……)
如果使用Call语句,就必须用小括号将参数列表括起来。
第二种是直接利用过程名:
DoSomething 参数1参数2,……
此时,不用在参数列表两边加上括号。
如果不想使用函数的返回值,可以用上述任一种方法调用函数。否则,可以用函数名作为表达式的组成部分,如
If GetFunctionResult(parameter)=1 Then
如果用函数调用作为表达式的一部分,参数列表必须放在小括号中。
第三种是使用Run方法。
(关于过程调用更详细的介绍和示例请见后面的一系列文章)
- - - - - - - - - - - - - - - - - - - -
在过程间传递参数
在很多情况下,需要在子过程或函数中调用另一个自定义函数或子过程,这时,在被调用过程中就要用到在调用过程中使用的某个变量。因此,可把该变量作为参数传递给被调用过程。不管被调用过程是在同一模块、同一工程中的过程,还是在远程服务器上的类中的一个方法,从一个过程向另一个过程传递变量的原理都是一样的。
被调用过程(而不是调用过程)决定了变量如何从调用过程传递到被调用过程。
1、VBA允许用两种不同的方式在过程和组件之间传递参数。在子过程或函数的定义部分,可以指定参数列表中的变量的传递方式:ByRef(按引用)或者ByVal(按值)。
(1) ByRef
这是VBA中在过程间传递变量的默认方法。ByRef是指按引用传递变量,即传递给被调用过程的是原变量的引用。因此,如果改变了被调用过程中的变量值,其变化就会反映到调用过程中的那个变量,因为它们实际上是同一个变量。
(2) ByVal
如果使用ByVal关键字传递变量,被调用过程获得的就是该变量的独立副本。因此,改变被庙用过程中该变量的值不会影响调用过程中该变量原来的值。
2、Optional参数
Optional关键字用来指定某个特定的参数并不一定要传递,即为可选参数。但是,该参数必须放在最后。
3、ParamArray
使用ParamArray关键字能够使过程按受一组数目可变的参数。ParamArray参数必须是参数列表中的最后一个参数,而且不能在使用了Optional关键字的参数列表中使用ParamArray参数。
- - - - - - - - - - - - - - - - - - - -
变量(常量)作用域和生存期
有时需要在工程内的所有过程中使用某个变量,而有时某些变量又只需要在某些特定的过程中用到,变量的这种可见性称为变量作用域。
变量存在和作用的时间,称为变量的生存期。
变量或常数在程序中声明的位置决定了变量的作用域和生存期。
总的说来,在模块的声明部分用Private关键字声明的变量可以被模块中的所有过程使用;在模块的声明部分用Public关键字声明的变量可以被整个工程使用;若某个对象引用指向某类模块,则在该类模块的声明部分用Public关键字声明的变量可以被整个工程使用;在子过程或函数中用Dim语句声明的变量只能被声明这些变量的过程使用。
(1) 过程级作用域
在一个过程(即子过程或函数)内声明的变量只能在该过程内使用,其生存期在执行了End Sub或End Function语句后结束。因此,可以在不同的过程中定义具有相同名称的不同变量。声明过程级作用域的变量,在过程中用Dim语句声明变量。
此外,还有一种具有过程级作用域的特殊变量,称为静态变量。静态变量是在过程中定义的,尽管这种变量也具有过程级作用域,但是它具有模块级的生存期。这意味着只能在定义静态变量的过程内使用这些变量,但是变量的值在两次过程调用之间是保持不变的。用Static关键字声明静态变量:
Static lngExcuted As Long
还可以声明一个过程为静态过程,在这种情况下,在过程中声明的所有变量都被认为是静态变量,而且它们的值在两次过程调用之间都会保持不变,如
Static Procedure MyProcedure()
  Dim iCtr As Integer
(2) 模块级或私有作用域
具有模块级作用域的变量可以被某个模块内的所有子过程和函数使用,也可以在模块级生存期内保存在内存中。
在模块的声明部分(即任何子过程或函数外),用Dim语句或Private语句声明变量来创建一个具有模块级作用域的变量。
(3) Friend作用域
Friend关键字只能用于在对象模块(如类模块或窗体模块)中的变量和过程的声明。用Friend声明的变量允许工程中的其他对象模块访问原模块中的变量或方法,但是不需要用Public语句声明这些变量或方法。
(4) 公共作用域
在过程外使用Public语句声明的变量可以被当前工程中的所有模块使用。

posted @ 2007-07-21 19:47 Eagle 阅读(772) | 评论 (0)编辑 收藏

- - - - - - - - - - - - - - - - - -
VBA语法基础(上)
- - - - - - - - - - - - - - - - - -
数据类型
“数据类型”是指如何将数据存储在内存中。
(1)Boolean
表示逻辑数据,可以是True或False中的任一个值。占用2字节的存储空间,取值范围为True或False,缺省值为False。
(2)Byte
只能表示正数。占用1字节的存储空间,取值范围为0-255,缺省值为0。
(3)Currency
一种保存货币值数据的特殊数字格式。占用8字节的存储空间,取值范围为-922337203685477.5808-922337203685477.5807,缺省值为0。
(4)Date
一种用于表示日期或时间的专用格式。占用8字节的存储空间,取值范围为100年1月1日——9999年12月31日,缺省值为00:00:00。(有关在VBA中使用日期和时间的详细介绍请见后面的一系列文章。)
(5)Decimal
一种包含以10的幂为刻度的十进制数的变体子类型,只能通过CDec转换函数创建,不是一种独立的数据类型。占用14字节的存储空间,取值范围为±79228162514264337593543950335(不带小数点)或±7.9228162514264337593543950335(带28位小数点),缺省值为0。
(Decimal数据类型是在Excel 2000中引入的,在以前的版本中不能使用这种数据类型。该数据类型非常特殊,因为不能实际声明它,它是Variant的子类型,必须使用CDec函数将一个变量转换为Decimal数据类型)
(6)Double
存储双精度浮点数,占用8字节的存储空间,取值范围为负值:-1.79769313486232E308——4.94065645841247E-324,正值:1.79769313486232E308——4.94065645841247E-324,缺省值为0。
(7)Integer
表示从-32768-32767之间的整数,其中一位表示符号,占用2字节的存储空间,缺省值为0。
(8)Long
表示存储为4个字节空间的带符号的数,其中一位表示符号,取值范围为-2147483648-2147483647,缺省值为0。
(9)Object
包含对某个对象的引用(地址),占用4字节的存储空间,可对任何对象引用,缺省值为Nothing。
(10)Single
表示分数、带小数位或指数的数值等单精度数,占用4字节的存储空间,取值范围为负值:-3.402823E38——1.401298E-45,正值:1.401298E-45——3.402823E38,缺省值为0。
(11)String
可声明定长和变长的String数据类型。其中,定长的String数据类型占用的存储空间为字符串的长度,取值范围为1——65400个字符,缺省值等于该字符串长度的空格数。变长的String数据类型能动态地加长或缩短以存储要求的字符串数,占用的存储空间为10字节加上字符串的长度,取值范围为0——20亿个字符,缺省值为零长字符串(“”)。(有关String数据类型及处理和操作字符串数据的VBA内置函数的详细介绍请见后面的一系列文章。)
(12)Variant
Variant字符串类型的存储空间为22字节加上字符串的长度,其取值范围与变长字符串数据类型的取值范围相同,缺省值为Empty。
Variant数字型的存储空间为16字节,其取值范围与Double数据类型的取值范围相同,缺省值为Empty。
(有关Variant数据类型的进一步介绍见后面的一系列文章。)
(13)用户自定义类型
允许用户创建一种特殊的数据类型,这种数据类型由VBA的内部数据类型、数组、对象或其他用户定义类型组成,其存储空间为各个组成部分的存储空间的总和,取值范围与各个组成部分的数据类型的取值范围一致,缺省值为各个组成部分的缺省值。(有关用户自定义类型的进一步介绍请见后面的一系列文章。)
各数据类型之间也可以相互转换。(有关数据类型转换的详细介绍请见后面的一系列文章)
(有关数字数据类型(Byte、Integer、Long、Single、Double、Currency、Decimal、Variant)及相应的VBA内置函数的详细介绍请见后面的一系列文章。)
- - - - - - - - - - - - - - - - - -
常量(数)
常量即在程序执行过程中不发生改变的值或字符串。
使用Const语句声明常量。如:
Const Rate=0.25
Const NumMonths As Integer=12
Public Const myName As String=”BabyPig”
而最后一个语句声明了一个公共常量,应放在模块中所有过程之前声明。
VBA自身包含有许多内置常数,它们的值都是VBA预先定义好的,使用内部常数时无需定义这些常数的值。
■ 几个特殊的常数
由于有好几种不相同的“无效值”常数,VBA语言提供了好几种方法,以检验某个变量是否为empty或null值,或者设置某个变量为empty或null值。
(1) vbNull
和VarType函数一起使用,用于确定变量是否包含null。
(2) vbNullChar
赋值或检测null字符,null字符的值为Chr(0),即vbNullChar常数相当于将变量赋值为Chr(0),可用于检测变量,确定它的值是否是一个null字符。
(3) vbNullString
赋值或检测零长(空)字符串。
(4) Null关键字
将null值赋给variant变量后,可以通过调用IsNull函数来检测变量是否是Null值。
(5) vbEmpty
检测某个variant变量是否初始化。
(6) Nothing关键字
只能和对象变量一起使用,以确定变量是否具有有效的对象引用,此外,Nothing关键字还可以用于销毁当前的对象引用。
(关于常量的介绍还可见《ExcelVBA编程系列之数据类型(1):常量》)
- - - - - - - - - - - - - - - - - -
变量
变量的主要作用是存取数据、提供了数据存放信息的容器。根据变量的作用域不同,可分为局部变量、全局变量,见后面的变量(常量)作用域和生存期介绍。
变量命名要注意以下几点:
1、有效性。变量以字母开头,中间可以出现数字和一些标点符号,除下划线( _ )作为连字符外,变量名称不能有空格、加号(+)、减号(-)、逗号(,)、句点(.)等符号。
2、VBA不区分大小写。但在变量命名时,最好体现该变量的作用
3、不能使用VBA中的关键字作为变量。
4、变量名称中不能有特殊类型的声明字符(#、$、%、&或!)。
5、变量名称最多可以包含254个字符。
(有关VBA的命名规则的详细介绍请见后面的一系列文章)
- - - - - - - - - - - - - - - - - -
声明变量
其语法为:
Dim <变量名> As <数据类型>
或:Private <变量名> As <数据类型>
或:Public <变量名> As <数据类型>
可以在一行中声明多个变量,每个变量之间用逗号分隔开。
还有一种声明变量的方法是,将一个字符加在变量名称后面,从而声明变量的数据类型。如
Dim MyVar%
表示将变量MyVar声明为整型。一些类型声明符为:
数据类型        类型声明字符
Integer            %
Long               &
Single             !
Double           #
Currency       @
String             $
在模块前加入Option Explicit语句,将强制声明所使用的所有变量。
- - - - - - - - - - - - - - - - - -
对象变量
在使用对象模型的属性、方法和事件之前,必须创建一个对包含所需属性、方法和事件的类的引用。可以先声明一个局部对象变量以存储该对象引用,然后把对象引用赋给该局部变量。
声明对象变量的方法和声明其他类型的变量基本上一样。有三种声明对象变量的方法:
(1) Dim myObject As <库名>.<类名>
此方法指向类的类型库,但没有给该变量赋予任何类的实例。此时,变量myObject被赋值为Nothing。若要用这种方式引用类,就必须利用“引用”对话框向工程添加一个对类模块的引用。若要将类的实例引用赋予该变量,必须在使用该变量之前用Set语句赋值。如:
Set myObject=<库名>.<类名>
(2) Dim myObject As New <库名>.<类名>
此方法将类的新实例引用赋给Object变量。同样,要用这种方式引用类,必须先利用“引用”对话框向工程添加一个对类模块的引用。
(3) Dim myObject As Object
此方法将myObject变量声明为一般的Object数据类型,这在不能预先知道要创建的对象的数据类型时十分有用。此时,Object变量被赋值为Nothing。若要将对象引用赋值给该变量,必须使用CreateObject函数或GetObject函数。
可以用Private或Public语句替换Dim语句,且对象变量的作用域规则和其他类型的变量一样。
声明对象变量可以显著地简化代码且加快代码的执行速度。
有关对象模型的基础知识见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型一文。
- - - - - - - - - - - - - - - - - -
集合(Collection)对象
集合对象是其他对象的一个容器。
一般有四个方法:
(1) Add方法
添加一项到集合中。除了可以指定数据外还可以指定键值,通过键值可以访问集合中的成员。
(2) Count方法
返回集合中的项的个数。
(3) Item方法
通过集合中的索引(即集合中项的序号)或键(假设该项添加到集合时指定了)检索集合中的成员。
(4) Remove方法
通过集合中的索引或键删除集合中的成员。
可以使用With…End With构造和For Each … Next构造很方便地处理对象和集合,其介绍可参见ExcelVBA编程系列之对象模型(2):初步理解和使用Excel对象模型一文。
- - - - - - - - - - - - - - - - - -
运算符
运算符是用于完成操作的一系列符号,包括算术运算符、比较运算符、逻辑运算符、字符串运算符等。可用于连接一个或多个语言元素,或者完成一些运算以形成一个表达式。
- - - - - - - - - - - - - - - - - -
表达式
表达式就是变量、常量、运算符的集合,可分为算术表达式、字符串表达式、赋值表达式、布尔表达式等
详细的内容请见VBA编程系列:运算符和表达式
- - - - - - - - - - - - - - - - - -
数组
数组是一组拥有相同名称同类元素。定义数组后,即创建了数组。数组中单个的数据项称为数组元素,用于访问数组元素的编号称为数组索引号,最小索引号和最大索引号称为边界。
在VBA中,根据数组元素是否变化,分为固定大小的数组和动态数组,根据数组的维数又可分为一维数组和多维数组。
1、创建数组
用Dim语句来定义固定大小的数组,即声明一个数组。如
Dim myArray(9) As Integer
上面的代码创建一个名为myArray含有10个数组元素的一维数组。注意,所有VBA数组的下界均从0开始,因此上面的代码所创建的数组元素从myArray(0)到myArray(9)。
在Dim语句中不指明数组元素的个数来声明动态数组,如
Dim myDynamicArray() As Integer
使用ReDim关键字重新定义数组的大小:
ReDim myDynamicArray(10)
也可以用ReDim关键字同时声明一个动态数组并指定该数组的元素个数:
ReDim myDynamicArray(5) As Integer
VBA没有限制重新定义动态数组大小的次数,但在重新定义数组大小时,原有的数组数据就会丢失。如果需要保留原来的数据,可以使用Preserve关键字:
ReDim Preserve myDynamicArray(5)
需要注意的是,如果重新定义数组时减小了数组的大小,则会丢失被缩减了的那部分元素的数据。
当然,与声明变量一样,也可以用Public语句声明公共数组。
2、确定数组的边界
可以使用UBound函数和LBound函数分别获取数组的最大边界和最小边界。
默认情况下,VBA的数组的下界是从0开始的,可以在模块的声明部分使用Option Base语句来改变模块中数组的起始边界。如
Option Base 1
该语句使数组元素的索引号从1开始。
也可以在定义数组时指定数组的上界和下界,如
Dim <数组名> (<下界> to <上界>) As <数据类型>
3、多维数组
多维数组可以在每个数组元素中存储一组数据,因此,多维数组的每个数组元素都包含一个数组。与一维数组相同,可以使用下面的两种方法创建多维数组:
(1)Dim <数组名> (<数组元素数1>,<数组元素数2>,……) As <数据类型>
(2)Dim <数组名>(<下界> to <上界>,<下界> to <上界>,……) As <数据类型>
与一维数组相似,多维数组也可以是动态的。
4、引用数组中的元素
可以使用数组名称和一个索引号来引用数组中的某个特定的元素。
(有关数组的进一步介绍及其应用请见后面的一系列文章)
- - - - - - - - - - - - - - - - - -
内置函数
VBA中包含各种内置函数,可以简化计算和操作。在VBA表达式中使用函数的方式与使用工作表公式中函数的方式相同。
在VBA代码中,也可以使用很多Excel工作表函数,即使用WorksheetFunction对象调用工作表函数。但是不能使用具有与VBA内置函数功能相同的工作表函数。

posted @ 2007-07-21 19:46 Eagle 阅读(1004) | 评论 (1)编辑 收藏