第6講 If文(分岐)を理解しよう
第20話 4次元ループまとめ
コード主要部分再掲
Dim a3a As Byte, a3s As Byte 'a3aはaを3で割った余り。a3sはaを3で割った余り。aはiを9で割った余り。
Dim s3a As Byte, s3s As Byte 's3aはsを3で割った余り。s3sはsを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 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
0 | 1 | 2 | |
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 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に戻ります。
aとsは相似形です。
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列すべてについて行います。
以上がヒントです。
初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba マクロ 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門
数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ