Excel VBA > Excel上級:マクロ > マクロの記録ではできないこと(変数について)
このエントリーをはてなブックマークに追加

マクロの記録ではできないこと(変数について)

マクロの記録では変数を使った記録をしてくれない

ExcelのVBAに限らずプログラムには「変数」という非常に強力な役割を持つ仕組みがあります。
この変数を使うことでコーディングを効率よく作ることができ、可読性もあがり、プログラム開発者には必須の仕組みです。
しかし残念ながらマクロの記録では「変数」自体が記録されることもなく、この部分は手動で書き直す必要がでてきます。
もっとも簡単なプログラムで処理が済む場合は「変数が必要ない」も考えられますので、状況に応じて対応することが望ましいでしょう。

変数を簡単に説明すると・・

「変数とは・・」から説明すると本題が遠くなってしまうので、簡単に説明するとそれは「データを一時的に保管する場所」のことです。
本題と絡めた点でいうと「データが変わるか、変わらないか」という点が大きな意味を持ちます。
プログラムの中で、データが「可変(それに対して固定)」、「動的(それに対して静的)」、「ダイナミック(それに対してスタティック)」などという場合があります。
状況にもよりますが、これは同義とみて構いませんが、馴染みない方はさっぱりかもしれませんので実際に下記の例を見てみます。
(変数についてはページ下部にもう少し補足説明を入れています)

とあるファイルを開く動作を記録する

下記はDドライブの「test」フォルダにあるExcelファイル(進捗管理_2012年11月.xlsx)を開く動作をマクロの記録したところです。

Sub Macro1()
'
‘ Macro1 Macro
'

'
    ChDir “D:\test”
    Workbooks.Open Filename:=”D:\test\進捗管理_2012年11月.xlsx”

End Sub

いたって簡単なマクロですが、以下の点で使い勝手が良いとは思えません。その理由は次のとおりです。

この場合、先ほどのマクロの記録で作成したマクロを実行しても、新たに追加した「進捗管理_2012年12月.xlsx」は絶対開きません

ここで先ほど説明した「固定、動的」等に合わせていうと、今回の場合は「ファイル名が可変(状況に応じて変わってしまう)」と言えます。
そしてこういう時にこそ変数が必要となってくるわけです。

下記にように「手動で」マクロの内容を変更しました。

Sub Macro1()
'
‘ Macro1 Macro
'

‘変数を定義
    Dim ファイル名 As String

    ファイル名 = Application.InputBox(“開くファイル名を入力してください。”)

    ChDir “D:\test”
    Workbooks.Open Filename:=”D:\test\” & ファイル名

End Sub

下記のようにファイル名を入力できるダイアログを使い、そこで(利用者が)入力した値を一度変数に入れて、その変数(の中に入っているファイル名)を開くようにしています。

このような場面は他にも、「シートが複数あるけど状況に応じてマクロの対象となるシートが変わる場合」など、作業(値)が固定できない場合には変数を使って対応します。
マクロの記録だけでは残念ながらこのような振る舞いができず、作ったマクロを幅広く(汎用的に)使うためには、手直しが必要になります。

補足:変数の考え方

上記でも説明していますが、変数とは簡単に言うと「一時的に保管する場所」のことです。とはいうものの、慣れてくれば納得ですが、そうでないとこれで理解できるのは難しいかもしれません。
身近?な例でいうと電卓の「メモリー(M+、M-等)」機能に相当します。
もう少し崩して説明すると、例えば、下記の計算をする時、

(24 × 32) + (45 × 21)

計算順序
1.24 × 32 の計算を行う
2.45 × 21 の計算を行う
3.「1」と「2」を足す

というのが一般的な方法だと思います。通常この時に「1」の計算結果を何らかの方法で「覚えておく」必要があります。
人によってその方法はマチマチですが、上記の式の隙間や紙のような何かに結果を書いておく(どこかに控えておく)形がよくあるパターンだと思います。
この「紙に書いておく」が変数の使い方に相当します。
説明よりも実際を見た方が早いです。
紙の代わりに「X」と「Y」を使います。

計算順序
1.X = 24 × 32
2.Y = 45 × 21
3.X + Y

のような形になると思います。上記はプログラム的に言えば、「変数Xと変数Yを使ってコーディングした」と言えます。
このように変数はそれほど難しい概念ではないです。「紙に書いておく」というのは、物理的にできることですが、プログラムの中では紙に書いておくことはできないため、(PCのメモリに)「一時的に保管する場所」を用意して、そこに計算結果を入れておき、必要になったらその場所を見に行くようなイメージです。そして、この「場所」というのがポイントです。「値(計算結果)」ではなく、あくまでも結果を入れておく場所なんです(変数の説明でよく「箱」という表現を見かけますが、それと同じ意味です)。
なぜ「場所」かというと、色々(計算結果だけでなく、文字、シート、セルなど様々)な物を置くことができるからです。
ただし、、、だからこそ慣れるまでしんどいのかもしれませんね。

Excelでは「紙に書いておく」ことができる?

これは物理的な意味では無いですが、同等な方法としてExcelのシートに書き込むという方法があります。
変数を使わずに、代わりにシートのセルに値を書き込む方法です。変数は「一時的」に場所を用意しますが、Excelを終了すると場所自体が消滅します。これに対してシートに値を書き込んでおけば、通常のExcelファイルを使うのと同じように、PCを終了してもその値は残っているという特徴がありますが、ここを上手く活用することで変数と同義の使い方ができることもあります。

Excel VBAで使用する変数の役割

経験的にですが、変数の使い方はいくつかあり、Excel VBAの変数では上記で説明した使い方以外にもあるのでいくつか補足しておきます。

(恐らく他のプログラム言語も同様と思われますが)
・コードを見やすくするために変数を使う
・処理を早くするために変数を使う
・ループカウンタ用に変数を使う
などです。特に3番目はループ(繰り返し)処理するときにしか使わず、ループが終了したら変数は使わないこともよくあります。
色々な使われ方があるとういことは、ある種複雑とも言えますが、その一方でとても便利な使い方ができるとも言えますね。
(なお、ちなみにループ処理もマクロの記録では限界がありますので、改めて別途説明します)

カテゴリ:Excel上級:マクロ