第6講 If文(分岐)を理解しよう

第20話 4次元ループまとめ


コード主要部分再掲
  Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3saを3で割った余り。aはiを9で割った余り。
  Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3ssを3で割った余り。sはiを9で割った余り。
  v = 1
  For
i = 0 To 80
    
a = i Mod 9     'aは内側の正方形の番号 ただし、0から番号が割り振られています。
    
s = Int(i / 9)     'sはブロックの番号 ただし、0から番号が割り振られています。
    
a3a = a Mod 3    'a3aは内側の正方形の横を制御する変数
    a3s = Int(a / 3)   'a3s は内側の正方形の縦を制御する変数
    s3a = s Mod 3    's3aはブロックの横を制御する変数
    s3s = Int(s / 3)   's3sはブロックの縦を制御する変数
    v = v * CLng(Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a))
    If a = 8 Then
      Cells(17 + s3s, 5 + 6 * s3a) = "第"
      Cells(17 + s3s, 6 + 6 * s3a) = s + 1
      Cells(17 + s3s, 7 + 6 * s3a) = "ブロック"
      If v = x Then Cells(17 + s3s, 9 + 6 * s3a) = "○" Else Cells(17 + s3s, 9 + 6 * s3a) = "×"
      v = 1
    End If
  Next
もう一度a s a3s a3a a3s s3a s3sの働きを確認しましょう。

   0
0 0 1 2
1 3 4 5
2 6 7 8


  0
0 1 2
3 4 5
6 7 8

sは上の表のブロック番号ですし、
aはブロック内のセル番号です。
iが0から8までまでsは0のままです。
つまりこの間aはiと同じで0から8まで動いていきます。
iが9になったときにはじめてsは1になります。
つまり、sは9つ単位で動きません。
その間セルはブロック単位で動きます。
そして、sが動くときにはじめてブロックをまたぎます。
Cells(7 + 3 * s3s + a3s, 9 + 3 * s3a + a3a)
3 *
がミソです。3つ飛ばしの役割を持っています。
sの動きも、aの動くと同じく3つ毎に改行しx座標は0に戻ります。
asは相似形です。
sの中にaが入れ子式に入っています。



そして、s3aはブロックのx座標(横座標)ですし、s3sはy座標(ただし上下は逆 縦座標)です。
a3aはそのブロック内のx座標(横座標)ですし、a3sはy座標(ただし上下は逆 縦座標)です。
a3s a3a s3s s3aのaとsは前のものと後ろのものでは役割が違います。
前のa s
はそれぞれブロック内セル番号とブロック番号です。
後ろの
a sそれぞれ横と縦という意味です。
結局a3s a3a a3s s3a s3sは次のように読めば良いのです。
a3aはブロック内セル横座標
a3sはブロック内セル縦座標
s3aはブロック横座標
s3sはブロック縦座標


なかなか1回の説明では、理解するのが難しいと思います。
第16話からこの話までを繰り返し読んで頂ければ幸いです。
全然意味が分からなかったことも、何回か目には氷解するはずです。
どうぞ忍耐強くお願いします。


さて、最後の課題をやって長くなりすぎた第6講を終了させることにしましょう。
最後の課題はLong型の変数をプログラムから排除することです。
すなわち、
できの悪い
  x = CLng(1) * CLng(2) * CLng(3) * CLng(4) * CLng(5) * CLng(6) * CLng(7) * CLng(8) * CLng(9) '毎回計算させないようにするため
  For i = 0 To 8
    v = v * CLng(Cells(7 + i, 9))
  Next
  If v = x Then Cells(16, 9) = "○" Else Cells(16, 9) = "×" '毎回計算させないようにするための変更
を書き換えることです。

そのヒントを説明ししましょう。
Cells(*,*)を2次元配列と見なして、
添え字付きの変数を9個用意します。
実際上は、エクセルのシートのどこかを間借りします。
つまり、9個のセルを間借りするのです。
例えば、Cells(20,1)からCells(20,9)すなわちA20からI20までのセルです。
そして、最初For文を使い0を代入しておくのです。
次に、

I12ならCells(20,
7)=1、I12ならCells(20,8)=1
などと代入します。
このような代入をI列すべてについて行います。
以上がヒントです。


19話へ 第21話へ


トップ

初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ