在Visual Basic中声明和赋值变量和常量
声明变量
在Visual Basic中,变量可以显式或隐式声明。要显式声明变量,需要使用Dim关键字或Public关键字将变量声明为公共类或模块成员(有关更多信息,请参阅变量作用域文章)。
可以使用As关键字声明变量的类型。
Dim textVal As String
如果未明确声明变量的类型,则默认为Variant
Dim varVal '隐式声明为Variant
当变量隐式声明时,不使用Dim关键字。在这种情况下,变量的值直接赋值。
implicitVal = 10 '隐式声明和赋值变量
这种方法不推荐使用,因为它可能会引入代码的歧义和潜在问题。
为了在Visual Basic中强制使用显式变量声明,需要使用Option Explicit语句。在这种情况下,如果发现隐式变量,则会出现编译错误。
{ width=300 }
声明相同类型的一组变量
可以将变量声明为一组。
Dim textVar1, textVar2, textVar3 As String '将3个变量显式声明为String类型
这种方法可以使代码更易读和紧凑。
声明具有不同类型的一组变量
可以使用每个变量的声明字符来使用短声明显式声明类型。
Dim intVar%, doubleVar#, longVar& '使用短声明显式声明整数、双精度和长整型变量
请参阅标准类型文章,了解声明字符的列表。
这是一种传统的变量声明方式。不推荐使用这种方法来声明变量。
赋值
为了给变量赋值,需要使用等号(=)符号,其中变量名出现在左边,变量值出现在右边。
Dim varName As String
varName = "VarValue"
可以将一个变量的值复制给另一个变量
Dim var1 As Integer
Dim var2 As Integer
var1 = 10
var2 = var1 'var2的值现在等于var1的值,即10
可以将变量的值分配为调用另一个函数的结果。有关函数的更多信息,请参阅函数和过程文章。
Dim funcRes As Double
funcRes = GetValueFunc()
声明常量
常量允许定义在执行过程中不会更改的值。通常用于声明数学常量(例如PI、重力常数等)、转换因子(例如小时到分钟、英寸到米等)或任何其他程序特定的值。
使用Const语句声明常量,并在声明时赋值。
Const G As Double = 9.8 '重力常数
与变量声明相同,常量类型可以显式定义(使用As关键字)或隐式定义。
一旦声明,常量的值就不能更改。否则将出现编译错误。
{ width=300 }
此代码示例演示了声明和赋值常量和变量的不同方式。
Sub main()
Dim i, j, k As Integer '声明3个整数类型的变量
i = 10 '为声明的变量设置值
l = 20 '为隐式声明的变量设置值
Debug.Print TypeName(l) 'Integer
Dim intVar%, doubleVar#, longVar&
Debug.Print TypeName(intVar%) 'Integer
Debug.Print TypeName(doubleVar#) 'Double
Debug.Print TypeName(longVar&) 'Long
Const PI As Double = 3.14159265359 '声明和初始化常量
'PI = 0 '编译错误
Dim res As Double
res = Sqrt(16) '返回4并将其分配给res变量
Debug.Print res
End Sub
赋值引用变量
与值类型不同,引用类型在赋值时必须遵循几个额外的规则。
{ width=200 }
- 必须使用new关键字创建引用类型的新实例。否则将显示运行时错误'91'
{ width=350 }
- 必须使用Set关键字来赋值,否则将显示运行时错误'91'
{ width=350 }
请参阅下面的代码以正确赋值引用类型变量。
Sub main()
Dim userType As MyUserType
Set userType = New MyUserType
Dim obj As Object
'obj = userType '不使用Set关键字时,将显示对象变量或With块变量未设置的运行时错误
Set obj = userType '将指针分配给obj变量,指向MyUserType对象
End Sub
引用变量只保存指向实际值的指针,即Set关键字将引用(而不是实际值,如值类型中的赋值)分配给变量。这意味着如果将一个变量的引用分配给另一个变量,它们都将引用相同的数据。
绑定
绑定是将对象分配给变量的过程。当使用早期绑定时,特定的对象类型在预先声明,因此绑定可以在编译时发生。晚期绑定在运行时解析,事先不知道特定的对象类型。
早期绑定
Dim objLate As Object '晚期绑定的示例
Dim objEarly as MySpecificType '早期绑定的示例
早期绑定的对象通常使用new关键字初始化
Dim objEarly as MySpecificType
Set objEarly = new MySpecificType
优点
- 性能。编译器可以根据对象的类型和大小在编译时执行所需的优化
- 可维护性。当声明特定类型时,代码更清晰、更易于维护和阅读
- 对于早期绑定的对象,可以使用动态帮助和IntelliSense(代码完成)功能
晚期绑定
虽然晚期绑定的对象通常使用CreateObject或GetObject函数初始化
Dim xlApp As Object
Set xlApp = CreateObject("Excel.Application")
但是,在晚期绑定中使用new关键字并使用CreateObject或GetObject在早期绑定中仍然是可以接受的。
优点
- 不需要维护第三方引用,当代码移植到另一个环境或发布了第三方引用的另一个版本时,这可能是一个问题。请参阅此引用问题示例