'1. 类型自动转换机制: ' VBA看似很聪明,当我们混合使用数据类型时,VBA会使用特别的类型转换机制,把实际输入的数据转换成希望接收的数据类型. ' 比如一个地方要求是一个Dobule类型的,但是提供的是一个String类型,这时VBA会按自己的规则先把String数据转换成一个 ' Double数据再使用.反之亦然. Sub TypeSelfAdaptation() Dim s As String Dim i As Integer Dim dbl As Double dbl = Application.Pi() 'dbl=3.14159265358979 i = dbl 'i=3,因为是整型,小数部分被舍去 s = dbl 's="3.14159265358979" Stop End Sub
'2. 会进行类型自动转换的情况: ' 2.1 赋值符号=右边的值,不包括Set aObj=SomeObject的情况,因为这是专门针对对象的 ' 2.2 运算符两边的值 ' 2.3 接受参数的方法或过程里的形式参数 Sub AdaptionCondition() Const s = "3.14" Dim i As Integer, j As Integer Dim dbl As Double
i = s '2.1的情况,赋值符号右边的值s从String类型转换成整型.
dbl = s * s '2.2的情况,运算符*号右边的值s从String类型转换成Double类型. j = 5 Mod s '2.2的情况,运算符Mod右边的值s从String类型转换成Integer类型.
MsgBox "VbYesNoCancel,显示 Yes、No 及 Cancel 按钮", s '2.3的情况,MsgBox函数的Buttons参数输入值s自动由String类型转换成Integer类型.
Sub a() '错误:Variant()与Variant(1 to 4, 1 to 2),不匹配 'arr(),元素为Variant类型的数组 '[A2:B5],区域快速表达方式,自动类型转换时成动态数组时不取其Value进行转换,这也许是其叫快速的原因吧.arr = Range("A2:B5")可行 Dim arr() arr = [A2:B5] 'arr = Range("A2:B5") Stop End Sub
Sub b() '错误:String()与Variant(1 to 4, 1 to 2),不匹配 'arr(),String()类型 '[A2:B5].Value,Variant/Variant(1 to 4, 1 to 2)类型,不匹配 Dim arr() As String arr = [A2:B5].Value Stop End Sub
Sub c() '正确:Variant与Variant(1 to 4, 1 to 2),匹配 '[A2:B5]自动转换为Variant类型时,取其Value属性转换成包含数组的Variant变量 Dim arr arr = [A2:B5] Stop End Sub
Sub d() '正确:Variant()与Variant/Variant(1 to 4, 1 to 2),匹配 '已经明确取[A2:B5]的Value属性 Dim arr() As Variant arr = [A2:B5].Value Stop End Sub
Sub e() '错误:Variant()与Variant(1 to 4, 1 to 2),不匹配 '与a一样 Dim arr() As Variant arr = [A2:B5] Stop End Sub
Sub f() '?:Object与Variant(1 to 4, 1 to 2),匹配? '[A2:B5]本来便是Range类型,用的Set语句,明确等号两边是Object类型. Dim Rng As Object Set Rng = [A2:B5] Stop End Sub