我试图将7个变量声明为Ranges。我目前正在使用这种格式
Dim Rg1 As Range
Dim Rg2 As Range
Dim Rg3 As Range
Dim Rg4 As Range
Dim Rg5 As Range
Dim Rg6 As Range
Dim Rg7 As Range
但我想使用这种格式
Dim Rg1, Rg2, Rg3, Rg4, Rg5, Rg6, Rg7 As Range
我认为在这方面没有区别,但显然有。使用顶部格式,宏工作完美。当我更改并使用第二种格式时,我收到以下错误
运行时错误' 424' 需要对象
当范围Rg4为空时发生此错误。但是,当我使用第一种格式时,它不会给出错误。为什么呢?
答案 0 :(得分:2)
如果以这种方式声明变量:
Dim Rg1, Rg2, Rg3, Rg4, Rg5, Rg6, Rg7 As Range
只有Rg7为Range
,所有其他变量为Variant
如果您只想要一行,唯一的选择是
Dim Rg1 As Range, Rg2 As Range, Rg3 As Range, Rg4 As Range, Rg5 As Range, Rg6 As Range, Rg7 As Range
答案 1 :(得分:1)
声明一行上的所有值与VB.Net
完美匹配,但使用VBA则存在问题。因此,声明Dim Rg1, Rg4, Rg7 as Range
仅将最后声明的值设为Range
,其他值为Variant
。
但是,在您的情况下,将其他Rg1
和Rg4
设置为范围后,它们就会像范围一样开始。例如,您可能会要求rg4.Address
并且您将获得它,因为新类型是Variant/Object/Range
,如果您明确声明它将是Range
- 请参阅VBA监视器以了解类型:
此外,一旦您将值声明为Variant
,它们可能会轻松更改类型。请参阅以下代码,重新声明后,类型会从Integer
更改为String
:
Public Sub TestMe()
Dim rg1
Dim rg2
Dim bornRange As Range
Range("A1") = "TEST"
Debug.Print VarType(rg1) = vbEmpty 'true
Debug.Print VarType(rg2) = vbEmpty 'true
Set rg1 = Range("A1")
rg2 = 2
Debug.Print VarType(rg1) = vbString 'true
Debug.Print VarType(rg2) = vbInteger 'true
Set rg2 = Range("A1")
Debug.Print rg2.Address '$A$1
Debug.Print VarType(rg2) = vbInteger 'false
Debug.Print VarType(rg2) = vbString 'true
End Sub
答案 2 :(得分:0)
如果您愿意,可以使用范围数组:
Dim Rng(1 To 7) As Range
Set Rng(1) = ws.Range("A1")
Set Rng(2) = ws.Range("B1")
' Etc....
正如其他人所说,声明:
Dim Rg1, Rg2, Rg3, Rg4, Rg5, Rg6, Rg7 As Range
Rg1-6 是Variant
类型,而 Rg7 是类型Range