• ベストアンサー

Excelの並べ替えについて

お世話になります。 Excelで、下記のように A列に町名、 B列に大人人数と子供人数、 C列に数値がはいったとして   A|  B| C| 1|○○町|大人人数|50 2| |子供人数|30 ---------------- 3|□□町|大人人数|60 4| |子供人数|25 ---------------- 5|▲▲町|大人人数|40 6| |子供人数|20 ・ ・ ・ といった具合にデータのひとつのまとまりが複数の行と列に分かれる場合、このデータごとに並べ替えることは可能でしょうか? (早い話が町名ごとに並べ替えたいのです) ひとつのデータのまとまりは、列は増えることがあるのですが行数は大人と子供、二つ分のみです。 VBAでも構いません。 環境はExcelforMac2004です。お手数ですが、よろしくお願いします。

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

http://okwave.jp/qa4881293.html で回答したコードをちょっと改造して使えそうです。 選択範囲を、2行毎に、各ブロックの左上隅セルの値をキーに並び替えします。並び替え順を昇順→降順にしたい時は、コメントをご覧になって変更してください。 コメントアウトしてあるところを有効にすると、元のシートに書き戻して、作業用シートを削除します。かならず、他の動作が確認できてからにして下さい。 Windows/XL2000のコードなので、Macで動かなくてもアドバイスできませんので悪しからず。 '選択範囲を二行毎に、左上隅セル(文字列)をキーに並べ替え Sub test() Dim targetRange As Range If TypeName(Selection) <> "Range" Then Exit Sub Set targetRange = Selection Call sortMergeCells(targetRange) End Sub Private Sub sortMergeCells(targetRange As Range) Dim data() As Variant, dataRange() As Range Dim myCell As Range Dim i As Long Dim newSheet As Worksheet Const sortDirection As Long = 1 '昇順 Const blockRowCount As Long = 2 Application.ScreenUpdating = False Set myCell = targetRange.Cells(1) i = 1 Do ReDim Preserve data(1 To i), dataRange(1 To i) data(i) = myCell.Value Set dataRange(i) = myCell.Resize(blockRowCount, targetRange.Columns.Count) Set myCell = myCell.Offset(blockRowCount, 0) i = i + 1 Loop Until Intersect(myCell, targetRange) Is Nothing Call BubbleSortStrings(data, dataRange, sortDirection) Set newSheet = Sheets.Add Set myCell = newSheet.Range("a1") For i = 1 To UBound(data) dataRange(i).Copy myCell Set myCell = myCell.Offset(blockRowCount, 0) Next i ' newSheet.UsedRange.Copy targetRange.Cells(1) Application.DisplayAlerts = False ' newSheet.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub 'Microsoftのバブルソートを改造 'direction 1:昇順、-1 降順 Private Sub BubbleSortStrings(sArray() As Variant, rArray() As Range, direction As Long) Dim lLoop1 As Long Dim lLoop2 As Long Dim lTemp As String Dim rTemp As Range For lLoop1 = UBound(sArray) To LBound(sArray) Step -1 For lLoop2 = LBound(sArray) + 1 To lLoop1 If StrComp(sArray(lLoop2 - 1), sArray(lLoop2)) = direction Then lTemp = sArray(lLoop2 - 1) Set rTemp = rArray(lLoop2 - 1) sArray(lLoop2 - 1) = sArray(lLoop2) Set rArray(lLoop2 - 1) = rArray(lLoop2) sArray(lLoop2) = lTemp Set rArray(lLoop2) = rTemp End If Next lLoop2 Next lLoop1 End Sub

noname#161375
質問者

お礼

わざわざVBAまで書いて頂いてありがとうございます。 Mac故の悲しさで、実行しても何も起こりませんでした…。(途中でエラーも起きないので、コード自体が使えないわけではないと思うのですが) これを参考にしてMacでも使えるよう検討してみます。ありがとうございます。 ちなみに質問なのですが、正常の場合は新規シートのA1~C6の範囲に反映される、でいいんですよね?

その他の回答 (4)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

#3です。 >実行しても何も起こりませんでした…。 並び替えする範囲を選択してから実行されてますか? それでも何のエラーも無しで終了するとすると、下記が怪しいです。下記をコメントアウトしてから試してみて下さい。ただ、MacのVBAについては全く不案内ですので「だからどうする」はご自分で調べていただくしかないです。 If TypeName(Selection) <> "Range" Then Exit Sub 結果を別シートに書き出すのは、その通りです。

noname#161375
質問者

お礼

ありがとうございます!うまく動きました!! 本当におつきあいいただいてありがとうございました。

  • okdeath
  • ベストアンサー率28% (13/46)
回答No.4

こんにちわ。 元データをいじってはいけないのなら、関数とピボットテーブルで解決できますが、元データをいじってもいいなら他の方法のほうが簡単なので今回はそっちで。 ・下図参照 まず計算式を入れます。 D1 : =C2 E1 : =C2 これをデータの有る場所まで下にコピペする。  ↓ D列とE列をコピーし、同じ位置に「形状を選択して貼り付け」→「値」で貼り付け。(これでデータを一行にまとめることができる。)  ↓ 普通に並び替え どうでもいいことですが、回答入力終了間際に誤ってESC押してしまいました。そしたら回答がぜんぶ消えるんですね(TT)すごく悲しくなったので愚痴ってみました。 では、参考まで。

noname#161375
質問者

お礼

こんにちわ。ありがとうございます。 No.2にも解答した通り、表の形をいじらない方向で探してるので…。 画像までつけていただいて申し訳ないです。 誤ってEscを入力してしまうと消えてしまうのですね…! 気をつけたいと思います。 ありがとうございました。

noname#99913
noname#99913
回答No.2

表の構造を下のように変える方がいいと思います。    1   2   3   A  町名  大人  子供 B  ○○  50  30 C  □□  60  25 D  △△  40  20 (1)D1に「=C2」と入力 (2)D1:D2を選択し、コピー、D3から下へ貼り付け (3)D列をコピー、形式を選択して貼り付けで、値で貼り付け (4)A~D列を選択 (5)A列を基準に照準に並べ替え (6)町名がある行から並ぶので、ない行を一括削除 (7)1行目に行を挿入し、「町名」などの項目名を入れる。

noname#161375
質問者

お礼

ありがとうございます。 やはり表の構造自体をかえるしかないのでしょうか…。 表の構造を変える手段は実はもう試していて、その形でのフォーマットもつくってあるのですが、なるだけ構造を変えずに並べ替えをしたいのです。 わざわざ手順まで書いてくださってありがとうございます。

回答No.1

町名優先で並べ替えるには・・・、 1)並べ替えたい全てのデータを選択 2)メニューバーの[データ]→[並び替えを選択] 3)表示されるウィンドウボックスの一番下、範囲の先頭行の[データ]をチェックする。 4)ボックスの一番上、最優先されるキーを町名が書かれている列に設定する。(この場合はA列) 5)OK、で並べ替えられるはずです。

noname#161375
質問者

お礼

早速の返答ありがとうございます。 やってみたんのですが、A列の町名の下にある空白のセルが自動的につまり、B列も大人と子供でまとまってしまいました。 A列↓ あ町 い町 う町 B列↓ 大人人数 大人人数 大人人数 子供人数 子供人数 子供人数 C列↓ B列の隣にあった数値 並べ替えの設定の仕方がいけないのでしょうか?

関連するQ&A

専門家に質問してみよう