Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
VBAのプロシージャの適切な長さと分割について
投稿日時: 20/10/27 17:50:08
投稿者: Rof

VBAで現在社内用のツールを作っています。
とりあえず動くという点に関しては特に問題ないのですが、根本的な部分で疑問を感じているので質問させてください。
プログラミングの開設サイトや入門サイト等を見ると、よく「長すぎるメソッドは良くない」「分割するべき」といった単語を目にするのですが、
VBAの場合においても、長すぎるプロシージャはできる限り分けた方が良いのでしょうか?
 
例えば、ツールのとあるフォームでは、Initializeでほぼすべての動作が完了します。
行っていることは、
 
・フォームの初期設定、listviewの設定
・csvファイルの読み込み
・読み込んだcsvのデータを加工しつつ配列変数Aへ書き込み
 (読み込むCSVファイルの仕様が2種類あるので2パターン。同じ仕様に加工しつつ配列変数に入れる)
・データベースの読み込み(adodb)
・データベースの内容を加工しつつ配列変数Bへ書き込み
・配列変数Aと配列変数Bを比較、それぞれの要素が同じかどうか全て正誤判定を行う
・正誤判定の結果を順次listviewへ追加
 
といった感じです。
コメント行除き概ね400行程度のコードですが、他のフォーム等へ再利用できるコードもなく、
結果として長い(?)プロシージャになっています。
こういったプロシージャでもできる限り処理ごとに分割すべきなのでしょうか?

回答
投稿日時: 20/10/27 19:24:34
投稿者: mattuwan44

>こういったプロシージャでもできる限り処理ごとに分割すべきなのでしょうか?
 
自分しか使わないなら、自分の好きなようにすればいいでしょう。
ただし、
いずれ誰かにメンテナンスを引き継ぐとか、
エクセルやウィンドウズのバージョンアップに伴いメンテナンスする必要がある場合
(ADODBが使えなくなった、あるいは仕様が変わった、あるいは別のアプローチをしたくなった等の時)、
メンテナンスが楽なように書くのは当然でしょう。
それから、開発中はいいですが、
半年後、1年後、ちょっと直したいなと思ったり変更が出てきたとき、
作った自分と、読んでる自分とは他人と思ってください。
自分で書いて自分で読んで解読できなくて、最初から作り直したことが何度かあります。
 
要点が分かり、作業ごとに他の作業に影響がないように作っておくなら、
分けておいた方がメンテナンスが楽かと思います。
 

Private Sub UserForm_Initialize()
    Dim vResults As Variant
    Dim vCSV As Variant
    Dim vADODB As Variant
    
    'csvファイルの読み込みデータを加工しつつ配列変数Aへ書き込み
    vCSV = GetCSV("ファイル名")
    'データベースの読み込み(adodb)内容を加工しつつ配列変数Bへ書き込み
    vADODB = GetADODB("ファイル名?")
    '配列変数Aと配列変数Bを比較、それぞれの要素が同じかどうか全て正誤判定を行う
    vResults = chkData(vCSV, vADODB)
    'フォームの初期設定、listviewの設定
    SetFrom vResults
End Sub

 
僕なら、最初からこんな構えで書きますかね。
書き直すことはほぼないかもですが、
CSVを読み込んで加工するときはほかの事を考えずにそれだけに集中して考えます。
ほかも一緒です。
ADODBは触ったことないのでどのような値を渡すようにしたらいいのかは、怪しいですが^^;;
 
※変数名や関数名は適当です。一般的かどうかはわかりません。

回答
投稿日時: 20/10/27 20:02:27
投稿者: mattuwan44

あぁ、適切な長さの点を言及してませんでしたね。
 
1)再利用できる部分は分ける
2)機能別に分ける。
3)プロシージャの行数が多くなったら分ける。
4)変数がたくさんになりすぎたら分ける。
 
こんなことしてたら、だいたい1つのプロシージャが30行〜50行くらい以内で収まりませんかね。
 

投稿日時: 20/10/27 20:30:58
投稿者: Rof

回答ありがとうございます。
再利用できるかどうかだけでなく、処理ごとに分けて考えた方が確かに変数の管理などやり易そうですね。
if節の中に百行以上〜とかいうのもザラに今まで書いてたので、簡略化を考えていきたいと思います。
 
ちなみに30〜50行という目安は、空白行やコメント行を抜いての話ということでよろしいでしょうか?
仰る通りこのツール、足掛け5年以上開発や機能拡張を途切れ途切れに続けているせいかしょっちゅう中身を忘れるため、
普段コーディングの際、後で忘れないようにと思い毎行のようにコメント行を挟んでいるのですが、
そのせいもあってどうしても見た目の行数そのものはかなり伸びてしまいますので……

回答
投稿日時: 20/10/27 21:10:20
投稿者: mattuwan44

 >毎行のようにコメント行を挟んでいるのですが、
 
初心者の内は、毎行のようにコメントを入れておいてもいいかもしれませんが、
分かり切ったことを書いておくのも、
コードの流れを読むのに邪魔になりませんか?
まぁ、5年の間、メンテナンスに支障がなければ特に問題ないと思いますが。
1つのプロシージャでも、
機能別に空白行等で区切ってもいいとは思います。
あと、コメントは行間に入れなくても、
行の後ろでもいいので、読みやすく工夫してみてください。
ただ、最初に大まかな作業の流れを説明されますので、
それくらいは、プロシージャが分けられるかなと思います。
 
>ちなみに30〜50行という目安は、空白行やコメント行を抜いての話ということでよろしいでしょうか?
この辺のことはコメントも含めて個人の感覚なので結果の話です。
分けたくないなとか、ここは1つだろってとこが譲れないならそれはそれで。
 
>簡略化を考えていきたいと思います。
http://home.att.ne.jp/zeta/gen/excel/c03p06.htm
↑この辺は読まれたことあるでしょうか?
参考になれば。
 
とりあえず、個人の経験を話しているだけで、
別の人はまた別な考えがあると思います。
一人の意見で、これが正しいとか、これが標準だとか安易に判断しない方がよいです。
ほかの質問の回答等、たくさんのコードを読んで、取捨選択をしてください。
掲示板はここだけじゃないので、巡回されてみるとよいかと思います。
回答している方々も複数の掲示板をみて、情報収集されているようです。
 

投稿日時: 20/10/27 23:41:25
投稿者: Rof

アドバイスありがとうございます。
色々とまた調べてみようと思います。