Excel VBA - 声明变量的不同方法

时间:2017-11-08 15:00:29

标签: excel-vba variables vba excel

我试图将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为空时发生此错误。但是,当我使用第一种格式时,它不会给出错误。为什么呢?

3 个答案:

答案 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

但是,在您的情况下,将其他Rg1Rg4设置为范围后,它们就会像范围一样开始。例如,您可能会要求rg4.Address并且您将获得它,因为新类型是Variant/Object/Range,如果您明确声明它将是Range - 请参阅VBA监视器以了解类型:

enter image description here

此外,一旦您将值声明为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