Excel VBAで複数範囲の並べ替えは可能?

このQ&Aのポイント
  • Excel2003を使用しています。CSVデータを元に作成された表で、会社ごとのデータ内で日付順に並べ替えをしたいです。VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?
  • Excel2003で作成された表の会社ごとのデータを日付順に並べ替えたいです。VBAで複数の範囲を選択して並べ替えることは可能でしょうか?
  • Excel2003でのデータ並べ替えについて質問です。会社ごとのデータ内で日付順に並べ替えをしたい場合、VBAで複数の範囲を選択して並べ替えることは可能でしょうか?
回答を見る
  • ベストアンサー

【Excel VBA】複数範囲の並べ替えは可能でしょうか?

【Excel VBA】複数範囲の並べ替えは可能でしょうか? Excel2003を使用しています。 CSVデータを元に作成された下記のような表があります。 A列…日付、B列…受注番号、C列…摘要(会社名・品名等)、D列…金額となっています。 6行目以下に上記の内容でデータが入力されていますが、会社ごとのデータ内で日付順に並べ替えをしたいのですが、VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?     A     B     C    D 6             ○○会社 7   1/20   123   AAA   1,000 8   1/15   120   BBB   2,000 9 10              計     3,000 11 12            ××会社 13 計の1行上と下は空欄行で、以下、会社名の後にデータが続くというパターンの繰り返しで数十社分あります。 Excelのデータ⇒並べ替えでは複数選択した状態での並べ替えはできないので、VBAで可能であればと思い、質問させていただきました。 よろしくお願いします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 すでに完成形のコードは出ていますが、私ならこう作るというものを考えてみました。 というか、単にコード・スタイルにこだわっているだけですが……。 '------------------------------------------- Sub DateSortMacro1()   Dim r As Range   Dim d As Variant   On Error Resume Next   With Columns("A").SpecialCells(xlCellTypeConstants, 1)   If Err.Number > 0 Or IsDate(.Cells(1, 1).Text) = False Then _     MsgBox "適当なシートでないか、A列にシリアル値の日付のデータがありません。", vbExclamation: Exit Sub     On Error GoTo 0     Application.ScreenUpdating = False     For Each r In .Areas       Call sSortPro(r.Resize(, 4))     Next r   Application.ScreenUpdating = True   End With End Sub Private Sub sSortPro(rng As Range)   Const i As Integer = 2 '計を入れる場所   rng.Sort Key1:=rng.Cells(1), _   Order1:=xlAscending, _   Header:=xlNo, _   Orientation:=xlTopToBottom   ''計を再計算させるオプション '  If i <= 0 Then Exit Sub '  rng.Cells(rng.Cells.Count).Offset(i, -1).Value = "計" '  rng.Cells(rng.Cells.Count).Offset(i).FormulaLocal _   = "= SUM(" & rng.Columns(4).Address(0, 0) & ")" End Sub

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいたコードで試してみたところ、希望通りの結果を得ることができました。 マクロが終了するまであっという間だったので、今まで手作業で1社ずつ範囲選択⇒並べ替えをしていたのがちょっと悲しくなりました。 計を再計算させるオプションまで…すごいです!! 今回はCSVデータをそのまま使用しているので、計算式は入力されていないのですが、勉強になりました。 ありがとうございました。

その他の回答 (4)

noname#130090
noname#130090
回答No.5

では、僕も直して公開します。 僕はC列に社名が入っていると何故か勘違いをしたため C列を昇順にした後A列を昇順にしていたせいで おかしなものになっていました。 Public Sub sort_asc()   Dim i As Long   For i = 1 To Range("A65536").End(xlUp).Row     If Range("A" & i) <> "" And Range("A" & i + 1) <> "" Then       Range(Range("A" & i), Range("A" & i).End(xlDown). _           End(xlToRight)).Sort Key1:=Range("A" & i)       i = Range("A" & i).End(xlDown).Row     End If   Next i End Sub これでいけると思います。

rx-z5815
質問者

お礼

再度の回答ありがとうございます。 >僕はC列に社名が入っていると何故か勘違いをしたため 勘違いをされていたのではなく、C列には社名が入力されている行もあります。 質問文で挙げた例がわかりづらかったようで、お手数をおかけしてしまい申し訳ありません。 修正してくださったコードで試してみたところ、希望通りの結果を得られました。 今回は、それぞれ違った方法での回答をいただき、大変勉強になりました。 ありがとうございました!

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

> 下記のようにデータが1行しかない場合に、そのようになってしまっているようです。 No2 merlionXXです。 並べ替えなので1行のみのデータとは想定外でした。 Wendy02さまにはとても及びませんが、一応1行でもOKなように修正してみました。 Sub test02()   Set myRng = Range("A7")   Do While IsDate(myRng)     If myRng.Offset(1) <> "" Then       Range(Range(myRng, myRng.End(xlDown)), Range(myRng, myRng.End(xlDown)).End(xlToRight)).Select       Selection.Sort Key1:=Selection(1), Order1:=xlAscending, Header:=xlNo       Set myRng = Selection(1).End(xlDown).End(xlDown)     Else       Set myRng = myRng.End(xlDown)     End If   Loop   Set myRng = Nothing End Sub

rx-z5815
質問者

お礼

再度の回答ありがとうございます。 >並べ替えなので1行のみのデータとは想定外でした。 そうですよね。最初からもう少し例を挙げておくべきでした。 お手数をおかけしてしまい、申し訳ありません。 修正してくださったコードで希望通り動作しました。 >Wendy02さまにはとても及びませんが、一応1行でもOKなように修正してみました。 私にとってはいろんな方法を目にすることが出来るので、勉強になりますし助かります。 ありがとうございました!

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

Sub test01()   Set myRng = Range("A7")   Do While IsDate(myRng)     Range(Range(myRng, myRng.End(xlDown)), Range(myRng, myRng.End(xlDown)).End(xlToRight)).Select     Selection.Sort Key1:=Selection(1), Order1:=xlAscending, Header:=xlNo     Set myRng = Selection(1).End(xlDown).End(xlDown)   Loop   Set myRng = Nothing End Sub ではいかがでしょう?

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいたコードで試してみたところ、別会社の中にデータが入り込んでしまっている場合が一部ありました。 下記のようにデータが1行しかない場合に、そのようになってしまっているようです。         ○○会社 2/1  123   AAA   1,000         計      1,000 1社のデータが2行以上の場合は希望通りの結果が得られていましたので、少し手を加えてみたいと思います。 ありがとうございました。

noname#130090
noname#130090
回答No.1

これで上手くいきますかねえ? いきなり本番でやるのは怖いので 一度別で保存してからやってみてください。 Public Sub sort_asc()   Dim i As Long   For i = 0 To Range("A65536").End(xlUp).Row - 1     If Range("A1").Offset(i) <> "" Then       Range("A1").Offset(i).CurrentRegion.Select       Selection.Sort Key1:=Range("C1").Offset(i), _       Key2:=Range("A1").Offset(i)       i = Range("A1").Offset(i).End(xlDown).Row     End If   Next i End Sub

rx-z5815
質問者

お礼

回答ありがとうございます。 教えていただいたコードで試してみたところ、マクロは実行されているようですが、A列の日付順での並べ替えはできていませんでした。 コード内の >Selection.Sort Key1:=Range("C1").Offset(i) を Selection.Sort Key1:=Range("A1").Offset(i) に書き換えて再度試してみたところ、日付順での並べ替えはできたのですが、C列の会社名が最後の行になってしまいました。 日付(A列)が空欄だからそのようになってしまうのでしょうが、何か条件を加えるとうまくいくかもしれませんね。もう少し考えてみようと思います。 ありがとうございました。

関連するQ&A

  • Excel VBA アクティブセルからある一定のセルまでの範囲選択

    Excel VBA アクティブセルからある一定のセルまでの範囲選択 Excel2003を使用しています。 アクティブセルからC列に『計』と入力されている行の1行上のD列までを選択状態にするマクロを作成しようとしています。 C列に『計』と入力されている行は下記のように複数あるので、アクティブセルの行以下に入力されている次のC列の『計』の1行上までとしたいのですが、どのようにコードを書いたらいいでしょうか? 例えば… A2セルをアクティブにしていてマクロを実行するとA2:D3が選択状態に A7セルをアクティブにしていてマクロを実行すると、A7:D9が選択状態になるように という具合です。 わかりづらくて申し訳ありませんが、よろしくお願いします。    A     B     C     D 1  日付    №   品名    金額 2  1/1     1    ○○○   1,000 3  1/2     2    ×××   1,500 4              計      2,500 5 6 7   1/1     5    ○×○   2,000 8   1/3     6    ××○   1,200 9   1/4     7    ×○○   2,500               計      5,700            :            :

  • エクセルでの並べ替えについて

    上司に頼まれ1000件くらいあるデータの並べ替えを行いました。 やり方は・・・ 並べ替えをしたい場所を選択し、 「データ」⇒「並べ替え」⇒「最優先されるキー」で列を指定し実行 そのときはきちんと並べ替えできたはずと思っているのですが、 (私は普通にやったつもりだったので、さーっとみて確認しただけでした) 数日後、 「並べ替えをしてもらってから、データがぐちゃぐちゃになってしまった!!」 と上司、 今大変なことになっています。 どんなふうにぐちゃぐちゃになったのかといいますと 途中の行から列ごとに数行づつ、データがずれているのです。 例えば、A列は普通、B列は2行づれ、C列は2行づれ、D列は3行づれ・・・ ちなみに、データはもともと行ごとに色がつけてあります。 これは何か並べ替えに影響しますか? 上司はあまりエクセルのことがわかりません。 上司は検索機能をよく使ったようです。 こんなにぐちゃぐちゃなら、私が並べ替えをした後すぐに気づくはず、 きっと上司が変な操作をしたに違いない。と思っているのですが、 何も証拠はなく、一方的に私が悪いことになっています。 そして何より、バックアップを取っていなかったのです! エクセルは2003です。 いったい何が原因なのでしょうか? 何か直す方法はないでしょうか? よろしくお願いします。

  • エクセル複数シートから一定の範囲を1シートへVBA

    エクセルのVBAで質問です。 A1~A3行までは、タイトル(3行が列タイトル) A4行以降から一定のデータが入っており、商品ごとにシートを分けています。 列BF4~BM81までのデータを自動でコピーし、全データシートも自動でできればと思っています。 BF4列には、日付が入っており、複数のシートからコピーされたものは、日付順にて並べたい。「全データシート」を自動で作成する方法は、ネットにて調べることができたのですが、一定の範囲内の複数シートを合算し、日付順に並べ替えて自動でコピーするというのが分かりません。 VBAも全くの初心者です。 詳しくお教えいただればと思います。 よろしくお願いします。

  • 【Excel VBA】重複行の削除

    はじめまして。 IDの重複を削除し、日付データを横1列にまとめるVBAについてご教示いただけますと幸いです。 ------------------------------------------------------- ▼シート1(データ入力がされているシート)    A   B   C   D   E   F    1   ID 日付 2  1234  1/1  1/6  1/10  1/20   3  1234  2/3  2/20 4  1234  3/2 5  7777  1/10  1/15  1/20 6  7777  2/2   2/12  2/22 7  9876  2/3 ⇓ マクロ起動後 ▼シート2(重複行を削除しまとめたシート)    A   B   C   D   E   F   G   H 1   ID 日付 2  1234  1/1  1/6  1/10  1/20  2/3  2/20  3/2 3  7777  1/10  1/15  1/20  2/2  2/12  2/22 4  9876  2/3 【補足】 列情報  ・A列…ID  ・B-F列…日付(左詰め) ※日付はIDごと月毎に行が変わるため、IDによって複数行存在する場合があります。 ※A列のIDは重複しない場合もあれば、4行以上ある場合があります。 ※シート1のデータはおおよそ1000-5000行です。 ※IDに対して、日付は5つあれば問題ありません。そのためG列以降の日付を削除しても支障はございません。 ------------------------------------------------------ VBAの知識があまりなく、調べて出てきたものをコピペ使用も試みたのですが、 上手く動かす事ができませんでした…。 お力添え頂けますと幸いです…。 Windows10でエクセル2016を使用しております。 何卒宜しくお願いいたします。

  • VBAにて範囲選択およびコピーの方法について

    連休中失礼いたします。VBA初心者です。 VBAにて範囲選択の方法およびコピーの方法について教えてください。 (1)範囲選択の方法  まず最初の条件としてD列における値が1.0以上(数値表記は少数点)の場合に限り、 それに該当する行をコピー(A~D列)したいのですが… この方法をVBAの式で表したいのです。  範囲選択として求めたい範囲は、下表で行くとRange(”A3:D6”)の範囲を選択したいのです。  ※D列における値が1.0以上の条件の指定までは、何とかできてそうな感じなのですが、   その条件を満たす、範囲選択がうまくできません。 (2)コピーの方法  (1)で選択した範囲を、選択sheetを変更して貼り付けたいのですがどのようにしたらよろしいでしょうか??       A列     B列     C列      D列 1行    13     10      10      0.5 2行    10     8       7       0 3行    11     9       7       1.0 4行    9      25      18      1.5 5行    8      43      23      1.5 6行    7      12      23      1.0 7行    6      23      43      0.5  8行    15     23      54      0 … …

  • エクセルのVBAでソートをしたい

    エクセルの A列に1,1,3,2,4・・・・・というデータがあって、 B列にB,A,C,D,E・・・・・というデータがった場合、 上から順番に1A,1B,2D,3C,4Eという順番に並べ替えしたいです。 エクセル単独でやる場合は、データの並べ替えでA列を第一優先、B列を第二優先で並べ替えをすればよいのですが、 VBAに埋め込んで、ボタンを押せば並べ替えできるようにできますでしょうか?

  • Excelの並べ替え

    いつもお世話になっております。 今回はExcelの並べ替えについて質問させてください。 先頭行に (A列)日付(B列)約定NO(C列)会社コード(D列)社名(E列)売上金額 などの項目があり、1行ごとにデータが入ったリストがあります。 (売上のデータはどんどん下の行に追加されていくものとします) 社名は取引先が決まっているので同じ社名の異なるデータが何度も出てきます。 そこで、社名を基準に並べ替えて会社ごとの売上金額の合計をとり、その合計金額の大きい順に並べ替えたいのですが・・・ どうもうまくいきません。 まず、『並べ替え』で会社ごとにまとめてから『集計』で合計を出し、その合計をさらに並べ替える事を思いついたのですが、 この方法だと会社名と合計金額以外のデータが表示されなくなってしまいます。 今回は全てのデータが見えている状態で並べ替えたいのです。 また、A社のデータが5行分、B社のデータが10行分、C社のデータが3行分・・・とあり、それぞれの合計金額の順位が C→B→Aだった場合は上からC社の3行B社の10行A社の5行と言ったように表示させたいです。(各社のかたまりは崩したくない) この場合どのようにしたらうまく並べ替えることが出来るでしょうか? 非表示や印刷範囲外にしてしまえば問題ないので仮の列や行を新たに追加することは可能です。 もしわかる方いましたら教えてください。 ※説明不足で申し訳ありません。不明な点ありましたら補足します。

  • excel2003並べ替えについて

    オラクルのデータをexcelにコピーしてきて、そのデータを並べ替えでソートするとソートが正しく行われない。 1-Sep-2004 2-Sep-2004 ・・・ 上記の様な日付データの列を「並べ替えで」にて 「昇順、降順」両方でソートしてみた所 おおよそソートされているものの、Decの間にSepが きていたりと部分的にソートが正しくされていませんでした。 「書式設定」にて日付や数値など試してみましたが 変わりありませんでした。 OfficeXPがインストールされているマシンで同様に「並べ替え」を行うと、並べ替えの条件を設定するポップアップ後にもう一つポップアップが表示され内容は ------ 並べ替えに選択されたデータ範囲には数値形式とテキスト形式が混在している ・数値として処理 ・??? ------ のように二つの選択肢が表れます。 数値として処理をすると正しくソートされ、もう一つを選択すると2003での結果と同じくソートが正しくされませんでした。 もとのデータはどのように作成されたのか詳しくは わかりません。社内でOfficeが段階的にバージョンアップされてきており、このような質問を受けており困っております。宜しくお願いいたします。

  • 【Excel VBA】並べ替え

    Excel2003を使用しています。 あるテキストファイルから必要なデータを抽出し、予めExcelで作成してある表に、抽出したデータをコピーするという作業をマクロで処理しています。 Excelの表は、A列→4桁の番号(数値)、C列→文字列、D列→数値で、A列の番号順(昇順)に表示されています。 抽出されたデータは、2行目以下に表示されるので、まず、A2セルに『0000』、C2セルとD2セルにそれぞれ該当のデータがコピーされ、以下、順番にコピーされます。このA2セル『0000』の行データをコピーされたデータの一番最後にもっていき、下記のように上方向へシフトさせたいのですが、このようなことはコードを追加することで可能でしょうか?    A列  C列  D列 2  0000  あ  100 3  1200  い  200 4  1500  う  300        ↓ 2  1200  い  200 3  1500  う  300 4  0000  あ  100 データ元のテキストファイルは、会社で使用しているシステムの機能を使って、テキストファイルにしたものです。このデータが昇順で表示されているので、こちらを並べ替えてマクロを実行すればいいかと思ったのですが、数値と文字列が混在しているので、Excelの表にコピーした後(数値と文字列の混在がなくなった後)に、上記のように並び替えることができればと思い、質問させていただきました。 よろしくお願いします。

  • 矩形範囲の複数列を縦1列に並べ替えエクセルVBA

    データD1~H50にデータがあるとします。 これを D列データ(1~50行) E列データ(1~50行) F列データ(1~50行) G列データ(1~50行) H列データ(1~50行) と縦1列(計250行)に並べ変えたいのですが 次の条件によるVBAを教えていただけますか。 D1にカーソルを置く(アクティブセル) (または自動的にD1から対象とする※この例ではD1ですが、C1等に変更する場合有り) I列にはデータがない 51の行にはデータがない すなわち完全孤立矩形です。 D1~50行の途中に関数式のある空白セル(""による非表示、)がある場合その行は削除 D列1行目のセル名をファイル名としてテキスト(外部ファィル)を作成(同一ファイル名の上書きを回避) なお、A,B,C列、I列や51行にデータが続いていた場合、一定の範囲を囲ってその部分について同作業をする場合のVBAもあわせてお願いします。 その場合のファイル名は範囲左上のセルが対象。 よろしくお願いします エクセル2013Pro Windows7Pro(SP1)

専門家に質問してみよう