第5講 4次魔方陣と6次魔方陣の作成
第2話 データ交換プログラム
データの交換
を実現するプログラム例
Private Sub CommandButton1_Click()
CommandButton2_Click
Dim a As Integer, b As Integer
a = 5
b = 3
Cells(3, 2) = "a="
Cells(3, 3) = a
Cells(4, 2) = "b="
Cells(4, 3) = b
Cells(5, 2) = "aとbのデータを交換"
Dim w As Integer
w = a
a = b
b = w
Cells(6, 2) = "a="
Cells(6, 3) = a
Cells(7, 2) = "b="
Cells(7, 3) = b
End Sub
Private Sub CommandButton2_Click()
Rows("3:2000").Select
Selection.ClearContents
Cells(1, 1).Select
End Sub
参考ダウンロード添付ファイル
解説
最初
Private Sub CommandButton1_Click()
CommandButton2_Click
Dim a As Integer, b As Integer
a = 5
b = 3
Cells(3, 2) = "a="
Cells(3, 3) = a
Cells(4, 2) = "b="
Cells(4, 3) = b
Cells(5, 2) = "aとbのデータを交換"
a = b
b = a
Cells(6, 2) = "a="
Cells(6, 3) = a
Cells(7, 2) = "b="
Cells(7, 3) = b
End Sub
としてしまった方もいらっしゃるのではないでしょうか。
ところがこれだと、
となってしまいます。
どうしてでしょうか。
a = 5
b = 3
の2行によって
となっています。
a = b
は左辺は箱そのもので、ですが、
右辺は箱の中身で3です。
と言うことは、
a = b
は
a = 3
と同じですから、それによって、
5はaの中からはじき飛ばされ、
消滅の運命を辿ります。
データは箱の中でしか生きられないからです。
すると、
となっており、
b = a
はまったく意味のない操作です。
a = b
とした瞬間にaのデータ5は消滅してしまいます。
この5を保管するために、
第3の箱wを用意しなければならないのです。
Dim w As Integer
w = a
a = b
b = w
Cells(6, 2) = "a="
Cells(6, 3) = a
Cells(7, 2) = "b="
Cells(7, 3) = b
ならば、
w = a
によって
となり、
a = b
により
でaの5は消滅の運命を辿りますが、
wには5が保管されています。
そして、
最後
b = w
によって、
から
が実現するわけです。
こんな単純なプログラムでも結構難しいでしょう。
ではこれを参考にしてまず、
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
を作ってから、
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
対角線の(1と16)と(6と11)をそれぞれ交換して、
16 | 2 | 3 | 4 |
5 | 11 | 7 | 8 |
9 | 10 | 6 | 12 |
13 | 14 | 15 | 1 |
として、魔方陣に近づけましょう。
尚、本講義では右下がりの対角線
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
を単に対角線、
右上がりの対角線
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
を逆対角線と呼ぶことにします。
この定義を使えば今回の課題は、
自然配列
1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 |
の対角線だけ点対称移動をさせようとなります。
では、皆さん次の添付ファイル開いて、
参考ダウンロード添付ファイル
Private Sub CommandButton1_Click()
CommandButton2_Click
Dim i As Byte, j As Byte
End Sub
Private Sub CommandButton2_Click()
Rows("3:2000").Select
Selection.ClearContents
Cells(1, 1).Select
End Sub
VBAの空欄になっているところにコードを埋めることによって実行ボタンを押すと、
となり、消去ボタンを押すと、
に戻るようにしてください。
最初に、
をつくりそれを
にコピーしてから対角線部分を交換するとよいでしょう。
さらに、ヒントを書いておくと
For i = 0 To 1
Next
の3行をいかに埋めるかです。
制御変数のiを使って、いかに
Cells(8 , 2)とCells(11, 5)、
Cells(9 , 2)とCells(10, 5)を表現するかです。
第1話へ 第3話へ