家・車以外で、人生で一番奮発した買い物

講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。
しかしながら自分のスキルではどうにもなりませんでした。
自分はIFやDim等までしか習っていません。
課題の注意点としては

1から49までの数値を検出
「1」は1行目の中央(4列目)に書き出す
基本的に、数値の書き出す順番は斜め上に移動
また、書き込む数値を「7」で割った場合の余りが「1」の時
書き込みの場所は下方向に移動する。

枠をはみ出した場合
  上にはみ出した(行)の場合  7行目に
  右にはみ出した(列)の場合  1列目に 
それぞれ移動

以上のような条件でエクセルのVBEを用いて解きたいのですが、どうにも分かりません。自分でも様々なサイトで調べてみたところどれも難しすぎて理解できませんでした。
心優しき方は教えていただけると幸いです。
よろしくお願いします。

A 回答 (5件)

整数の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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/21 19:17

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
ーーーーー
3039481101928
384779182729
466817263537
5141625343645
1315243342444
2123324143312
2231404921120
5,7で確認済み。
ーー
この質問のコーナーの規約では、宿題の問題は質問に出してならないはず。
    • good
    • 0

『宿題』は自分で取り組まないと意味がないのではないですか?


今回のケースはきっと結果の表があって、
結果から法則を見つけて、その解法のためにどんなコーディングをすれば良いか、
というスキルを身に付けようとするものではないでしょうか。

役割を考えて変数を使う事、
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文字程度追加すればいいだけなのに気付いたり...
    • good
    • 1

>講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。


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

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/21 19:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報