Excelの自動化とVBA入門(2)

 Excel-VBAの予備知識と簡単なプログラム例

1. VBAプログラムの予備知識

1回目の解説で、VBAの準備とマクロ作成・実行は理解できたと思います。あとは、Subプロシージャの中に、必要なマクロを書いて、実行すれば良いのです。書き方が分からなかったら、マクロを記録して自動生成したマクロを解析し、応用しながら書き込めば良いということになります。一方、プログラムになると変数の利用が必須になります。それはマクロの記録には出てきません。また、条件判定や繰り返し等、計算の流れを決める制御文の利用を知る必要もあります。ですから、プログラムを書きあげるには、もう少し知識が必要です。ここでは、VBAの命令の形、変数とセル値のやりとり、セルの選択法、変数の宣言法、変数に使える文字類、マクロ実行ボタンの作り方を紹介し、三角形の面積を求めるプログラムを作ってみます。

▶ VBAの命令の形

生成したマクロを眺めると、「.」で繋がった単語が並んでいることが分かります。この「.」で繋がった命令の形と意味を理解しておく必要があります。VBAの命令の形は、オブジェクト、プロパティ、メソッドで構成されます。オブジェクトは「対象」、プロパティは「属性」、メソッドは「方法」です。「オブジェクト(対象)を指定し、「.」で繋いでプロパティ(属性)やメソッド(方法)を指定する」という形で命令は成り立っています。例えば次のような書き方です。

  1. オブジェクト(.オブジェクト).プロパティ → ActiveSheet.Range(“A1”).Value=”Hello” (意味:「ActiveSheet」の「A1」に「Hello」を代入する。)
  2. オブジェクト(.オブジェクト).メソッド → ActiveSheet.Range(“A1”).Select (意味:ActiveSheetのA1を選択する。)

命令の形が分かれば、後は、「オブジェクト、プロパティ、メソッドの一覧表」を持っておけば、おおよその命令の書き方は分かるということになります。なお、「プロパティがオブジェクトを返す」ので「プロパティがオブジェクト扱い」になったりします。この点から、「プロパティとオブジェクトの関係」がなんだか分からないと思うようになることもよくあります。なお、Excel VBA リファレンス(web)は「Microsoft」の「Learn」のOffice VBAリファレンスの中にあります(難しいので入門レベルには参考にならないと思います)。

▶ オブジェクト

オブジェクトは具体的に、Windows、Workbooks、Workbook、Worksheet、Rangeのようなエクセルで取り扱う対象ということになります。オブジェクトの種類はVBAのメニューバーの表示にある「オブジェクトブラウザ」で見ることができます。「クラス」の欄がほぼオブジェクトです。クラスはオブジェクトを発生するテンプレートと理解して良いと思います。この「オブジェクトブラウザ」でオブジェクトに付随するプロパティ等も知ることができます。この付近は難しくなるので、入門レベルでは、サンプルを見て、どのようなオブジェクトを使って、どのようなメソッドやプロパティを取得するのかを知って、こう書くのだと形から入ったほうが取り組みやすいと思います。

▶ 「変数」と「セル値」のやりとり

プログラムでは変数を使って演算を行います。普通のプログラムでは、変数に直接代入するのですが、Excelの場合、ワークシートのセルを介すことが一般的です。なお、セルの中には、値だけでなく書式等他の情報も入っていますので、「.Value」というプロパティ(属性)を指定する必要があります。(Rangとセットの場合、「.Value」は省略可能)

  1. 変数Aにセルの値を代入する。 A = Range("C3").Value
  2. セルに変数Aの値を入れる。 Range("E3").Value = A

▶ セルの選択(RangeとCells)

変数やセルへの代入の前にセルの選択が必要になります。ここまで、例えばA2セルを選択する場合、「Range(“A2”).Select」としました。もう一つの方法として、ワークシート全体をオブジェクト(対象)として、「ActiveSheet.Cells(2,1).Select」という形式があります。行番号(Row)、列番号(Colum)の順に指定します。Cellsでは範囲の選択はできず「単一セルの選択」だけになります。Cellsの添字i、jは数値なのでプログラムには好都合です。ただ、Cells(i,j)直前のセルの選択範囲(オブジェクト)の指定で、i,jの数値の取り方が変化する点には注意が必要です(3回目に説明)。実は、CellsはオブジェクトではなくRangeオブジェクトを返すプロパティです。ですから、「ActiveSheet.Cells(2,1).Select」と書くと「オブジェクト.オブジェクト.メソッド」の形式と理解するのだと思います。

(5) 例えば、オブジェクトがワークシート全体である場合、次の二つは同じです。

  • 「ActiveSheet.Range(“A2”).Select」
  • 「ActiveSheet.Cells(2,1).Select」 ←(2行目、1列)。

▶ 変数に使える文字等

VBAでは変数に使える文字類は、予約語以外の英数字、漢字、ひらがな、カタカナとアンダスコア (_) を使うことができます。Excel-VBAでは変数に漢字が使えることは特徴ですが、別のプログラムに移植する可能性があるなら使用しないほうがいいと思います。VBAの実行には大文字小文字の区別はありませんが、変数の宣言(Dim)で使った大文字小文字の違いは、コード表示に反映されます。

▶ 変数の宣言

多くのプログラムでは、はじめに変数名とそのデータ型を宣言する必要があります。VBAも同様です。宣言しなくてもプログラムを作ることは可能な時もありますが、宣言はしておくべきでしょう。

  • 主なデータ型は、String(文字列型)、Integer(整数型)、Single(単精度浮動小数点数型)です。他のデータ型もあります。
  • 宣言の構文は、例えば、次の通りです。
    • Dim A  As Integer(整数型の変数Aを宣言する)
    • Dim A(10)  As Integer(整数型の配列変数Aを0から10まで、11個分宣言する)

▶ マクロの「実行ボタン」の作製

マクロを実行するのに、開発リボンを出しマクロを選んで、実行するのは面倒です。そこで、マクロの実行ボタンをワークシート側に設置しておくと便利です。

  • 「開発」→「挿入」→「フォームコントロール」で「ボタン」を選べば、マクロを登録メニュー現れるので、ボタンを作って、マクロを指定すれば、実行ボタンができます。

2. プログラムの作製

基本的な文法に関する知識を得れば、後は作るだけです。作り方の順序は次の通りです。

▶ プログラム作成の手順

  1. 開発リボンから、マクロの記録を使って、適当なマクロ名のSubプロシージャを作る。
  2. 使用する変数の宣言を行う
  3. セルの値を変数に入れる
  4. 計算を行い、結果を変数に格納する
  5. 計算結果の変数の値をセルに入れる(ワークシートに反映する)

▶ 具体的に三角形の面積を求めるプログラムを作る

  1. 開発から「マクロの記録」を押し、マクロ名を入れ(例えば「sample1」)OKし、次に、「記録の停止」を押し、「開発リボン」にある「Visual Basic」を押し、VBAのウインドを表示し、「プロジェクトブラウザ」の「標準モジュール」の中にある「Module1」をダブルクリックすると、設定したマクロ名の「コードウインド」が表示されますので、ここからプログラムの作成に入ります。
  2. 変数宣言、値の入力、計算式、結果の表示の順にプログラムを入力していく。
    • 使用する変数と型:「namae」(文字列型)、「teihen」、「takasa」、「menseki」(単精度浮動小数点数型)
    • 入力に使用するセルは「B3, C3, D3」
    • 計算式は面積の計算式
    • 出力に使用するセルは「F3, G3, H3, I3」
  3. いったんシートを保存、マクロ付きのファイル「.xlsm」として保存する
  4. マクロ実行ボタンを作る
▶ Sample1のプログラムの中身

▶ 実行例:

  • 実行前

  • 実行後(計算ボタンを押すと、マクロが実行され、下記のようになる)

3. まとめ

Excel-VBAの基本的な文法、プログラム例を紹介しました。ここまでで、プログラムを書くことができるようになりました。ここでは、1個の三角形の面積計算例でしたが、次はこれを10個の三角形面積の計算に拡張します。この時には変数を配列変数にして、繰り返し計算で対応します。また、ワークシートも配列的に取り扱うようにして、10個の三角形の計算に対応します。


3回目解説へのリンク:プログラム(変数、配列、セルの指定)