スポンサーリンク
※これは、ある程度Excel VBAのコーディングを自分でやってる経験があるよって人向けの記事です。
VBAで使う英文字の用語をガンガン使いますので、食傷になりそうならまず、コーディング経験をしてみて下さい。
はじめに
Excel VBAに限らずプログラムでは、何かのチェックを通してフラグを立てたりして、そのチェックがOKでない場合は処理を中断する(OKの場合に初めて、それ以降の処理を実効する)、というのは殆ど必ず行うことだ。
そういう場合のコードの書き方として、私は次のようなやり方をよく使っている。
プログラムやる人から見れば、なにも特別なこともしてないと思いますけど、参考になるよって方が一人でもいれば幸いです。
例として、<testExe>というメインのマクロを実行するとする。
それを実行するか中断するか決めるチェックのプロセスは、<fncCheck>とかいうFunctionに別記する。
そんで、次のようにコーディングする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub testExe 'チェック用FunctionでフラグFalseなら処理中断 If Not fncCheck Then Exit Sub '***********以下、チェック用FunctionでフラグTrueの場合の処理を書いていく。 (実際の処理部分) End Sub Function fncCheck As Boolean '***********たとえば次のような、処理前の確認プロセスを色々と書いていく。*********** '***********処理フラグFalseならExit Functionで終了する*********** If MsgBox("処理実行する?",vbQuestion + vbOKCancel, "確認") = vbCancel Then Exit Function '***********全てのチェックが通って処理実行フラグがTrueになったとき1回だけ、それを明記する。*********** fncCheck = True End Function |
解説①SubとFunction
他愛のないことですが、解説をちょっくら書いていきます。
まず私は、Subで囲まれる1つ1つの塊(プロシージャというけど)が長くなるのが嫌いで、ある程度の長さになったら分割する頻度がたぶん、人並み以上かと思う。
そんで多くの人が処理を分割するとき、Functionって多分あまり使わず、Subの方がずっと多く使われてると思う。
SubとFunctionの違いといったら、Subが処理そのものを書くのに対してFunctionは答えを返したい時に使うと言われる。
んなこと言われても結局、実際にやってみると使い分け方が分からんって人も多いだろう。
実際、無理にFunctionを使わなくてもSubで大抵はなんとかなる。
答えを返すと言ったって、Subの中に変数を入れて受け渡しすればいいだけだしね。
んで私は、上記のような処理実行フラグ立てで結構、Functionを使う。
まず<fncCheck>というFunctionを、戻り値Booleanで記述する。
Boolean型って、デフォルト値がFalseで、明示的にセットしない限りTrueにはならない。
だから、処理実行フラグが立つ一番最後に1回だけTrueを指定してやれば良い。
解説②ソースコードの書き方・省き方
そして実行プロセスの方である<Sub testExe>の方だけど、生真面目に書くと
1 2 3 4 5 |
If fncCheck = False Then Exit Sub Else (実際の処理部分) End If |
って感じになるのだろう。
しかし、こういう書き方の改善ポイントとして、次のようなことが挙げられる。
True・Falseについて
1行目:「 = False」という書き方はカッコ悪い。
これを極力省略して「Not」を有効活用した書き方が「Not fncCheck」って書き方。
逆に「If fncCheck = True Then」という書き方についてなら、「If fncCheck Then」で良い。
「=True」「=False」は、書かないようにしよう。
If~ThenとExit Sub
「If fncCheck = False Then」の後は、もう処理を中断するExit Sub以外にやることは決して無いので、改行をせず直でExit Subを入れる。
そして、Exit Subを入れるのは、そこで完全に一区切りを入れるためだ。
その一区切りが入っている以上、If~Exit Sub文の後にElseは入れず、直接に実際の処理部分を書いていく。
したがって、単に
1 |
If Not fncCheck Then Exit Sub |
で良い。
ファイルを開くダイアログの例
たとえば、<ファイルを開くダイアログを出して、それのキャンセルボタンが押されたら処理は実行しない>というのは当然いろいろなところでやる処理だが、これ一つとっても
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim myFiles As Variant With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = True '複数ファイルを開ける .Filters.Clear .Filters.Add "Excelファイル", "*.xls*" .Filters.Add "CSVファイル", "*.csv" .InitialFileName = ThisWorkbook.Path '初期表示するフォルダは、自ブックのフォルダ .Title = "確認" If Not .Show Then Exit Function Set myFiles = .SelectedItems End With |
と結構な長さになる。
だから私は、この「ファイルを開く」ダイアログにしてもFunctionに分けることが多い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
Sub test() Dim bl As Boolean Dim myFiles As Variant bl = fncFileOpen(myFiles)'「ファイルを開く」ダイアログでチェック If Not bl Then Exit Sub End Sub Function fncFileOpen(myFiles As Variant) As Boolean With Application.FileDialog(msoFileDialogOpen) .AllowMultiSelect = True '複数ファイルを開ける .Filters.Clear .Filters.Add "Excelファイル", "*.xls*" .Filters.Add "CSVファイル", "*.csv" .InitialFileName = ThisWorkbook.Path '初期表示するフォルダは、自ブックのフォルダ .Title = "確認" If Not .Show Then Exit Function Set myFiles = .SelectedItems End With End Function |
こんな感じだ。
=Falseなんて書かない
ここで、ファイルを開くダイアログにおいてキャンセルが押された場合の書き方について
If .Show=False Then
ではなく
If Not .Show
とスッキリした書き方にしている。
If Not bl Then Exit Sub
という書き方も同様だ。
やっぱりプログラムは行数を少なく、ダイエットして、エレガントに書いていきたい。
複雑に絡まったスパゲティプログラムになってはならない。要領の良いやり方を体で覚えていこう。
スポンサーリンク