【繰り返し処理】「3の倍数と3が付く数字のときだけアホになります」を再現!

スポンサーリンク
この記事は約8分で読めます。

「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
3の倍数のとき
3の倍数のとき

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
3の倍数でないが、3が付く数であるとき
3の倍数でないが、3が付く数であるとき

2つの条件のどちらも満たすことができなかったとき

Else
    'そうでなかったとき
    If MsgBox(srusmsg & LPcnt & "!", vbOKCancel, "アホではない") = vbCancel Then Exit Sub

2つの条件「3の倍数」、「3の付く数」のどちらでもない数字であったとき、次のメッセージボックスを表示させます。

3の倍数でなく、3が付かない数であるとき
3の倍数でなく、3が付かない数であるとき

【メッセージボックスの分岐処理】次へ進むか、ここでやめるか

3の倍数でなく、3が付かない数であるとき
3の倍数でなく、3が付かない数であるとき
3の倍数のとき
3の倍数のとき

メッセージボックスに「, vbOKCancel」を指定することで、「OK」と「キャンセル」の選択肢を持つメッセージボックスが表示されます。

「= vbCancel」の部分ですが、メッセージボックスで「キャンセル」を選択された場合、という条件を指定しています。

「キャンセル」を押すと、IF文は条件を満たすので、「Exit Sub」が実行されます。つまりこの処理(Subプロシージャ)を終了させています。


いかがでしたでしょうか。

複雑な条件分岐を作るときは、後から読みやすくするように、コメントを入れておくのがおすすめです。

コメントをどうぞ!