プロが教えるわが家の防犯対策術!

次のようなデータの例で一まとまりのグループごとに昇順したいのですが、
どのようにしたらいいでしょうか?

======================  
名前A
======================
11111              <=ここから
22222
33333
55555               <=ここまでを昇順にしたい

======================
名前B
======================
11111
22222
33333
55555

======================
などとずーと続く・・・

つまり
======================  
名前A
======================
のあとのデータ(次の名前まで)を並び替えて
表示したい。

======================<=ここから
名前B
======================<=ここまではそのまま表示
11111             <=ここから並び替える
22222
33333
55555

A 回答 (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行あったりするここもソートされます。

とりあえず、走らせて見てくださいませ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/06/21 01:53

ふつーにエクセルを使っていると「===」とか入力できませんが、まぁそこいらはてきとーに応用してください。




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



#データの無いブロックとか手当てしたら余計な命令が増えちゃいました

この回答への補足

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

補足日時:2013/06/21 01:50
    • good
    • 0

こんにちは。

お邪魔します。

名前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なんですが。。

補足日時:2013/06/21 00:12
    • good
    • 0

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です。
でも、上記を実行すると下記のようになり意図したものと
異なります。。
======
ソートされたデータ
======
======
======
名前
名前
・・

補足日時:2013/06/21 00:16
    • good
    • 0

ちょっと確認させてくださいね。




> 氏名は氏名となっているわけではなく、ランダムな値がきます。。

「名前A・名前B」などが個人名「名無権兵衛・何野誰造」などの値ってことですね?
コレを「ディスプレイ上で“人の目”で確認」するとき、
名前なのか、データなのか、というのをどのように区別してますか?
(どの行までがAさん、この行からBさん、という区別の方法という意味で。)

例えば「“名前”が入っている行はA列にしか入力されていない」とか、
「名前(人)が変わる前には必ず空白行がある」とか、
「並べ替えたいデータ部分は全て数字で構成されている」とか。
そんな「必ず当てはまる条件」が無いと、マクロを使っても難しいですよ。

この回答への補足

パターンのキーワードは
=====
ランダム
=====
データ・・・
データ・・・
です。

=が2回目で次の=までがデータとしてもいいです。

補足日時:2013/06/21 00:06
    • good
    • 0

こんばんは!


一例です。

「名前○」の次の行は空白ではない!という前提で・・・
シートモジュールです。

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のところで止まります。
氏名は氏名となっているわけではなく、ランダムな値がきます。。

補足日時:2013/06/20 22:53
    • good
    • 0

少量データならソート用の番号を追加するのが簡単かと思います。



空いてる列に連番を振ってソートするデータ部分には同じ番号を設定します。
ソートは、第一キーをソート用の番号列を、第二キーはデータ列を指定。

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回のあとデータ次の===が来るまで
で定義したいのですがどのようにすればいいでしょうか?

補足日時:2013/06/20 21:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!