![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
VBAで一つのファンクションの中に全部コードを書いてしまいます
Access VBAでプログラムを書いています。私がプログラムを書くと1つのファンクションの中に全てのコードを書いてしまいます。
例えば実行ボタンを押すと、Aテーブルからデータを抽出して、それを加工し、Excelへ出力するといった処理があるとします。他の人のプログラムを見ると、各処理毎にprocedureもしくはfunctionで機能を分けて作っています。私の場合は、1つの関数の中に全て書いてしまいます。
各機能ごとにプログラムを作りたいのですが、何かコツみたいなものはありますでしょうか?教えていただければ嬉しいです。
No.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をコメントで説明つけると「画面の幅からフォームの幅を引いて・・・・」などのようになりますが、プロシージャーの中を説明するとそれは大抵物理的な説明になります。
以上のように論理的な説明になった部分をよそに切り出せないか検討して、切り出した場合はさらにその中でもう少し細かく説明をつけていくと、論理→切り出し、物理→そのままという単位でブレークダウンしていくとまずプログラムの論理的な骨格が出来上がります。後はコメントの下にプログラムをがりがり書いていけばよろしい。それ(そのコメントたち)が仕様書だ。う~んアジャイル。
と言ったところですが、何か得るものがあれば幸いです。
No.2
- 回答日時:
まずは,なぜ機能で分割するのか?を考えてみてください。
・コードの可読性
・共通部分が分離できる
ことを期待するからであって,
「分割しないといけないから分割する」のではありません。
VBAのレベルでしたら,開発は基本1人で,小規模となるのがほとんどです。
ですので,「一つのファンクションの中に全部コードを書く」のもアリです。
それを踏まえて「各機能ごとにプログラムを作りたい」とのことでしたら,
コードを記述する前に,簡単でいいので機能を書き出してみてください。
仕様書まではいりません。日本語で結構です。
このとき大切なのは,大きい機能をある程度まで小さい機能に分けること。
すると
(A)「共通でつかえそうだ」
(B)「機能によって大きさが違うからそろえていこう」
という点が見つかってきます。
いきなり分割を意識するのでなく,
(A)に注目して,共通部を部品化してはどうですか?
仕様を検討してからコード作成を行うというのが,コツだと思います。
当然開発効率も違ってきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Outlook VBAについて 1 2023/07/10 12:41
- Visual Basic(VBA) Excel ファイルを指定し、指定されたファイル内にシートを統合するVBA 8 2023/07/10 10:09
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) 【VBA】Excelで罫線を引きたい 3 2022/07/14 12:04
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Visual Basic(VBA) VBAのエラーについて 2 2023/08/02 17:46
- その他(コンピューター・テクノロジー) ChatGPT ExcelVBAの精度は3.5と4で違いはある? 1 2023/04/21 21:00
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- Visual Basic(VBA) vbaマクロについて シート1のA列にある商品コードが シート2のB列にある商品コードに該当する場合 2 2023/05/17 13:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1、Rstudioで回帰直線を求める...
-
JavaScriptの定数名が取り消し...
-
フィルターかけた後、重複を除...
-
pythonで同じコード内で複数の...
-
マクロ 連続印刷
-
変数名「cur」について
-
c言語 入力した二つの数字の足...
-
VBA リストボックス(複数条件...
-
UWSCでMOUSEORG関数が上手く処...
-
欠番の抽出について
-
VBAで一つのファンクションの中...
-
ユーザーフォームに2つのコン...
-
おすすめのPHPフレームワークは?
-
(再質問) .NETでエクセル解...
-
演算子(+=)について
-
Exel VBA 別ブックから該当デ...
-
sinカーブの表示のさせ方
-
レイヤー(?)、z-index(?)...
-
VBA 現在のセル番地を記憶、復...
-
特定行の背景色を変えたいのですが
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
1、Rstudioで回帰直線を求める...
-
1日に1人がこなせるプログラム...
-
access2003 クエリSQL文に...
-
エクセルVBAコードで教えて下さ...
-
Exel VBA 別ブックから該当デ...
-
JavaScriptの定数名が取り消し...
-
COBOLの文法
-
access2021 VBA メソッドまたは...
-
PreviewKeyDownイベントが2回...
-
JANコードとPOSコードは同じ?
-
過剰なオブジェクト指向脳から...
-
特定行の背景色を変えたいのですが
-
ACCESSユニオンクエリでORDER B...
-
変数名「cur」について
-
Nullの使い方が不正です。
-
◾️Excel VBA 統合について Cons...
-
欠番の抽出について
-
VBA リストボックス(複数条件...
-
ACCESSで、履歴事項を管理する...
おすすめ情報