• ベストアンサー

枠の外と内の数字に分けて昇順に並べる方法

あけましておめでとうございます。 本年もよろしくお願いいたします。 このカテゴリーのエクセルの達人の方々に質問です。 どなたか回答して頂ける方がおみえでしたらよろしくお願いします。 (ちゃんとした回答ではなく、文句やクレーム等を混ぜた記載はご遠慮ください。  私の質問が気に入らない場合は無視して頂ければ結構です。) 【質問】  添付図のとおり、5列×5行の中に数字が1~31まであり、  重複数字を含んでおり、それが4つ(A,B,C,D)あります。  その中で、赤枠内と外の数字を分けて下段に  「〇外」、「〇内」として左から右へ昇順に並べます。  上記を実現する方法をVBAで実現する方法が知りたいです。   【注意事項】   ・5列×5行の中にある数字の並びは毎回異なります。   ・赤枠や、塗り潰しの青色や黄色は、説明のために付けているだけです。   ・VBAで実現する方法~、と書きましたが、    同様のことが他の方法でも実現できればそれを教えて下さい。   ・使用するエクセルは2021です。 以上、よろしくお願いします。

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

マクロでの方法です。PCによってはほんのちょっとだけ時間がかかるかもしれません。もっと早いほうがいいという場合はセルに毎回書き込まない方法にすると早くなると思います(最初のその方法でやってたのですがセル直接にした方が分かりやすいと思ってこちらの方法を選択しました) Sub Test() Dim mRng As Range Dim i As Long, j As Long, k As Long Dim mR As Long, mR2 As Long, mC As Long j = 0: k = 0: mC = 0: mR = 0: mR2 = 0 Application.ScreenUpdating = False For i = 1 To 4 mC = 0 For Each mRng In Range("A1:E5").Offset(j, k) If mRng.Row = 1 Or mRng.Row = 5 Or mRng.Row = 7 Or mRng.Row = 11 Or _ mRng.Column = 1 Or mRng.Column = 5 Or mRng.Column = 7 Or mRng.Column = 11 Then Range("B13").Offset(mR, mC).Value = mRng.Value mC = mC + 1 End If Next Range(Cells(13 + mR, 2), Cells(13 + mR, mC + 1)).Sort _ Key1:=Cells(13 + mR, "A"), Order1:=xlAscending, Orientation:=xlSortRows mC = 0 For Each mRng In Range("B2:D4").Offset(j, k) Range("B17").Offset(mR2, mC).Value = mRng.Value mC = mC + 1 Next Range(Cells(17 + mR2, 2), Cells(17 + mR2, mC + 1)).Sort _ Key1:=Cells(17 + mR2, "A"), Order1:=xlAscending, Orientation:=xlSortRows mR = mR + 1 mR2 = mR2 + 1 k = k + 6 If i = 2 Then j = j + 6 k = 0 End If Next Application.ScreenUpdating = True End Sub

その他の回答 (2)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

回答No.2の 以下の部分は If mRng.Row = 1 Or mRng.Row = 5 Or mRng.Row = 7 Or mRng.Row = 11 Or _ mRng.Column = 1 Or mRng.Column = 5 Or mRng.Column = 7 Or mRng.Column = 11 Then Intersectは遅いとどこかで見たような気がしていたので避けていたのですがこれくらいだと差がないみたいなので 以下のようにした方が分かりやすいかもしれません If Intersect(mRng, Range("B2:D4").Offset(j, k)) Is Nothing Then

sazanami0422
質問者

お礼

いつもお世話になっております。 教えていただいVBAで問題なく動作すること確認できました。チューニングのIF分の方を採用して動作してます。また質問みかけたら回答いただけると助かります。

Powered by GRATICA
回答No.1

・A1:E5の5×5の表を、M1~AK1に横1列になるように「値をコピー」する ・S1~U1、X1~Z1、AC1~AE1のセルの値を編集して100を足す ・M8に「=SORT(M1:AK1,1,1,1)」という式を入れる ・M8~AK8を選択して「コピー」する ・そのまま「貼り付け」⇒「値を貼り付け」する ・B13に「=M8」と入力して、B13をコピーして、C13~Q13に貼り付け ・B17に「=AC8-100」と入力して、B17をコピーして、C17~J17に貼り付け ・同様に、G1~K5、A7~E11、G7~K11の5×5も処理する

sazanami0422
質問者

お礼

はじめまして。 VBAを使用しない場合の作成手順ありがとうございます。

Powered by GRATICA

関連するQ&A