
講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。
しかしながら自分のスキルではどうにもなりませんでした。
自分はIFやDim等までしか習っていません。
課題の注意点としては
1から49までの数値を検出
「1」は1行目の中央(4列目)に書き出す
基本的に、数値の書き出す順番は斜め上に移動
また、書き込む数値を「7」で割った場合の余りが「1」の時
書き込みの場所は下方向に移動する。
枠をはみ出した場合
上にはみ出した(行)の場合 7行目に
右にはみ出した(列)の場合 1列目に
それぞれ移動
以上のような条件でエクセルのVBEを用いて解きたいのですが、どうにも分かりません。自分でも様々なサイトで調べてみたところどれも難しすぎて理解できませんでした。
心優しき方は教えていただけると幸いです。
よろしくお願いします。
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
No.5
- 回答日時:
に載っている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で確認済み。
ーー
この質問のコーナーの規約では、宿題の問題は質問に出してならないはず。
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文字程度追加すればいいだけなのに気付いたり...
No.3
- 回答日時:
>講義の宿題で7×7の魔方陣をVBAで解いてこいといわれました。
>しかしながら自分のスキルではどうにもなりませんでした。
>自分はIFやDim等までしか習っていません。
少なくとも教えられた範囲で解答できる宿題を出されていると思います。
或いは受けていない講義があるのでは?
その場合には受けた人に教わるのも手ですけれど。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】並び替えの範囲が、...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Excel VBA 選択範囲の罫線色の...
-
エクセルの改行について
-
改行文字「vbCrLf」とは
-
vbsでのwebフォームへの入力制限?
-
エクセルのVBAコードについて教...
-
Excelマクロで、ピボットテーブ...
-
【ExcelVBA】5万行以上のデー...
-
[Excel VBA]特定の条件で文字を...
-
Excel 範囲指定スクショについ...
-
算術演算子「¥」の意味について
-
Excelのマクロについて教えてく...
-
vbaにてseleniumを使用したedge...
-
VBA ユーザーフォーム ボタンク...
-
Vba セルの4辺について罫線が有...
-
ワードの図形にマクロを登録で...
-
【マクロ】切取りの場合、形式...
-
ExcelVBAでパワポを操作したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++ (byte)(col & 0xFF) の意味
-
C#を勉強していて、指定したフ...
-
ニュートン法
-
エクセル ユーザーフォーム ...
-
テキストのデータ型
-
検索結果の指定列をリストボッ...
-
カラーの16進表記の足し算
-
4変数の非線形方程式のときかた
-
エクセルのVBAでの7×7の魔方陣...
-
VC++2010 大きい桁数をBYTE型配...
-
二点の座標から距離や角度を求...
-
VB.NET)コンボボックスの連動に...
-
テキストファイルの読み込みと...
-
lispに関する質問
-
エクセル・VBAでテキストボック...
-
複数条件のオートフィルタ(VBA)
-
一行飛ばしで合計
-
こうもりの撃退法
-
2次元配列を返す関数について
-
IsNumeric 配列条件
おすすめ情報