dポイントプレゼントキャンペーン実施中!

VBAで一つのファンクションの中に全部コードを書いてしまいます

Access VBAでプログラムを書いています。私がプログラムを書くと1つのファンクションの中に全てのコードを書いてしまいます。

例えば実行ボタンを押すと、Aテーブルからデータを抽出して、それを加工し、Excelへ出力するといった処理があるとします。他の人のプログラムを見ると、各処理毎にprocedureもしくはfunctionで機能を分けて作っています。私の場合は、1つの関数の中に全て書いてしまいます。

各機能ごとにプログラムを作りたいのですが、何かコツみたいなものはありますでしょうか?教えていただければ嬉しいです。

A 回答 (3件)

 コツというほどのものではありませんが。



・コードに名前をつけよ。
 と言っても、「この行からこの行はクマさん!」という風にニックネームをつける訳ではありません。
 VBAではなくってVB6のフォームに関するサンプルプログラムを以下に掲載します。

Public Function CenterForm(ByRef f As Form) As Boolean
 f.Left = (Screen.Width - f.Width) / 2
 f.Top = (Screen.Height - f.Height) / 2
 CenterForm = True
End Function

 これはフォーム(Window)を画面中央に配置するプロシージャーです。さて、このサンプルは(リターンコードの設定を除いて)2行だけのルーチンです。全フォームにこいつを呼び出すコードを記述しなければならないのなら、たった2行なんだから全フォームにこのコードを直接埋め込めば良いジャンという気になるかも知れませんが、このたった2行だけのコードはルーチンとして切り出す必然性があるという事です。
 このコードを書いている時、書いている人(プログラマーの人)は、「フォームの左端の位置に画面の幅からフォームの幅を引いたモノを2で割った値を設定した後、フォームの上端の位置に画面の高さからフォームの高さを引いたモノを2で割った値を設定したい(物理的な処理)」のではなく、「フォームを画面の中央に配置したい(論理的な処理)」のです。なので、この2行だけのルーチンには「CenterForm」という、フォームが中央に来るっぽい名前がつけられました。
 この例のように、コードブロックに対して論理的な名前をつけてみる訓練をすると、だんだんコードブロックの切り出し方が頭に浮かぶようになりますよ。これは、オブジェクト指向でも構造化手法でも変わりなく通用するテクニックです。これは逆を言うと、一言で説明できないブロックは分割する必要はないという事になります。無理やり切り出すと後で「なんでこんなルーチンがあるんだ?」という事になりかねません。あくまで、処理に名前をつける事ができ、そうすればその名前がそのままプロシージャー名になるのでプロシージャー名をつけるのに悩まないって事ですね。これも逆に言うとコードブロックに対してプロシージャー名のつけ方に悩んだらそこは切り出し場所では無いのだと言えます。

・コメント(日本語による説明)だけでプログラムを書いてみる。
 まぁ、これは本当は紙の上にフローチャートを描くなどの作業なんですけれども、ざっくりとしたくくり(最終的に数行~十数行のコードになりそうな単位)で、
Public Function Hoge() As Boolean
 ' DBに接続する
 ' If もしダメなら Then
  ' エラー表示して終了
 ' End If
 ' ○○テーブルから△△の一覧を取得する
 ' If □□を全部足し合わせたもの>100なら Then
  ' 右側に合計を表示して終了
 ' Else
  ' 一覧を表示して収まりきらないものは切り捨てる
 ' End If
End Function

 この例は論理的な説明と物理的な説明が統一されていませんが意図的なものです。ここで、論理的な説明になったものは「説明がざっくりしすぎ」か、そうでなければプロシージャーとして切り出せる可能性があるという事になります。最初の例CenterFormをコメントで説明つけると「画面の幅からフォームの幅を引いて・・・・」などのようになりますが、プロシージャーの中を説明するとそれは大抵物理的な説明になります。
 以上のように論理的な説明になった部分をよそに切り出せないか検討して、切り出した場合はさらにその中でもう少し細かく説明をつけていくと、論理→切り出し、物理→そのままという単位でブレークダウンしていくとまずプログラムの論理的な骨格が出来上がります。後はコメントの下にプログラムをがりがり書いていけばよろしい。それ(そのコメントたち)が仕様書だ。う~んアジャイル。

 と言ったところですが、何か得るものがあれば幸いです。
    • good
    • 0

まずは,なぜ機能で分割するのか?を考えてみてください。


・コードの可読性
・共通部分が分離できる
ことを期待するからであって,
「分割しないといけないから分割する」のではありません。

VBAのレベルでしたら,開発は基本1人で,小規模となるのがほとんどです。
ですので,「一つのファンクションの中に全部コードを書く」のもアリです。


それを踏まえて「各機能ごとにプログラムを作りたい」とのことでしたら,
コードを記述する前に,簡単でいいので機能を書き出してみてください。
仕様書まではいりません。日本語で結構です。
このとき大切なのは,大きい機能をある程度まで小さい機能に分けること。
すると
(A)「共通でつかえそうだ」
(B)「機能によって大きさが違うからそろえていこう」
という点が見つかってきます。

いきなり分割を意識するのでなく,
(A)に注目して,共通部を部品化してはどうですか?

仕様を検討してからコード作成を行うというのが,コツだと思います。
当然開発効率も違ってきます。
    • good
    • 0

「構造化プログラミング」をキーワードに解説サイトや参考書を探してみましょう。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!