オブジェクトを入れる変数


変数は、格納する値によって、型を指定します。たとえば、整数を入れるならLong型、文字列を入れるならString型・・・のように。

Sub Sample47()
    Dim N As Long, buf As String
    N = 3
    buf = "tanaka"
End Sub

ほかにも、変数にはオブジェクトを格納できる型というのがあります。たとえば、セルはRangeオブジェクトで表されます。このRangeオブジェクトを格納する変数は、次のようにします。

Sub Sample48()
    Dim R As Range
    Set R = Range("A1")
    R.Font.ColorIndex = 3
End Sub

もちろん、ワークシートを格納できるWorksheet型とか、オートシェイプを格納できるShape型なども使えます。また、すべてのオブジェクトを格納できるObject型というのもあります。

また、このように、オブジェクト変数にオブジェクトを格納するときは、Setを付けなければなりません。Setに関しては、下記のページを参照してください。

Setを使うケース

文字列や整数を格納する変数(ここでは、便宜上そうした変数を"一般的な変数"と呼びます)と、オブジェクトを格納するオブジェクト変数では、何が違うのでしょうか。

たとえば、文字列を格納する変数として、次のようにString型の変数を宣言したとします。

Sub Sample49()
    Dim buf As String
    buf = "tanaka"    ''変数には文字列だけが格納される
End Sub

このとき、変数bufには"tanaka"という文字列だけが格納されます。当たり前ですね。文字列である"tanaka"には、プロパティやメソッドがありませんから、それ以外の情報や属性は入りようがありません。これは、数値を格納する変数でも同じです。次のようにLong型の変数に数値を格納したとき、変数には123という数値だけが格納されます。

Sub Sample50()
    Dim buf As Long
    buf = 123    ''変数には数値だけが格納される
End Sub

オブジェクトを格納するオブジェクト変数は、単に文字列や数値を格納するのとは違い、格納するオブジェクトそのものとして扱えるようになります。たとえば、次のようにワークシート(Worksheetオブジェクト)を格納する変数wsに、Sheet1を格納した場合を考えてみましょう。

Sub Sample51()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")    ''変数にはSheet1というWorksheetオブジェクトが格納される
End Sub

変数wsは、Sheet1というWorksheetオブジェクトそのものですから、次のように、変数wsを介して、Sheet1をオブジェクトとして操作できます。

Sub Sample52()
    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")
    ws.Activate         ''Sheet1をアクティブにする
    ws.Name = "Test"    ''Sheet1の名前を変更する
End Sub

もちろんこれは、次のように書くのと同じことです。

Sub Sample53()
    Worksheets("Sheet1").Activate         ''Sheet1をアクティブにする
    Worksheets("Sheet1").Name = "Test"    ''Sheet1の名前を変更する
End Sub

このようなオブジェクト変数は、次のようなケースで便利です。たとえば、Worksheets.Addは、新しいワークシートを挿入しますが、このときAddメソッドは、挿入したワークシート(Worksheetオブジェクト)を返します。そこで、Addメソッドが返す「挿入したワークシート」を、次のようにオブジェクト変数に格納します。

Sub Sample54()
    Dim ws As Worksheet
    Set ws = Worksheets.Add
End Sub

新しく挿入するワークシートは、実行環境によって名前が異なります。必ずSheet4になるとは限りません。挿入した後、その挿入したワークシートを操作するとき、名前がわからないと特定できませんね。そこで、挿入したワークシートをオブジェクト変数に格納しておいて、その後はオブジェクト変数で特定してやります。こうすることで、挿入した新しいワークシートの名前が何であっても、問題なく操作できます。

次のコードは、新しいワークシートを挿入し、その他のワークシートのセルA1だけを、挿入したワークシートにコピーします。

Sub Sample55()
    Dim ws As Worksheet, i As Long, cnt As Long
    Set ws = Worksheets.Add
    For i = 1 To Worksheets.Count
        If Worksheets(i).Name <> ws.Name Then
            cnt = cnt + 1
            ws.Cells(cnt, 1) = Worksheets(i).Name
            Worksheets(i).Range("A1").Copy ws.Cells(cnt, 2)
        End If
    Next i
End Sub

オブジェクト変数のような変数を"参照型変数"と呼びます。対して、文字列や数値を格納する一般的な変数は"値型変数"です。難しい理屈はともかく、オブジェクト変数を使えるようになると、マクロの自由度が広がりますので、ぜひチャレンジしてください。