Accessを使っている時にVBAコードのif文で、あれ?イベントの発動がおかしいなぁと思ったり、elesが多過ぎてどことどこで挟んでいるのか訳が分からなくなったりしませんか??
selectcaseを使えばいいのかもしれませんが、私はif文が好きなんです(笑)
Accessでifを多様しすぎて、elesとendifがどこのifからきているのかわけがわからなくなってしまうことが多々あるので、今日はそんな時の考え方のお話です。
目次
【Access】if文の中にifを使うことを『ネスト(入れ子)』という
Accessでif文の中にifをまた入れたりすることを『ネスト』や『入れ子』とか呼んだりします。
ネスト(入れ子)とは??
ネストとは、構造化プログラミングにおいてプログラムを構築する手法の一つで、あるルーチンやデータブロックの中に、別のルーチンやデータブロックがはめ込まれることである。入れ子構造とも呼ぶ。ループ文の中のループやルーチン内でにサブルーチンコール、関数呼び出しの引数に関数呼び出しを使うこと、コメントを含む文全体のコメント化など、多くの種類がある。
出典:IT用語辞典-Weblio辞典-
どんな例があるのか実際に私が作ったAccessVBAコードのif文をご紹介します。
Private Sub 実行_Click() Dim iCnt As Integer iCnt = DCount("*", "商品リストQ") - DCount("バーコード", "商品リストQ") 'バーコード部分の空欄確認 If iCnt = 0 Then Dim ZT As String Dim DT As String Dim rc As VbMsgBoxResult rc = MsgBox("『管理者用商品リスト』を作成します。よろしいですか?", vbYesNo + vbQuestion) If rc = vbYes Then DoCmd.OpenReport "商品リストR", acviewnomal Dim RCount As Long RCount = DCount("*", "商品リストQ") '商品リストが空っぽ If RCount = 0 Then MsgBox "データがありません!データを確認してから押してください。", vbCritical Else End If Else MsgBox "処理を中止します", vbCritical End If Else MsgBox "バーコードが空欄なものが " & iCnt & "件 あります。" End If End Sub
if文はとても便利な関数ですが、私のように入り子をして多用しすぎるとどこの部分のifをしめているかわからなくなってしまいます。
その時の考え方として大切なのは『if文のしめは外から挟むようにしめる』ということです。
文章説明が下手なので分かりにくいかもしれませんので、色を付けてみたいと思います。
簡単なイメージだとこんな感じで挟み込んでいます。
【Access】上記if文の意味(解説)
最初の青い部分のIfは商品リストQのバーコードフィールドが空欄かどうかを確認しています。
次の緑の部分は『管理者用商品リスト』を作成していいのか、ダメなのかを聞いています。
最後のピンクの部分は商品リストにデータそのものがあるかないか(0件かどうか)を判断しています。
まとめ
AccessのVBAコードはif文が複数出てきて分かりにくいコードも『サンドイッチ』の考え方でわかりやすく分解することが出来ます。
コードが長すぎて訳が分からなくなった時に立ち止まって『サンドイッチ』で考えてみてください。
最後までお読みいただきありがとうございました。