第4講 If文(もしもボックス)
第8話 整数の性質を証明するマクロ
(※本ページは
初心者のための excel 2016 マクロ vba 入門講義 基礎から応用まで 第1部の第4講第8話
を再利用してます。)
を実現するプログラム例
Private Sub CommandButton1_Click()
Rows("3:2000").Select
Selection.ClearContents
Cells(1, 1).Select
Dim i As Long, w As Long
w = Int(10000 * Rnd) + 2
For i = 0 To 100000
Cells(3 + Int(i / 10), 2 + ((2 * i) Mod 20)) = w
If w > 1 Then Cells(3 + Int(i / 10), 3 + ((2 * i) Mod 20)) = "→"
If w = 1 Then Exit For
If w Mod 2 = 0 Then w = Int(w / 2) Else w = 3 * w + 1
Next
End Sub
Private Sub CommandButton2_Click()
Rows("3:2000").Select
Selection.ClearContents
Cells(1, 1).Select
End Sub
参考ダウンロード添付ファイル
さて、前話のヒントがあっても難解なプログラムだと思いますので、
解説しましょう。
Rows("3:2000").Select
Selection.ClearContents
Cells(1, 1).Select
は消去のプログラムと同じになっています。
前の画面を消さないと、
前の使用画面の方が大きいときに、
前のものが残ってしまいますから、
一端クリアしているわけです。
クリアというのは、内容をDelete=消すということです。
これからは、消去の画面をいじらなくても済むように
Rows("3:2000").Select
行数を多めに取ってあります。
これは、3行目から2000行まで選択するという意味です。
Selection.ClearContents
によって3行目から2000行目までがクリアされます。
Dim i As Long, w As Long
としてあるのは、3倍して1を加えると、
Integerの範囲を超えてしまう場合があるからです。
w = Int(10000 * Rnd) + 2
はwを2以上の整数にするためのものです。
1では面白くも何ともないですよね。
最初w = 7609であると仮定して、動きを追ってみましょう。
動きを追うことをトレースといいます。
他のサイトや本などでもよく使われますし、
本講義でもこれからしばしば使いますから、是非覚えて下さい。
i = 0のとき、
Cells(3 + Int(i / 10), 2 + ((2 * i) Mod 20)) = w
は
Cells(3 + Int(0 / 10), 2 + ((2 * 0) Mod 20)) = w
から
Cells(3 , 2) = w
ですから、
Cells(3 , 2) = 7609
となります。
If w > 1 Then Cells(3 + Int(i / 10), 3 + ((2 * i) Mod 20)) = "→"
はw=7609でからThen以降が実行されす。
Cells(3 + Int(0 / 10), 3 + ((2 * 0) Mod 20)) = "→"
から
Cells(3 , 3 ) = "→"
というわけで最初の7609と→が入ります。
If w = 1 Then Exit For
wは7609ですからこのFor文のThen以降は実行されず、ループが続けられます。
If w Mod 2 = 0 Then w = Int(w / 2) Else w = 3 * w + 1
今回は奇数ですから、wは3倍して1が加えられ22828になります。
i = 1のとき、
Cells(3 + Int(i / 10), 2 + ((2 * i) Mod 20)) = w
は
Cells(3 + Int(1 / 10), 2 + ((2 * 1) Mod 20)) = w
から
Cells(3 , 4) = w
ですから、
Cells(3 , 4) = 22828
となります。
If w > 1 Then Cells(3 + Int(i / 10), 3 + ((2 * i) Mod 20)) = "→"
はw=22828でからThen以降が実行されす。
Cells(3 + Int(1 / 10), 3 + ((2 * 1) Mod 20)) = "→"
から
Cells(3 , 4) = "→"
というわけで22828と→が2番目の位置に適切に入ります。
If w = 1 Then Exit For
wは22828ですからこのFor文のThen以降は実行されず、ループが続けられます。
If w Mod 2 = 0 Then w = Int(w / 2) Else w = 3 * w + 1
今回は偶数ですから、wは2で割られて11414となります。
以下同様です。皆さんご自分でトレースをしてみて上手くいくことを確認されて下さい。
For文とIf文を組み合わせるとまだまだ面白いプログラムが組めますが、
配列や2次元ループ文などを勉強した後の方が、
より面白いプログラムが組めますので、
一応第4講はこれで終了とします。
第5講では、今まで学んだ変数・For文・If文を総動員して、
4次魔方陣と6次魔方陣の作成に挑戦します。
第7話へ 第5講第1話へ