dimとsetinvbaの違いは何ですか


82

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

時々使う

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

他の時に私は使用します

Set r = Range("A1")

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

回答:


78

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

3
これを理解するためにどのチュートリアルまたは本を参照したか教えていただけますか?
ラム

18
この回答は、「理由」を実際には説明していません
kizzx2 2012年

1
VBAは非常に賢く、多くの言語のように何をしているのかを伝える必要はありません。ただし、これにより時間が追加されます。あらゆる種類の異なるバリアントで異なるディメンションのホスト全体を使用している場合は、時間が加算されます。VBAに変数を見つけたときに何を期待するかを指示すれば、それを解決する必要はありません。また、変数が文字列ではなく整数であることをVBAに伝えると、RAMをそれほど消費しなくなります。後者の点は、一般的な小さなVBAプロジェクトではおそらくそれほど有効ではありませんが、それでもコーディングの実践としては優れています。
ラピッド

最初に変数を使用Setせずに使用しても大丈夫Dimですか?
solstice3

64

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

時々私は使用します:

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

これは決して機能しません。これがないSetと、ランタイムエラー#91オブジェクト変数またはブロック変数が設定されていません。これは、を使用して変数値をオブジェクト参照に割り当てる必要があるためですSet。その後、上記のコード機能します。

以下のコードは、あなたが本当に求めていることを示していると思います。型を宣言せrず、Variant代わりに型にしようとしましょう。

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 バリアントとして宣言されています

    `Dim r` ' TypeName(r) returns "Empty", which is the value for an uninitialized variant
    
  2. rRange含まれているセル「A1」に設定されます

    Set r = Range("A1") ' TypeName(r) returns "Range"
    
  3. r設定された値デフォルトプロパティRange("A1")

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

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

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

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


あなたのSet例として:

他の時に私は使用します

Set r = Range("A1")

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


@PierreClaverieはい:)Dim and Setの
Wolf

1
@Wolfはあなたが知っているかどうかわかりませんが、VBA言語の参照はgithubで維持されるようになりました。github.com/OfficeDev/VBA-content/blob/master/VBA/...
RubberDuck

@RubberDuck私は気づいていませんでした(私はvb *を初めて使用します)、このメモを追加してくれてありがとう。
オオカミ

どういたしまして@Wolf。最近、VBAと古いVB6ドキュメントを見つけるのが難しい場合があることを私は知っています。
RubberDuck 2016

8

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

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

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

Dim r As Integer
r=5


2

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


1

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

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

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


0

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

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`

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.