サイトについて      連絡先   検索

VBA 値型と参照型の違い

はじめに

Excel VBA の値型と参照型の違いを紹介します。

Worksheet などのオブジェクトのようにクラスで作成されたものが参照型です。

参照型を別の変数にコピーしたときに値型との違いがあります。

値型と参照型とは

値型とは Integer や String や Date などの値を持った型のことです。

参照型とはオブジェクトのことで、変数に代入するときにSet 変数 = オブジェクトのように Set が必要な型のことです。Worksheet などがあり、クラスで作成されたものは参照型です。

値型と参照型の違い

参照型を別の変数に代入したときに値型との違いが現れます。Excel のセル参照がわかれば理解しやすくなります。

次のような単純な Value を持ったクラスで説明します。

Class1 のコード


Public Value As Integer

Sheet1 のコード

Class1 の変数を定義します。


Dim c1 As Class1
Dim c2 As Class1
1

Class1 をインスタンス化します。これは新しいセルを参照することです。


Set c1 = New Class1
2

インスタンスを別の変数に代入します。これはセル参照をコピーするのと同じです。

Value の値をコピーするのではなく参照をコピーする、この部分が値型と参照型の違いです。


Set c2 = c1
3

c1 の Value に値を設定します。c2 も同じセルを参照しているので、同じ値になります。


c1.Value = 10
Debug.Print (c1.Value) ' 10
Debug.Print (c2.Value) ' 10
4

新たにインスタンス化します。これは新たに別のセルを参照することです。インスタンス化する度に、別のセルを参照することになります。


Set c2 = New Class1
5

参照が違うので c1 と c2 の Value に関連はありません。


c2.Value = 20  
Debug.Print (c1.Value) ' 10
Debug.Print (c2.Value) ' 20
6

まとめ

Excel の例ではセルでしたが、VBA ではクラスを参照することがインスタンス化です。

インスタンス化された変数を別の変数に代入すると、その参照をコピーするので、どちらの変数も同じクラスを参照しています。片方の値を変更すれば、もう片方も変更されます。一方、値型では値をコピーするのでどちらかの変数の値を変更しても、もう片方には影響しません。

新しく別のクラスが必要になれば、その都度インスタンス化します。

関連ページ