• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルのVBAでの7×7の魔方陣とは……)

エクセルのVBAでの7×7の魔方陣とは

このQ&Aのポイント
  • 講義の宿題で7×7の魔方陣をVBAで解く方法を教えてください。
  • 自分のスキルでは解けないため、詳しい手順が知りたいです。
  • 数値の書き出し順番や枠をはみ出した場合の処理についても教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • KG_
  • ベストアンサー率62% (34/54)
回答No.1

整数の2次元配列を魔方陣に見立ててやってみました。 ただ、ご提示の条件では書ききれなかったのと勝手に判断した部分がありますので、ご参考程度にしていただければと思います。 こちらで勝手に判断した、勝手に解釈した点は以下の通りです。 ・「斜め上に移動」は「右斜め上に移動」と解釈 ・「下にはみ出した(行)の場合 1行目に」 基本的に右に進んでるだけですので、左にはみ出した場合は想定してません。 以下、サンプルです。出力方法は指定がなかったので最終的に配列の1,1から7,7まで取り出して頂ければと思います。   Dim MAHOUJIN(1 To 7, 1 To 7) As Integer   Dim i As Integer   Dim x As Integer   Dim y As Integer      x = 1   y = 4      MAHOUJIN(x, y) = 1      For i = 2 To 49     If i Mod 7 = 1 Then       y = y + 1     Else       x = x + 1       y = y - 1     End If     If x > 7 Then       x = 1     End If     If y > 7 Then       y = 1     End If     If y < 1 Then       y = 7     End If     MAHOUJIN(x, y) = i   Next

ACETON
質問者

お礼

ありがとうございます!! この意見を参考にして解いてみたいと思います!!

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

http://www.ne.jp/asahi/suzuki/hp/houjin51.htm に載っている5の場合を参考に 奇方陣の作り方 右上に進む、が基本で 下記4つのIF文がルールのようだ。 ーー コード 標準モジュールに Sub test01() n = 7 x = 1: y = Int((n + 1) / 2) For i = 1 To n * n Cells(x, y) = i MsgBox i x = x - 1: y = y + 1 If x < 1 And y > n Then x = x + 2: y = y - 1 End If If x < 1 Then x = x + n If y > n Then y = y - n If Cells(x, y) <> "" Then x = x + 2: y = y - 1 End If Next i End Sub ーーーーー 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 5,7で確認済み。 ーー この質問のコーナーの規約では、宿題の問題は質問に出してならないはず。

  • end-u
  • ベストアンサー率79% (496/625)
回答No.4

『宿題』は自分で取り組まないと意味がないのではないですか? 今回のケースはきっと結果の表があって、 結果から法則を見つけて、その解法のためにどんなコーディングをすれば良いか、 というスキルを身に付けようとするものではないでしょうか。 役割を考えて変数を使う事、 Mod関数について知る事、 数値を入れるアドレスをどうやって導き出すか考える事、などがポイントになりそう。 ...なので、いきなりコードを書くのではなくて、 紙の上でいろいろ悩んでみる事が必要じゃないですか? 一例ですが、 Sub try()   Const n As Long = 7   Dim v(1 To n, 1 To n) As Long   Dim w As Long   Dim x As Long   Dim y As Long   Dim i As Long   Dim j As Long   w = 0   For i = 1 To n     For j = 1 To n       x = (j + i * (n - 1) + n \ 2) Mod n + 1       y = (j + i * (n - 2)) Mod n + 1       w = w + 1       v(y, x) = w     Next   Next   Range("A1").Resize(n, n).Value = v End Sub あえて >基本的に、数値の書き出す順番は斜め上に移動 これを無視しました。 何かのヒントになれば幸いです。 #まぁ、数値の増減方向が違うのは考えるのが面倒くさい、というのがホンネだったんですが、 #書いてみて、あと6文字程度追加すればいいだけなのに気付いたり...

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

>講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。 >しかしながら自分のスキルではどうにもなりませんでした。 >自分はIFやDim等までしか習っていません。 少なくとも教えられた範囲で解答できる宿題を出されていると思います。 或いは受けていない講義があるのでは? その場合には受けた人に教わるのも手ですけれど。

  • keirika
  • ベストアンサー率42% (279/658)
回答No.2

Sub Sample() Dim i As Integer Dim x As Integer Dim y As Integer Dim x1 As Integer Dim y1 As Integer x = 4 y = 1 Cells(y, x) = 1 For i = 2 To 49 If i Mod 7 = 1 Then y = y + 1 If y = 8 Then y = 1 End If Cells(y, x) = i Else x1 = x + 1 y1 = y - 1 If x1 = 8 Then x1 = 1 End If If y1 = 0 Then y1 = 7 End If If Cells(y1, x1) = "" Then Cells(y1, x1) = i y = y1 x = x1 Else x1 = x - 1 If x1 = 0 Then x1 = 7 End If Cells(y1, x1) = i x = x1 y = y1 End If End If Next i End Sub

ACETON
質問者

お礼

大変参考になりました!! これを基に考えてみたいと思います!!

関連するQ&A