2017-11-08 7 views
2

私は7つの変数を範囲として宣言しようとしています。私は現在、このフォーマットにExcel VBA - さまざまな変数宣言方法

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 

この形式を使用します。トップフォーマットを使用すると、マクロは完全に機能します。レンジRG4が空になったとき、私は変更して、第二のフォーマットを使用する場合、私は次のエラーに

実行時エラー「424」

必須 オブジェクトを取得するには、このエラーになります。私は最初の形式を使用するとき、それはエラーを与えることはありません。どうして?

+4

Rg1〜Rg6は範囲ではなくバリアントとして宣言しています。範囲として宣言されている唯一の変数は最後の変数です。 'Dim Rg1 As Range、Rg2 As Range ... 'を実行することができます。 –

+0

変数宣言を変更するだけでは不思議なエラーです。私は、あなたのコードに何か間違っていると思われます。例えば、 'Set'ステートメントの省略です。 – Rory

答えて

1
なります Variant になります

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と宣言すると、型が簡単に変更されることがあります。あなたがしたい場合は、範囲の配列を使用することができ

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

あなたは、変数をこのように宣言する場合:のみRG7はRangeなります

Dim Rg1, Rg2, Rg3, Rg4, Rg5, Rg6, Rg7 As Range 

、他のすべての変数が一つだけの行をしたい場合は、唯一のオプションは

Dim Rg1 As Range, Rg2 As Range, Rg3 As Range, Rg4 As Range, Rg5 As Range, Rg6 As Range, Rg7 As Range 
+0

精度:VB.NETでは、両方の行が同じ動作をしますが、VBAはこのダム動作をします – Pierre

0

Dim Rng(1 To 7) As Range 

Set Rng(1) = ws.Range("A1") 
Set Rng(2) = ws.Range("B1") 
' Etc.... 

他の人が述べたように、あなたがそれを再宣言後の型がStringIntegerから変更するには、次のコードを、参照してください。あなたの宣言で:RG7がタイプである一方、
Dim Rg1, Rg2, Rg3, Rg4, Rg5, Rg6, Rg7 As Range
Rg1-6は、タイプVariantです

関連する問題