MS Officeで役立つVBAの技:これだけは覚えとけ!

文:Susan Harkins(TechRepublic)
翻訳校正:村上雅章・野崎裕子
2008/02/18 08:00

ユーザー部門に対してVBAの教育を行うことで、彼ら自身でちょっとした業務の自動化を行えるようになり、IT部門とユーザー部門の両者にメリットがもたらされる。本記事ではそういった教育に欠かせないコーディング上のベストプラクティスを解説している。

読みやすいコードを記述する

 コードの可読性を向上させる最も簡単な方法として、ステートメントをインデントするというものがある。インデントには空白文字やタブを用いることができる。VBEのデフォルトでは、タブ1つが空白文字4つ分に相当する。タブ1つに相当する空白文字の個数を変更するには、[ツール]メニューから[オプション]を選択し、[編集]タブをクリックする(このタブはデフォルトで選択されている)。そして、「タブ間隔」に適切な空白文字数を入力する(図Cを参照)。

図C 図C タブを用いてコードをインデントする際の空白文字の数を指定する

 どういった場合にインデントするかはプログラマーに任されているものの、以下のガイドラインを参考することができるだろう。

  • If...EndやSelect Case、With、For...Nextなど、対をなすステートメントをインデントする。
  • BeginTran...CommitTransやAddNew、Updateなど、関連する操作をインデントする。
  • 同一モジュール内にある他の手続きと区別しやすくするため、各手続きの本体(手続きのヘッダからそのEndまでの間)をインデントする。

 以下のcmdPrint手続きでは、コード本体すべてをインデントすることで手続きのヘッダ行とEnd行から区別するとともに、Ifステートメントの実行節をインデントすることでその条件節と区別している。

Private Sub cmdPrint_Click()
   'Open filtered report.
   Dim frm As Form
   Set frm = Forms!frmReconcilePayments
   If intfilterType = acApplyFilter Then
     DoCmd.OpenReport "rptOnFilterTest",
     acViewPreview, , frm.Filter
   Else
     DoCmd.OpenReport "rptOnFiltertest", acViewPreview
   End If
End Sub

 インデントはVBAでは必須ではないものの、インデントを用いることでコードの流れがより判りやすくなり、コードの可読性が向上する。

 可読性に関するもう1つの問題として、連続した数多くの行からなるコードから特定のブロックを見つけ出すというものがある。これには、まとまった処理の切れ目や、やロジックの切れ目に空白行を挿入するとよい。ユーザーには、彼らの記述するコードが書籍のようなものであると教えるようにしよう。言い換えれば、まとまった処理が終わった時、すなわち「思考」の切れ目で空白行を挿入するということである。この例がユーザーにとって理解しにくいというのであれば、各コメントの前に空白行を挿入するように教えるとよい。ユーザーは当初、短い手続きしか記述しないため、このアドバイスを実践する機会はあまりないかもしれない。しかし、コーディングが上達した段階で再度、このアドバイスを彼らに与えておくのがよいだろう。

定数を用いて効率を高める

 VBAを初めて使うユーザーは、定数を使うほどのスキルを備えていない。しかし、彼らのスキルレベルが向上するにつれて、効率というものの重要性に重点を置いて教育する必要が出てくるため、定数についても教えることになるだろう。

 定数には、めったに変わることのない値が格納される。事実、定数の値をプログラム内で変更することはできない--変更するにはプログラマがコードを修正しなければならないのだ。このため、ユーザーに最初に教えておくべき重要な教訓は、安定していない値を定数として宣言、定義してはいけないというものになる。

 上級ユーザーに対しては、安定している値を定数として個別に設定する方法を教えておこう。そうすれば、その値を更新する必要が生じたとしても、ステートメントを1行、すなわち定数の宣言ステートメントだけを修正すればよいようになる。例えば、一般的な割引率をDouble型として以下のように宣言するとしよう。

Const conDiscount As Double = .01

 conDiscountへの参照を式や関数に記述することで、.01という値をハードコーディングすることと同じ効果を生むことができる。ユーザーにとっての最大のメリットは、割引率が変更になった際にステートメントを1行更新するだけですむというものである。

記事の感想やご意見をコメントでお寄せください(CNET_IDログインが必要です)
ログイン パスワードを忘れた方  |  新規登録
  • 今日のトップ記事
  • 昨日
  • 2日前
  • 5日前
  • 6日前
  • 7日前
  • 新着記事
  • 人気記事
  • 特集
  • ブログ