変数は、格納する値によって、型を指定します。たとえば、整数を入れるなら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に関しては、下記のページを参照してください。
文字列や整数を格納する変数(ここでは、便宜上そうした変数を"一般的な変数"と呼びます)と、オブジェクトを格納するオブジェクト変数では、何が違うのでしょうか。
たとえば、文字列を格納する変数として、次のように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
オブジェクト変数のような変数を"参照型変数"と呼びます。対して、文字列や数値を格納する一般的な変数は"値型変数"です。難しい理屈はともかく、オブジェクト変数を使えるようになると、マクロの自由度が広がりますので、ぜひチャレンジしてください。