• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルマクロでグループごとに昇順していくには?)

エクセルマクロでグループごとに昇順していくには?

このQ&Aのポイント
  • エクセルのマクロを使用して、グループごとに昇順にデータを並び替える方法について教えてください。
  • 例えば、特定の名前で区切られたグループごとに、データを昇順に並び替えたい場合、エクセルマクロを使用することで実現できます。
  • 具体的な手順としては、名前ごとに範囲を指定し、範囲を昇順に並び替えるマクロを作成し、適用することです。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.6

了解しました。 Sub Sample() Dim SRow As Long     SRow = 0     For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1         If InStr(Cells(i, 1), "===") = False Then             If SRow = 0 Then SRow = i         Else             Rows(SRow & ":" & i + 1).Sort Key1:=Range("A1"), _                 Order1:=xlAscending, Header:=xlNo             SRow = 0         End If     Next End Sub 積極的な手段とは言いづらいですが、どうぞ。 こんな感じでお望みの結果を得られたら良いですが。 あ、 > パターンのキーワードは > ===== > ランダム > ===== > データ・・・ > データ・・・ > です。 ということだったので、条件は勝手に 「===(イコールが3つ以上並んでいたら)」 にしてます。 あとは・・単純に「===」に挟まれた範囲をソートしていってますので、 「名前(ランダム)」が一箇所につき2行あったりするここもソートされます。 とりあえず、走らせて見てくださいませ。

devid
質問者

お礼

短いのにスゴイデス。できてます。有難うございます。

その他の回答 (6)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.7

ふつーにエクセルを使っていると「===」とか入力できませんが、まぁそこいらはてきとーに応用してください。 sub macro1()  dim c as range  dim e as range  dim c0 as string  dim flg as boolean  on error resume next ’ if application.countif(range("A:A"), "===*") mod 2 <> 0 then ’  msgbox "INVALID PATTERN" ’  exit sub ’ end if  if left(cells(rows.count, "A").end(xlup), 3) <> "===" then   cells(rows.count, "A").end(xlup).offset(1) = "'==="   flg = true  end if  with range("A:A")   set c = .find(what:="===",lookin:=xlvalues, lookat:=xlpart, searchdirection:=xlprevious, matchbyte:=false)   if c is nothing then exit sub   c0 = application.match("===*",range("A:A"),0)   do    set e = .findprevious(c)    if range(e, c.offset(-1)).count > 2 then     range(e, c).sort key1:=e, order1:=xlascending, header:=xlyes     set c = .findprevious(c)    end if    set c = .findprevious(c)   loop until c.row = c0  end with  if flg then cells(rows.count, "A").end(xlup).clearcontents end sub #データの無いブロックとか手当てしたら余計な命令が増えちゃいました

devid
質問者

補足

有難うございます。すみませんが、実行すると、グループの枠を超えて数字と文字データがそれぞれまとまってしまいます。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.5

こんにちは。お邪魔します。 名前A、名前B、、、等がすべて文字列値で、 並び替えキーとなる値が(文字列でなく)数値で 並び替えキーとなるセルが(数式でなく)定数 であれば、難しいことなどせずに、以下のようにこなすのが 合理的かと思います。 特殊な事情の説明が漏れてなければ大丈夫でしょうけれど、 一発で思い通りの結果になるかどうかは条件次第です。 例えば、並び替えキーがA列にある、という前提で書いていますが、 違っていれば補足してください。 Sub Re8142252()   Dim rA As Range   Dim tnCol As Long ' ' 列数↓を適宜指定   tnCol = ActiveSheet.UsedRange.Columns.Count   On Error GoTo ErrOut_ ' ' 運用に合わせてキー列指定↓   For Each rA In Range("A:A").SpecialCells(xlCellTypeConstants, xlNumbers).Areas     If rA.Count > 1 Then rA.Resize(, tnCol).Sort Key1:=rA(1), Order1:=xlAscending, Header:=False   Next   Exit Sub ErrOut_:   MsgBox "指定列に数値セルが見つかりません" End Sub

devid
質問者

補足

すみません、名前とデータには文字数値混在です。 上記実行すると、短いのにすばらしいです。数値のときは・・・。 データに文字が入ってるときもこうならばOKなんですが。。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.4

No.2です。 前回のコードはA列に「名前」という文字が含まれている行を検索し、 その次の行から空白、もしくは「名前」という文字が含まれている行の1行前を一塊にして 昇順に並び替える方法にしていました。 >氏名は氏名となっているわけではなく、ランダムな値がきます。。 というコトは固有名がランダムにある訳ですかね? もしそうであれば↓のコードに変更してみてください。 (A列の氏名以外は「数値」が入っているとします) Sub 並び替え2() Dim i As Long, j As Long, k As Long j = ActiveSheet.UsedRange.Columns.Count For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If Not IsNumeric(Cells(i, 1)) Then For k = i + 1 To Cells(Rows.Count, 1).End(xlUp).Row If Not IsNumeric(Cells(k, 1)) Or Cells(k, 1) = "" Then Exit For End If Next k End If Range(Cells(i, 1), Cells(k - 1, j)).Sort key1:=Cells(i, 1), order1:=xlAscending, Header:=xlYes i = k Next i End Sub 今度はどうでしょうか?m(_ _)m

devid
質問者

補足

有難うございます。データはA列のみでOKです。 でも、上記を実行すると下記のようになり意図したものと 異なります。。 ====== ソートされたデータ ====== ====== ====== 名前 名前 ・・

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.3

ちょっと確認させてくださいね。 > 氏名は氏名となっているわけではなく、ランダムな値がきます。。 「名前A・名前B」などが個人名「名無権兵衛・何野誰造」などの値ってことですね? コレを「ディスプレイ上で“人の目”で確認」するとき、 名前なのか、データなのか、というのをどのように区別してますか? (どの行までがAさん、この行からBさん、という区別の方法という意味で。) 例えば「“名前”が入っている行はA列にしか入力されていない」とか、 「名前(人)が変わる前には必ず空白行がある」とか、 「並べ替えたいデータ部分は全て数字で構成されている」とか。 そんな「必ず当てはまる条件」が無いと、マクロを使っても難しいですよ。

devid
質問者

補足

パターンのキーワードは ===== ランダム ===== データ・・・ データ・・・ です。 =が2回目で次の=までがデータとしてもいいです。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

こんばんは! 一例です。 「名前○」の次の行は空白ではない!という前提で・・・ シートモジュールです。 Sub 並び替え() Dim i As Long, j As Long, k As Long j = ActiveSheet.UsedRange.Columns.Count For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row If InStr(Cells(i, 1), "名前") > 0 Then For k = i + 1 To Cells(Rows.Count, 1).End(xlUp).Row If InStr(Cells(k, 1), "名前") > 0 Or Cells(k, 1) = "" Then Exit For End If Next k End If Range(Cells(i, 1), Cells(k - 1, j)).Sort key1:=Cells(i, 1), order1:=xlAscending, Header:=xlYes i = k Next i End Sub こんな感じではどうでしょうか?m(_ _)m

devid
質問者

補足

なぜかRange(Cells(i, 1), Cells(k - 1, j)).Sort keyのところで止まります。 氏名は氏名となっているわけではなく、ランダムな値がきます。。

  • Asahi2001
  • ベストアンサー率54% (6/11)
回答No.1

少量データならソート用の番号を追加するのが簡単かと思います。 空いてる列に連番を振ってソートするデータ部分には同じ番号を設定します。 ソートは、第一キーをソート用の番号列を、第二キーはデータ列を指定。 1  ======================   2  名前A 3  ====================== 4  11111              4  22222 4  33333 4  55555                5 6  ====================== 7  名前B 8  ====================== 9  11111 9  22222 9  33333 9  55555

devid
質問者

補足

データ量は多いです。 パターンのキーワードは ===が2回のあとデータ次の===が来るまで で定義したいのですがどのようにすればいいでしょうか?