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

VBA 値型と参照型の違い

はじめに

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

ワークシートなどクラスで作成されたオブジェクトが参照型です。

それ以外の Integer や String などが値型です。別の変数に代入したときに違いがあります。

  • 目次
    • 値型と参照型とは
    • 値型と参照型の違い
    • まとめ

値型と参照型とは

値型には Integer や String や Date などがあります。オブジェクト以外すべて値型です。

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

値型と参照型の違い

参照型を別の変数に代入したときに値型との違いがあります。Excel のセル参照を使ったことがあれば理解しやすいと思います。

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

Class1 のコード


Public Value As Integer

Sheet1 のコード

Class1 の変数を 2 つ宣言します。


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

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


Set c2 = New Class1
5

参照先が違うので c1 と c2 の Value は別の値になります。


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

まとめ

オブジェクト型の変数にはインスタンスが入っています。インスタンスとはオブジェクトの参照先です。

その変数を別の変数に代入すると、インスタンスがコピーされるので同じオブジェクトが参照されます。参照先が同じなら、どちらの変数で値を変更しても両方に反映されます。

2 つの変数で別の値を持ちたいのなら、新しくインスタンス化します。新しい参照先になるので、それぞれで別の値を持てます。

値型はそのまま値がコピーされるだけなので単純です。参照型はインスタンスを意識すると理解できると思います。

  • 目次
    • 値型と参照型とは
    • 値型と参照型の違い
    • まとめ