web-dev-qa-db-ja.com

vbaのdimとsetの違いは何ですか

VBAの初心者としてご容赦ください。

時々使う

Dim r as Range
r = Range("A1")

私が使用する他の回

Set r = Range("A1")

違いはなんですか?そして、いつ何を使うべきですか?

71
Ram

オブジェクト参照を参照しない限り、setを使用する理由はありません。そのコンテキストでのみ使用することをお勧めします。他のすべての単純なデータ型については、代入演算子を使用してください。ただし、すべての変数をdim(ディメンション)にすることをお勧めします。

単純なデータ型の例は、integerlongbooleanstringです。これらは単なるデータ型であり、独自のメソッドやプロパティはありません。

Dim i as Integer
i = 5

Dim myWord as String
myWord = "Whatever I want"

objectの例は、RangeWorksheet、またはWorkbookです。これらには独自のメソッドとプロパティがあります。

Dim myRange as Range
Set myRange = Sheet1.Range("A1")

Setなしで最後の行を使用しようとすると、VBはエラーをスローします。 objectが宣言されたので、そのプロパティとメソッドにアクセスできます。

myString = myRange.Value
69
Michael

しかし、これはあなたが本当に求めていることではないと思います。

時々私は使用します:

    Dim r as Range
    r = Range("A1")

これは機能しません。 Setがないと、ランタイムエラーが表示されます #91Object variable or With block variable not set 。これは、mustSetを使用して変数値をオブジェクト参照に割り当てるためです。次に、上記のコードwillが機能します。

以下のコードはあなたが何をしているのかを示していると思いますreally型を宣言せず、代わりにrVariant型にするとします。

Public Sub test()
    Dim r
    debug.print TypeName(r)

    Set r = Range("A1")
    debug.print TypeName(r)

    r = Range("A1")
    debug.print TypeName(r)
End Sub

それでは、ここで何が起こるかを分析しましょう。

  1. rがVariantとして宣言されています

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rは、セル "A1"を含むRangeに設定されます

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. rは、Range("A1")defaultプロパティvalueに設定されます。

    r = Range("A1") ' TypeName(r) returns "String"
    

この場合、Rangeのデフォルトプロパティは.Valueであるため、次の2行のコードは同等です。

r = Range("A1")
r = Range("A1").Value

デフォルトのオブジェクトプロパティの詳細については、 チップピアソンの「クラスのデフォルトメンバー」 を参照してください。


Setの例に関しては:

私が使用する他の時間

Set r = Range("A1")

これは、rRangeまたはVariantオブジェクトであることを最初に宣言しないと機能しません... Dimステートメントを使用して-Option Explicitを有効にしていない場合を除きます。常に。それ以外の場合は、宣言していない識別子を使用しており、それらはすべて暗黙的に Variants として宣言されています。

59
RubberDuck

Dim:変数を定義しています(ここで、rはRange型の変数です)

設定:プロパティを設定しています(ここでは、rの値をRange( "A1")に設定します-これはタイプではなく、値です)。

オブジェクトでsetを使用する必要があります。rが単純型(たとえば、int、string)の場合、次のように記述します。

Dim r As Integer
r=5
7

Dimは、単に値と型を宣言するだけです。

Setは、変数に値を割り当てます。

4
Justin Niessner

変数がオブジェクトとして定義されている場合myfldr As Folderの場合、キーワード「Set」を使用して値が割り当てられます。

1
user2479175

DimはDimensionの略で、VBAおよびVB6でローカル変数を宣言するために使用されます。

一方、設定は、変数宣言とは関係ありません。 Setキーワードは、オブジェクト変数を新しいオブジェクトに割り当てするために使用されます。

それがあなたのために違いを明らかにすることを願っています。

1
IqbalHamid

SETステートメントのVBAヘルプによると、object.soへの参照を設定します。プロパティを変更すると、実際のオブジェクトも変更されます。

Dim newObj as Object
Set var1=Object1(same type as Object)
Set var2=Object1(same type as Object)
Set var3=Object1(same type as Object)
Set var4=Object1(same type as Object)
Var1.property1=NewPropertyValue

他のVarsプロパティも変更されます。

Var1.property1=Var2.property1=Var3.property1=Var4.property1=Object1.Property1=NewpropertyValue`

実際、すべての変数は同じです!

0
Soroush