- ベストアンサー
セルの交換について
今このようなデータがあったとします。 A B C D E F G H ------------------ ~ 7| a - - - - 8| b 1 - - - 9| c 2 4 - - 10| d 3 5 6 - セルを交換していって作りたいと考えております。 4×4の場合ですと上の状態だと 手順としては (1)E7とH10を交換 (2)E8とG10を交換 (3)E9とF10を交換 (4)E10とE10を交換 (5)F7とH9を交換 (6)F8とG9を交換 (7)F9とF9を交換 (8)G7とH8を交換 (9)G8とG8を交換 (10)H7とH7を交換 で下のような図になると思います。 A B C D E F G H ------------------ ~ 7| a - - - - 8| b 6 - - - 9| c 5 4 - - 10| d 3 2 1 - 頂いたデータはすべて4×4ではないのでこれをnという一般のときでもできるようにしたいのですが、わからないのでコードを教えていただけますでしょうか?nはC7から最終行でいいかと思います。 とりあえず思いついた方法なのでこの方法以外でも出来るというのであれば教えていただきたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
条件が良く分かってませんが、こんな感じかな? Sub test() Dim tbl Dim x, y, z1, z2 z1 = Range("e65536").End(xlUp).Row If z1 < 6 Then Exit Sub z1 = z1 - 7 z2 = z1 + 1 tbl = Range("e7", Range("e7").Offset(z1, z1)) For x = 0 To z1 For y = 0 To z1 Range("e7").Offset(x, y).Value = tbl(z2 - y, z2 - x) Next y Next x End Sub 以上参考まで
その他の回答 (2)
- うぃず(@Wizard_Zero)
- ベストアンサー率69% (344/495)
置き換え範囲は常に正方形(n×n)になるんですよね? rngOrgとnはとりあえず固定にしておきました。データ量に合わせて自動計算する等はうまく改良してください。 Dim rngOrg As Range Dim n As Integer Set rngOrg = Range("C7") ' 基点 n = 5 ' 行列の辺の数 Dim rngMatrix As Range Dim varSwap As Variant Dim x1 As Integer, y1 As Integer Dim x2 As Integer, y2 As Integer n = n Set rngMatrix = Range(rngOrg, rngOrg.Offset(n - 1, n - 1)) ' 置き換え範囲 For y1 = 1 To n - 1 x2 = n - y1 + 1 For x1 = 1 To x2 y2 = n - x1 + 1 ' セルの値を交換 varSwap = rngMatrix.Cells(y1, x1).Value rngMatrix.Cells(y1, x1).Value = rngMatrix.Cells(y2, x2).Value rngMatrix.Cells(y2, x2).Value = varSwap Next Next
補足
ありがとうございます。 動作はうまくいっているみたいなので、あとは アレンジして調整したいと思います。
- himajin100000
- ベストアンサー率54% (1660/3060)
VBAで書こうと思ったけど、計算が面倒くさかったので、使わずに。 B1 = 1 C1 = 2 D1= 3 E1 = 4 B2 = 5 C2 = 6 ・ ・ ・ ・ E4 = 16 というデータを仮定します。 A1 = 1 A2 = 2 A3 = 3 A4 = 4 という風にオートフィルなどを使いつつ各行に番号を付けます。 A1からE4をコピーして A6からE9に貼り付けます。 A6からE9を選択した状態で "データ"メニュー → "並び替え" 最優先されるキーをAに設定し、降順を選択し、OK A6からE9をコピーし、、 A11からE14までに「形式を指定して貼り付け」→行と列を入れ替える A11からE14までを A16からE19にコピーし、 "データ"メニュー → "並び替え" 最優先されるキーをAに設定し、昇順を選択し、OK すると B16からE19にほしいデータが出来ています
補足
こういうやり方もあるんですね ありがとうございました。
補足
ありがとうございます。 hige様のコードで動作確認を行い、条件通りの動きをしてくれています。