『エクセルで行と列を同時にランダムに並べ替えたい』 (のり)  英検の問題集データベースを作っています。  現在作っているデータは下のようにデータを並べています。  データはすべて英語です。   問題 選択肢1 選択肢2 選択肢3 選択肢4 正答  列の問題をランダムに並べ替え、さらに選択肢1〜4をランダムに並べ替えたいです。  マクロなどの知識はありません。  また出力の関係で、このデータ順番は変えたくありません。  何か良い方法はありませんか。 ---- 追加です、  選択肢のランダム並べ替えは問題ごとにランダムであってほしいです。  たとえば、問題1の選択肢は1423と並び、問題2の選択肢は2143と並ぶ、といったようにです。  すべての選択肢の並びが同じに並び変わるのは避けたいです。 よろしくお願いいたします。   ---- ↓これと似たようなことなんでしょうか?   [[20080919131054]]『ランダムで並び替える方法』(カルロ)   上記スレッドでは問題の並べ替えは行っていませんが、選択肢の並べ替えは行っています。   (ROUGE) ---- 早速のお返事ありがとうございます。 そうです。選択肢並べ替えはこれと同じです。これに問題並べ替えが加われば目的達成です。 私はマクロがよくわからないので、マクロを使わずに関数だけでなんとかしたいのですが、難しいでしょうか? (のり) ---- 問題並べ替え自体は作業列を使って乱数を発生させてSortすれば完了なので、それほど大変なコードにはならないと思います。 あとは、のりさんのシートにどうやってアジャストさせるかだと思いますよ。 具体的なセルの配置などを掲載していただけませんか?   関数だけの対応については、σ(^-^;)ではお手上げです(_ _;)尸 (ROUGE) ---- すみませんでした。では具体的に。 A B     C    D   E    F G   H    I 1 問題文1 1  選択肢1-1  2  選択肢1-2  3  選択肢1-3 4  選択肢1-4 2 問題文2 1  選択肢2-1  2  選択肢2-2  3  選択肢2-3 4  選択肢2-4 3 問題文3 1  選択肢3-1  2  選択肢3-2  3  選択肢3-3 4  選択肢3-4 このように配置しています。 B,D,F,H列には固定番号入力しています。 1〜3行とC,E,G,I列がランダムに並べ変えたいです。 (のり)   ---- その配置だとちょっと面倒ですね。。。   [A] [B] [C] [D] [E] [F] [1] 1 2 3 4 解答 [2] 問題文1 選択肢1-1 選択肢1-2 選択肢1-3 選択肢1-4 1 [3] 問題文2 選択肢2-1 選択肢2-2 選択肢2-3 選択肢2-4 2 [4] 問題文3 選択肢3-1 選択肢3-2 選択肢3-3 選択肢3-4 3   こんなのではだめなんでしょうか?   あと、解答はどこに入るのでしょうか?   (ROUGE) ---- すみませんでした。解答の位置は最後です。 この配置でもかまいません。 ありがとうございます。 (のり) ---- では、私が提示したレイアウトの前提で、参照先のスレッドを少しだけ改変しました。 (ROUGE) '---- Sub Seaweed() Dim i As Long, x, ans As Integer On Error Resume Next For i = 2 To Range("A" & Rows.Count).End(xlUp).Row x = Range("B" & i).Resize(, 4).SpecialCells(xlCellTypeConstants, 23).Value If Err.Number <> 0 Then Err.Clear Else ans = Range("F" & i).Value Mazemaze x, ans Range("B" & i).Resize(, UBound(x, 2)).Value = x Range("F" & i).Value = ans End If Next On Error GoTo 0 With Range("G2:G" & Range("A" & Rows.Count).End(xlUp).Row) .Formula = "=Rand()" .Value = .Value .Offset(, -6).Resize(, 7).Sort .Cells(1) .ClearContents End With End Sub Private Sub Mazemaze(x, ans As Integer) Dim tbl, i As Integer ReDim tbl(1 To UBound(x, 2), 1 To 3) Randomize For i = 1 To UBound(tbl, 1) tbl(i, 1) = Int(Rnd * 10000) tbl(i, 2) = x(1, i) Next tbl(ans, 3) = True UQS tbl, 1, LBound(tbl, 1), UBound(tbl, 1) For i = 1 To UBound(tbl, 1) x(1, i) = tbl(i, 2) If tbl(i, 3) Then ans = i Next End Sub Private Sub UQS(ByRef tbl, ky As Integer, ByVal tp As Long, ByVal bt As Long) Dim i As Long, j As Long, k As Integer, m As Long, buf i = tp: j = bt: m = (tbl(i, ky) + tbl(j, ky)) \ 2 Do Do While tbl(i, ky) < m i = i + 1 Loop Do While tbl(j, ky) > m j = j - 1 Loop If i >= j Then Exit Do For k = LBound(tbl, 2) To UBound(tbl, 2) buf = tbl(i, k): tbl(i, k) = tbl(j, k): tbl(j, k) = buf Next i = i + 1: j = j - 1 Loop If tp < i - 1 Then UQS tbl, ky, tp, i - 1 If bt > j + 1 Then UQS tbl, ky, j + 1, bt End Sub ---- どうもありがとうございました。すみません…これからどうすればよいのでしょうか。 こういうところまでわかっていないので。申し訳ありませんが、参考URLでも教えていただけませんでしょうか。 ---- その表があるBookをアクティブにした状態で、Alt+F11を押します。 出てきた画面のツールバーで、挿入-->標準モジュールを選択します。 まっしろな画面が出てきますので、そこに上記コードをコピペしてその画面を閉じます。 ご希望の表があるシートをアクティブにして、Alt+F8(もしくはツール-->マクロ-->マクロ)を押して、 Seaweedを選択して実行します。   この処理を行うと、もとに戻せなくなりますので、Bookをコピーしてからお試しください。 (ROUGE) ---- どうもありがとうございました。実際にやってみました。 動いたのですが、実行したあと、このようになりました。 選択肢3−4と1−4と解答が消えてしまします。何がいけないのでしょうか。   [1] 1 2 3 4 解答 [3] 問題文2 選択肢2-1 選択肢2-2 選択肢2-3 選択肢2-4 [4] 問題文3 選択肢3-1 選択肢3-2 選択肢3-3 0 [2] 問題文1 選択肢1-1 選択肢1-2 選択肢1-3 0 またこのまま行を増やしても使えますか? ---- どうもありがとうございました。実際にやってみました。 すみません、表示がおかしいので、もう一度投稿します。 動いたのですが、実行したあと、このようになりました。 選択肢3−4と1−4と解答が消えてしまします。何がいけないのでしょうか。    [1]        1       2     3       4        解答 [3] 問題文2 選択肢2-1 選択肢2-2 選択肢2-3 選択肢2-4 [4] 問題文3 選択肢3-1 選択肢3-2 選択肢3-3 0 [2] 問題文1 選択肢1-1 選択肢1-2 選択肢1-3 0 またこのまま行を増やしても使えますか? ---- ん?微妙に前提としたレイアウトと違うような。。。 問題文はA列に、選択肢はB:E列に、回答はF列に、という前提ですよ。 あ、あと、1行目は見出し行で、実際のデータは2行目からの前提もあります。 (ROUGE) ---- できました〜〜〜。 ありがとうございました! とっても困っていたので本当にうれしいです。どうもありがとうございました。