第5講 4次魔方陣と6次魔方陣の作成
第2話 データ交換プログラム
データの交換

002
を実現するプログラム例
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
としてしまった方もいらっしゃるのではないでしょうか。
ところがこれだと、
001
となってしまいます。
どうしてでしょうか。

  a = 5
  b = 3
の2行によって
01
となっています。
  a = b
は左辺は箱そのもので、02ですが、
右辺は箱の中身で3です。
と言うことは、
  a = b
は
  a = 3
と同じですから、それによって、
03
5はaの中からはじき飛ばされ、
消滅の運命を辿ります。
データは箱の中でしか生きられないからです。
すると、
04
となっており、
  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
によって

05
06
となり、
  a = b
により

07
でaの5は消滅の運命を辿りますが、
08
wには5が保管されています。
そして、
最後
  b = w
によって、

09
から
10
が実現するわけです。

こんな単純なプログラムでも結構難しいでしょう。


ではこれを参考にしてまず、

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

の対角線だけ点対称移動をさせようとなります。

では、皆さん次の添付ファイル開いて、
参考ダウンロード添付ファイル
031
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の空欄になっているところにコードを埋めることによって実行ボタンを押すと、
032
となり、消去ボタンを押すと、
031
に戻るようにしてください。
最初に、
0
をつくりそれを
033
にコピーしてから対角線部分を交換するとよいでしょう。
さらに、ヒントを書いておくと
  For i = 0 To 1



  Next
の3行をいかに埋めるかです。
制御変数のiを使って、いかに
Cells(8 , 2)とCells(11, 5)、
Cells(9 , 2)とCells(10, 5)を表現するかです。




第1話へ 第3話へ


トップへ