まず、簡単なことからやってみよう。マクロ記録の機能を使い、一連の作業を記録し、その記述を見てみよう。一応プログラムと呼べそうなものがあるはずだ。これは個々の動作を指定する方法を知るためには参考になる。ただし、自動記録されたマクロは、同じ動作を再現するだけの物であるから、プログラム全体を作っていく時に役立つ物とはなり難い。
ここでは、基本中の基本となる、セルデータの扱い方を説明していく。
ワークシート上のセルに文字列を入れるという簡単なプログラムを考えてみよう。ワークシート名は「Sheet1」で、セルは第1列第1行つまり左上、文字列は「テスト」とする。この動作をマクロ記録してみると、何故か結構長くなってしまう。
Sheets("Sheet1").Select Range("A1").Select ActiveCell.FormulaR1C1 = "テスト" |
シートを選ぶ、セルを選ぶ、文字列を入力する、という3ステップに別れている。同じ動作を別の記述にしてみよう。若干違うこととしては、文字列入力後も、入力セルがアクティブにならないことだが、これは善し悪し。
Sheets("Sheet1").Range("A1").FormulaR1C1 = "テスト" |
取り敢えず短くはなった。マクロ記録ではこのように、Rangeという方法が採られる。作ろうとするプログラムにもよるが、これが意外と頭を悩ませる。例えば列を変えながらの処理を考えた場合、A1形式だと列を指定するのにアルファベットを使うわけで、Zの次はAAになるような工夫が必要になってしまう。そもそも、Rangeは範囲を指定するものなので、1つのセルを指定するのはむずがゆい気もしてくる。もう一回、別の記述にしてみる。
Sheets("Sheet1").Cells(1, 1).Value = "テスト" |
なかなかすっきりしているし、Rangeの代りに Cellsを使ったおかげで、列や行の指定を数値のままでできそうだ。実際のところ、Cellsというのは、自動的に Rangeとして扱われるものだが、一つずつセルを扱うならこの方法が便利だろう。
応用問題だが、セル間のデータ移動も簡単にできる。プログラムを例示しておく。
Sheets("Sheet1").Range("B1").Value = Sheets("Sheet1").Range("A1").Value |
今度は、セルの内容を消すプログラムを作る。消す範囲はA1からF9とすると、マクロ記録だと
Sheets("Sheet1").Select Range("B4:G14").Select Selection.Clear |
となって、これまた長い。簡単に済ませることが出来る。つまり、
Sheets("Sheet1").Range("B4:G14").Clear |
でおしまい。ちなみに、Clearの代りに ClearContentsとすると数式と文字を、ClearFormatsとすると書式をクリアすることが出来る。
さて、上記2つの例ではどうやって記述を短くしたのだろうか。ピリオド「.」に秘密がある。VBAではピリオドは大きな意味を持っており、対象物(オブジェクト)を示す。ワークブックもワークシートもセルもオブジェクトで、親子関係があるのならばそれをピリオドで示し、最後に処理や属性を記述するものだと考えよう。ワークシートが既に選択されている状態にあるのならば、Sheets("XXXX")という記述は省略できるため、マクロ記録ではシートの選択(.Select)をしておいて、セル(Range)指定ではそれを省略するやり方になっているわけだ。本当のところ、あまり誉められた記述ではないんだな。