MS Excelでマクロを使う

Microsoft Excel でマクロを使うことができると処理の幅が 大きく広がる。しかしながら、マクロはVBA(Visual Basic for Applications)というプログラム言語 で書かれ、ある程度のプログラミングの知識が必要となることから使用を敬 遠してしまうことも多い。実際には Visual Vasic で個別のアプリケーションを作成するような 複雑な知識は必要ではなく、単にセルからの値の取得、セルへの値の入力さえできれば、後は 通常のBASIC言語と同様に扱える場合が多い。そういった用途の極簡単な使い方の昔書いたメモ。


Visual Basic Editorの起動

Excel上でマクロを使うにはまず Visual Basic Editor を立ち上げる必要がある。 Visual Basic Editor は、メニューバーから、“ツール(T)”→“マクロ(M)”→“ Visual Basic Editor(V)” を選択することで起動する。(起動画面)

Visual Basic Editorの起動後まず標準モジュールの追加を行う。メニューバーから、 “挿入(I)”→“標準モジュール(M)”で追加できる。これを行うと、プロジェクエクスプローラー上に “標準モジュール”が追加され、エディターペインにModule1という名前の標準モジュール ウィンドウが現れる。この標準モジュールウィンドウ上にプログラムを書いていく。(モジュールの追加)


プログラムの基本

VBAにおける、制御構造等は、一般的なBASICのものと大きな違いは無い。ここではVisual Basic特有の 概念に重きをおいて、少なくともこれだけ知っていればというものについてのみ述べる。その他の詳細に ついては、付属のヘルプや、専門書を読むと良い。

変数の型

Visal Basicには変数の型という概念がある。変数をどのような値として使うかによって 型を適当に選ぶことによって、色々なメリットがあるが、ここでは詳しく述べない。別に型を 用いなくても十分にプログラミング可能なのだが、型指定が必要なときには、特に意識 しないのであればVariant型を選択しておけば間違いは無い。

Subプロシージャ

Sub プロシージャは、Visual Basic の一連のステートメントの集合 からなるプログラム上の処理単位。Subステートメントで開始され End Sub ステートメントによ り終了する。 Sub プロシージャは、処理を実行するだけで値は返さない。Sub プロシージャは 引数を取得できる。 Sub プロシージャが引数を持たない場合、その Sub ステートメントには空のかっこを指定する必要 がある。

引数を持たないSubプロシージャの例

Sub test()
  …
  (一連の処理)
  …
End Sub

引数を持つSubプロシージャの例

Sub test(a)
  …
    b = a
  (一連の処理)
  …
End Sub

Subプロシージャは他のSubプロシージャを呼び出すことができる。プログラム中の一連の処理 毎にSubプロシージャに分離することにより、プログラムの見通しが良くなり、再利用性も上がる。

Function プロシージャ

Function プロシージャは、いわゆる関数を記述するのに用いる。Sub プロシージャと異なるのは、 戻り値を持つことである。呼び出し側のプロシージャでは、その戻り値を使うことができる。戻り値 は、Functionプロシージャの名前に、戻り値の値を代入することで指定できる。

Functionプロシージャの例

Sub test()
    a = 10
    b = test1(a)
    MsgBox (b)
End Sub

Public Function test1(a)
    test1 = a + 10
End Function

この例では、Subプロシージャ"test" からFunctionプロシージャ "test1" を呼び出し、その戻り値 をMsgBox関数を用いて表示させている。Functionプロシージャ"test1"は、引数aに10を足した数を戻す という単純なものである。

組み込み関数

VBAには、多くの組み込み関数が用意されている。特に、数学関数と文字列処理関数などは使う場 面も多いので、どのようなものがあるか知っているだけでもいいので一通り目を通しておくと良い。


Excelとマクロとのやり取り

上記までの説明で、Subプロシージャによる構造化と、Functionプロシージャを用いた関数の 使用が出きれば、それだけでそれなりのプログラムは書ける。しかしながら、データの入力と 結果の出力が出来なければ困る。ここでは、ExcelVBAを使うことを想定しているので、Excel のセルをデータの入力と結果の出力に使うこととし、その方法の概略を述べる。

セルからの値の取得、セルへの値の入力

セルから値を取得するには、取得するセルを指定し、そのセルの"value"プロパティの値を参照する。 また、セルへ値を入力する場合は、入力したいセルを指定し、そのセルの"value"プロパティに値を代 入する。

セルの指定法:A1形式

A1 形式を用いて、セルとやり取りするには以下のような記述をする。

Sub GetData()
    …
    '値の取得
    hoge = Workbooks("Book1").Sheets("Sheet1").Range("A1").value
    '値の代入
    Workbooks("Book1").Sheets("Sheet1").Range("A2").value = hoge + 10
    …
End Sub 

この例では変数"hoge"に、"Book1"のワークシート"Sheet1"のセル"A1"の値が代入される。 また、"Book1"のワークシート"Sheet1"のセル"A2"に、hoge + 10の値が代入される。

セルの指定法:インデックス番号

インデックス番号を用いて、セルと値をやり取りするには以下のような記述をする。

Sub GetData()
    …
    hoge = Worksheets("Sheet1").Cells(6, 1).Value
    …
End Sub

この例では変数"hoge"に、現在のブックのワークシート"Sheet1"のセル"A1"の値が代入される。 また、インデックス番号には変数を指定できるので、次の使用例のようにループを使ってセル範囲 の各セルへの操作を行うこともできる。

Sub CycleThrough()
    Dim counter As Integer
    For counter = 1 To 20
        Worksheets("Sheet1").Cells(counter, 3).Value = counter
    Next counter
End Sub

用語集

ステートメント
コード内で任意の操作、宣言、および定義を行うための、完結した構文を持つ最小単位。
  • 通常は、1 行に 1 つのステートメントを記述する。
  • ステートメント同士をコロン (:) で区切ると、1 行に複数ステートメントを 記述することができる。
  • 行継続文字であるスペースとアンダスコアの組み合わせ ( _) を使うと、 1 つの論理行を 2 行以上の物理行に分けて記述することができる。
引数
プログラムコードが関数やサブルーチンを呼び出すときに相手に渡す値。呼び出された側では、 この引数に応じて(引数を用いて)処理を行なう。