第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
が実現するわけです。

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


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

10 11 12
13 14 15 16

を作ってから、

10 11 12
13 14 15 16

対角線の(1と16)と(6と11)をそれぞれ交換して、

16
11
10 12
13 14 15

として、魔方陣に近づけましょう。
尚、本講義では右下がりの対角線

10 11 12
13 14 15 16

を単に対角線、
右上がりの対角線

10 11 12
13 14 15 16

を逆対角線と呼ぶことにします。
この定義を使えば今回の課題は、
自然配列

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話へ


トップへ