第4講 If文(もしもボックス)
第8話 整数の性質を証明するマクロ
(※本ページは
初心者のための excel 2016 マクロ vba 入門講義 基礎から応用まで 第1部の第4講第8話
を再利用してます。)

yu
を実現するプログラム例
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 ) = "→"
yu
というわけで最初の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) = "→"
yu
というわけで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話へ


トップへ