- ベストアンサー
エクセルマクロでグループごとに昇順していくには?
- エクセルのマクロを使用して、グループごとに昇順にデータを並び替える方法について教えてください。
- 例えば、特定の名前で区切られたグループごとに、データを昇順に並び替えたい場合、エクセルマクロを使用することで実現できます。
- 具体的な手順としては、名前ごとに範囲を指定し、範囲を昇順に並び替えるマクロを作成し、適用することです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
了解しました。 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行あったりするここもソートされます。 とりあえず、走らせて見てくださいませ。
その他の回答 (6)
- keithin
- ベストアンサー率66% (5278/7941)
ふつーにエクセルを使っていると「===」とか入力できませんが、まぁそこいらはてきとーに応用してください。 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 #データの無いブロックとか手当てしたら余計な命令が増えちゃいました
補足
有難うございます。すみませんが、実行すると、グループの枠を超えて数字と文字データがそれぞれまとまってしまいます。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。お邪魔します。 名前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
補足
すみません、名前とデータには文字数値混在です。 上記実行すると、短いのにすばらしいです。数値のときは・・・。 データに文字が入ってるときもこうならばOKなんですが。。
- tom04
- ベストアンサー率49% (2537/5117)
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
補足
有難うございます。データはA列のみでOKです。 でも、上記を実行すると下記のようになり意図したものと 異なります。。 ====== ソートされたデータ ====== ====== ====== 名前 名前 ・・
- tsubuyuki
- ベストアンサー率45% (699/1545)
ちょっと確認させてくださいね。 > 氏名は氏名となっているわけではなく、ランダムな値がきます。。 「名前A・名前B」などが個人名「名無権兵衛・何野誰造」などの値ってことですね? コレを「ディスプレイ上で“人の目”で確認」するとき、 名前なのか、データなのか、というのをどのように区別してますか? (どの行までがAさん、この行からBさん、という区別の方法という意味で。) 例えば「“名前”が入っている行はA列にしか入力されていない」とか、 「名前(人)が変わる前には必ず空白行がある」とか、 「並べ替えたいデータ部分は全て数字で構成されている」とか。 そんな「必ず当てはまる条件」が無いと、マクロを使っても難しいですよ。
補足
パターンのキーワードは ===== ランダム ===== データ・・・ データ・・・ です。 =が2回目で次の=までがデータとしてもいいです。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 一例です。 「名前○」の次の行は空白ではない!という前提で・・・ シートモジュールです。 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
補足
なぜかRange(Cells(i, 1), Cells(k - 1, j)).Sort keyのところで止まります。 氏名は氏名となっているわけではなく、ランダムな値がきます。。
- Asahi2001
- ベストアンサー率54% (6/11)
少量データならソート用の番号を追加するのが簡単かと思います。 空いてる列に連番を振ってソートするデータ部分には同じ番号を設定します。 ソートは、第一キーをソート用の番号列を、第二キーはデータ列を指定。 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
補足
データ量は多いです。 パターンのキーワードは ===が2回のあとデータ次の===が来るまで で定義したいのですがどのようにすればいいでしょうか?
お礼
短いのにスゴイデス。できてます。有難うございます。