「3の倍数と3が付く数字のときだけアホになります」のネタといえは、世界のナベアツ(現:桂 三度)さん。
こいつをVBAの繰り返し処理でやってみましょう。
そうそう、今回のネタはAccessだけでなく、ExcelなどのVBAでもできますよ。
懐かしの名ネタをVBAで再現!
繰り返す範囲は、1~40。
1、2…とメッセージボックスを繰り返し40回表示させます。せっかくなんで、途中でやめてしまう処理も含めます。
アホにならないときは、
(* ̄o ̄)/< 1 ! というメッセージボックスを。
アホになるときは、
3 ━━━━(@∀@)/━━━━!! を表示させます。
VBAのコードです
コードはこちら。標準モジュールに記述してください。
Option Compare Database Option Explicit Sub fool_when_Including3_or_MultipleOf3() Dim LPcnt As Long Const srusmsg = "(* ̄o ̄)/< " 'アホでないときの顔文字を格納 Const flmsg = " ━━━━(@∀@)/━━━━!!" 'アホの顔文字を格納 '1から40まで繰り返し For LPcnt = 1 To 40 '変数 LPcnt の数が3の倍数のとき If LPcnt Mod 3 = 0 Then If MsgBox(LPcnt & flmsg, vbOKCancel, "アホ") = vbCancel Then Exit Sub '変数 LPcnt の数が3の倍数でなかったとき '3が含まれるかどうか判定する ElseIf LPcnt Like "*3*" Then '変数 LPcnt の数が 3を含む数であったとき If MsgBox(LPcnt & flmsg, vbOKCancel, "アホ") = vbCancel Then Exit Sub Else 'そうでなかったとき If MsgBox(srusmsg & LPcnt & "!", vbOKCancel, "アホではない") = vbCancel Then Exit Sub End If Next LPcnt MsgBox "オーモロ" & flmsg, vbExclamation, "世界のナベアツに敬意を込めて!" End Sub
実際に動かしてみましょう
では、実行してみます。
「OK」を押せば、カウントアップして次のメッセージボックスを表示させます。
「もうええわ!」となったところで「キャンセル」を押してください。繰り返し処理から抜け出します。
解説です
Dim LPcnt As Long
変数「LPcnt」を宣言します。ちなみにLoop counterの略です。ループしている回数を数えます。
Const srusmsg = "(* ̄o ̄)/< " 'アホでないときの顔文字を格納 Const flmsg = " ━━━━(@∀@)/━━━━!!" 'アホの顔文字を格納
「変数」を宣言する「Dim」に変わり、「Const」が登場しました。これは、「定数」を宣言しています。
変数と定数の違いですが、変数は宣言した後、そのデータ型にあった数字等を「何回も」格納させることができます。「LPcnt」は、処理がループするごとに値を増やすことができます。
対して、定数に格納できるのは、宣言したときの「一度」きり。途中で変更することはできません。
Dim srusmsg As String srusmsg = "(* ̄o ̄)/< " 'アホでないときの顔文字を格納
このように「Dim」を使って変数として記述することもできます。
「Const」の代わりに「Dim」を使うことはできるのですが、きちんと使い分けるようにしておくと、後からコードを読みやすくなるでしょう。
'1から40まで繰り返し For LPcnt = 1 To 40 Next LPcnt
繰り返し処理を行う、For~Next文です。この文は、繰り返す回数があらかじめ決まっている場合に使用します。
変数「LPcnt」の数が、1から40の間で繰り返しを行います。
Next LPcnt
ここまで処理が流れて行ってForの位置へ処理が戻ります。自動的に変数「LPcnt」の数が、1加算されます。
【1つ目の分岐処理】3の倍数であるか
'変数 LPcnt の数が3の倍数のとき If LPcnt Mod 3 = 0 Then
3の倍数であるか、IF文を使って判定します。
「Mod」とは、割り算の余りを求める式(演算子)です。
初回の処理では、変数「LPcnt」には「1」が格納されていますので、
1÷3=0 あまり3
という計算結果になり、IF文の条件を満たしません。次の「ElseIf」に処理が飛びます。
2回ループすると、変数「LPcnt」には「3」が格納されていますので、
3÷3=1 あまり0
という計算結果になり、IF文の条件を満たし、次のメッセージボックスを表示させます。
If MsgBox(LPcnt & flmsg, vbOKCancel, "アホ") = vbCancel Then Exit Sub
IF文とMsgbox関数を組み合わせています。
MsgBox(LPcnt & flmsg, vbOKCancel, "アホ")
メッセージボックスに、LPcntに格納されている数と、アホの顔文字を連結して表示させます。
LPcnt & flmsg → 3 ━━━━(@∀@)/━━━━!!”
【2つ目の条件分岐】3が付く数字であるか
'変数 LPcnt の数が3の倍数でなかったとき '3が含まれるかどうか判定する ElseIf LPcnt Like "*3*" Then
先ほどのIF文の条件である「3の倍数であるか」を満たさなかったときは、次の条件式へ飛んできます。
「ElseIF」とは、最初の条件を満たさなかったとき、また別の条件を提示して「そうであるか」「そうでないか」を判定します。
変数「LPcnt」の格納された数字が「3の倍数」でなかったので、次にその数字が「3が付く数字」であるか判定します。
変数「LPcnt」の数が3の付く数字かどうかは、「Like」を使用しました。「Like」は比較演算子といい、「=」が完全一致を表すのに対し、「*」や「?」と組み合わせて「パターンの一致」を表します。
3の前後に「*」(アスタリスク)を置いています。「*」はワイルドカードといい、「なんでも良い(何も無いを含む)」を表します。
つまり、この式は「3の前後になんでも良いから付いているもの」、を表しています。
「3」、「13」、「12345」、「31」、「33」、「124567893」、「3987654」など3が含まれる数が当てはまります。桁数は問いません。
当てはまる数字のとき、IF文の条件を満たし、次のメッセージボックスを表示させます。
If MsgBox(LPcnt & flmsg, vbOKCancel, "アホ") = vbCancel Then Exit Sub
2つの条件のどちらも満たすことができなかったとき
Else 'そうでなかったとき If MsgBox(srusmsg & LPcnt & "!", vbOKCancel, "アホではない") = vbCancel Then Exit Sub
2つの条件「3の倍数」、「3の付く数」のどちらでもない数字であったとき、次のメッセージボックスを表示させます。
【メッセージボックスの分岐処理】次へ進むか、ここでやめるか
メッセージボックスに「, vbOKCancel」を指定することで、「OK」と「キャンセル」の選択肢を持つメッセージボックスが表示されます。
「= vbCancel」の部分ですが、メッセージボックスで「キャンセル」を選択された場合、という条件を指定しています。
「キャンセル」を押すと、IF文は条件を満たすので、「Exit Sub」が実行されます。つまりこの処理(Subプロシージャ)を終了させています。
いかがでしたでしょうか。
複雑な条件分岐を作るときは、後から読みやすくするように、コメントを入れておくのがおすすめです。
コメントをどうぞ!