如何声明静态变量与常量


静态变量与动态变量在使用上完全一致,在声明语句却不同。
常量也有自己专用的声明方式。本节讲述静态变量与常量的声明方式。
10.1 静态变量  
静态变量的特点是它所在过程执行完毕后,变量的值仍然保持不变量。声明静态变量的语句是Stat。
10.1.1 静态变量的作用域
静态变量与动态变量的作用域大大不同,它只能在过程中使用,所以它的作用域仅限于当前模块。
如果在过程之外、模块顶部声明一个静态变量,那么执行过程时然弹出以下提示:

 


 

图10.1 声明模块级变量的错误提示


10.1.2 声明静态变量
声明静态变量必须使用Static语句。
Static语句的语法如下:
Static varname[([subscripts])] [As [New] type] [, varname[([subscripts])] [As [New] type]] . . .
各参数的含义见表10-1所示。

 

表10-1 Static 语句参数详解


参数


 

含义


 

varname


 

必需的。变量的名称;遵循标准变量命名约定


 

subscripts


 

可选的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法:[lower To] upper [,[lower To] upper] . . .


 

New


 

可选的。用它可以隐式地创建对象的关键字。如果使用 New 声明对象变量,则在第一次引用该变量时将新建该对象的实例,因此不必使用 Set 语句来对该对象引用赋值。New 关键字不能用来声明任何内部数据类型的变量,也不能用来声明从属对象的实例


 

type


 

可选的。变量的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length(对定长的字符串)、Object、Variant、用户定义类型或对象类型


 
根据上表的分析,声明三个字符形变量可以使用以下两种方式:
__________________________________________________________

Sub test1()
Static a As String, b As String, c As String
..........
End Sub

Sub test1()
Static a As String
Static b As String
Static c As String
..........
End Sub
__________________________________________________________

下面例举一个静态变量的实例:
要求:在工作表保护状态下,弹出一个对话框,让用户输入工作表解密的密码。如果错误则再次弹出密码框等待用户输入;如果连续错误三次则关闭工作簿。
1.对工作表设置密码123;
2.使用快捷键【Alt+F11】进入VBE界面;
3.单击菜单【插入】、【模块】;
4.在模块中输入以下代码:
__________________________________________________________

Sub 验证()
Static 次数 As Byte '静态变量
Dim 密码 As String '动态变量
On Error Resume Next
次数 = 次数 + 1 '累加变量
密码 = InputBox("请输入密码:", "确认权限") '输入密码
ActiveSheet.Unprotect 密码 '用输入的密码对工作表解决
If Err <> 0 Then '如果有错误(表示密码错误)
'提示错误次数,如果是第三次错误则关闭工作簿
MsgBox "您已错误" & 次数 & "次" & IIf(次数 = 3, "工作簿即将关闭,请稍候再试", "")
If 次数 = 3 Then ThisWorkbook.Close (False)
Err.Clear
'递归
Call 验证
End If
End Sub
__________________________________________________________

5.执行以上过程,将弹出图10.2所示对话框,等待用户输入密码;
6.输入“ABC”,程序会弹出图10.3所示对话框,表示当前错误的次数;

 

图10.2 密码确认框


图10.3 错误第一次

7.如果第三次输入错误,那么将弹出图10.4所示对话框,当单击“确定”按钮后工作簿会关闭。如果密码正确则解决保护。
 


 

图10.4 第三次错误时的提示


10.2 声明常量
声明常量可以使用Const语句。
Const语句的语法如下:
[Public | Private] Const constname [As type] = expression
其中各参数含义见下表:

 

表10-2 Const语句参数详解


参数


 

含义


 

Public


 

可选的。该关键字用于在模块级别中声明在所有模块中对所有过程都可以使用的常数。在过程中不能使用


 

Private


 

可选的。该关键字用于在模块级声明只能在包含该声明的模块中使用的常数。不能在过程中使用


 

constname


 

必需的。常数的名称;遵循标准的变量命名约定


 

type


 

可选的。常数的数据类型;可以是 Byte、 Boolean 、Integer、Long、Currency、Single、Double、、Date、String 或 Variant


 

expression


 

必需的。文字,其它常数,或由除 Is 之外的任意的算术操作符和逻辑操作符所构成的任意组合


 
根据上表的分析,声明常量使用Const语句,但配合Public与Private后可以使常量有共有常量和私有常量之分。
例如声明一个过程级的常量可以使用以下方式:
__________________________________________________________

Sub test()
Const PI As String = "3.1415926"
MsgBox PI
End Sub
__________________________________________________________

声时一个模块级常量可以使用以下两种方式:
__________________________________________________________

Const PI As String = "3.1415926"
'或者Private
Const PI As String = "3.1415926"
Sub test1()
MsgBox PI
End Sub
Sub test2()
MsgBox PI
End Sub
__________________________________________________________

将以上代码全输入到同一个模块中,执行两个过程都可以都可以访问常量批PI。
如果在模块顶部使用以下语句,那么该变量则是工程级变量,任何模块中的过程都可以调用PI的值。
Public Const PI As String = "3.1415926"
声明常量好优点有两个:

●简化代码
例如常量PI在输入上相对于3.1415926有更高地效率

●方便修改
当过程中多处使用3.1415926时,如果需要对值进行修改,那么需要修改多次。而使用常量后,仅仅对声明常量的语句修改即可,其它所有代码中调用的PI都会相应地变化。