• ベストアンサー
  • 困ってます

【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で可能であればと思い、質問させていただきました。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数2122
  • ありがとう数7

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

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

こんにちは。 すでに完成形のコードは出ていますが、私ならこう作るというものを考えてみました。 というか、単にコード・スタイルにこだわっているだけですが……。 '------------------------------------------- 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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • データ>並べ替えの対象範囲

    Excel2000を使っています。 データ>並べ替えを選ぶと、A列からV列までが対象範囲として選択され、並べ替えのキーになる列Yを選択することができません。左上のコーナーをクリックして、シート全体を選択範囲とすれば問題ないのですが、そうしなくとも最初からA列からZ列までが対象範囲になるような表を作ることはできないのでしょうか? ご存知なら教えていただければ幸いです。

  • 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            :            :

  • excel2003並べ替えについて

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

その他の回答 (4)

  • 回答No.5
noname#130090

では、僕も直して公開します。 僕は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 これでいけると思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答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 ではいかがでしょう?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1
noname#130090

これで上手くいきますかねえ? いきなり本番でやるのは怖いので 一度別で保存してからやってみてください。 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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • エクセル2010(並べ替え)

    エクセル2010(並べ替え) 並べ替えを頻繁に使います 列の表示が出てきて 選択します 列の選択肢は少ないのですが エクセル一杯使っている為 選択数は多い ドラッグして 必要な列を探して 選択しなければなりません ドラッグ⇒選択 の手間を省くことは可能でしょうか?(直接入力) 可能であれば 教えて頂けると幸いです

  • 【Excel】列単位での並べ替え時の列幅

    こんにちは。 Excel2013を使用しています。 表1をユーザー設定リスト順に列単位で並べ替えて表2を作成します。 表は列ごとに列幅がそれぞれ違い、同じデータをExcel2003で並べ替えていたときは、それぞれの列幅も保持したまま並べ替えができていたのですが、、2013で同じように並べ替えようとすると、データのみが並べ替えられて列幅は変わらないので、並べ替え後の表の体裁がおかしくなってしまいます。 できれば、2003と同様の結果を得られるようにしたいのですが、どうしたらいいでしょうか? そういう仕様ということであれば、すんなり諦めもつきますが…。 《表1》 日付  受注番号  品名    売上金額  入金日  入金金額   残高 10/25 0001     エアコン  200,000   11/25   180,000   20,000 10/26 0002     パソコン  100,000   11/26   100,000       0  ・  ・ 《表2》 受注番号  品名    日付   売上金額  入金日  入金金額   残高 0001     エアコン  10/25  200,000   11/25   180,000   20,000 0002     パソコン  10/26  100,000   11/26   100,000       0  ・  ・ 以上、よろしくお願いします。

  • Excelで複数列かつ複数行分の一括並べ替えについて教えてください

    Excel2003を使っています。 【例】 A1:N530の表の中の一部分D1:I530範囲(6列で530行)部分のみを 列単位で一括で並べ替えしたいと思っております。 D1:I530範囲には6列に23、96、11、106、72、49といったように530行全てランダムに数値が入っております。これを各行毎に全て左から昇順に530行分一括並べ替えしたいということでございます。 エクセル機能の「データ」→「並べ替え」→「現在選択する範囲を並べ替える」→「オプション」→「列単位」を指定して列単位に並べ替えは出来たのですが1行ずつしかソート出来ません。 このやり方では530回並べ替え作業をすることになり、時間的に余裕がないのでこの場合にExcel2003の機能で一括で530行分を列単位でもって左から並べ替えをする方法があるでしょうか? ちなみにExcel2007もまだ使ったことないですが所持しています。 仕事上緊急でご質問させていただいております。是非助けてください。

  • エクセルで並べ替えが正しくできません(>_<)

    人が作ったデータなのでどんな設定がしてあるのか、詳しく分からないところがあるのですが、昇順で並べ替え、降順で並べ替えアイコンを使ってデータの並べ替えを行おうとすると、勝手に範囲が指定されるようでA列~F列のみ並べ替えが行われ、これより右の列はそのままになってしまいます。元に戻るとこの範囲が選択された状態になります。 これではレコードがずれてしまいますので使えません。メニューから並べ替えを行えば正しくできるのですが、共有ファイルのためたくさんの人がこのファイルを使用します。エクセルの知識が浅い人が勝手に並べ替えをアイコンでおこなってしまうケースが多々あり困っています。 ちなみにG列にセルポインタを移動させてアイコンで並べ替えを行うと今度はG列~J列のみ並べ替えが行われ、A列~F列、K列より右の列はそのままというような状態です。 もともと私が作ったファイルではないため、詳しい設定内容が把握できていない現状ですが、何か考えられる原因と、対策方法がありましたら教えていただきたいです。 特定の範囲のデータに名前が付いていないか、ウインドウ枠の固定、入力されているデータの種類はどうか、表示されていない列はないか、などいろいろ原因を考えてみましたが解決しません…。 どうかよろしくお願いします。

  • Excel2003での並べ替えについてお教えください。

    Excel2003での並べ替えについてお教えください。 下記のようなデータを、 行|列 A --|-------------- 1|(株)あああ 2|(有)ああう  3| ああい 4| あああ 行|列 A --|-------------- 1|(株)あああ 2| あああ  3| ああい  4|(有)ああう 上記のように(株)、(有)など関係なく、 社名のみをみて、並べ替えをしたいです。 どのようにすればよいでしょうか? よろしくお願いします。

  • 【EXCEL VBA】データの並べ替えの方法

    元データが左から右へ氏名コード、日付(2011/5/1)、出社時刻、退社時刻、日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻、と順に1ヶ月分入力されています。(画像上) このデータを一番左端に氏名コード、上から日付(2011/5/1)、出社時刻、退社時刻、行を変えて日付(2011/5/2)、出社時刻、退社時刻、・・・・・日付(2011/5/31)、出社時刻、退社時刻。(画像下)と言う形に行・列の並べ替えをしたいと考えています。 EXCELの機能である、「コピー→編集→形式を選択して貼り付け→行列を入れ替える」では対応できず、VBAマクロ又は関数で試みようとしましたが、こちらも対応方法が見つかりません。 何かいい方法がございましたら、ご指導のほど宜しくお願い致します。 尚、作業環境はWindows7、MS office2010です。 

  • エクセル2013 範囲を取得して並べ替え

    A列2行目から9桁の同じ数字が入力されています。 同じ数字が入力されている行数は、いつも同じではありません。 A列の同じ数字の範囲を認識して G列で 「数値に見えるものはすべて数値として並べ替えを行う」で並べ替えを エクセルのマクロで教えてください。 例 A2からA4まで 123456789 の同じ数字 G2からG4まで 1-2-3や2-1-2や2-奥-1など・・・ A5からA6まで 147258369 の同じ数字 G6からG6まで 1-2-3や3-3-3など・・・ 入力されている行数は常に可変です。 途中、空白は存在しません。 宜しくお願いします。

  • Excel2007VBAで列ごとにランダム並べ替え

    Excel(エクセル)2007VBAを使った、 コマンドボタンを押すたびに「ある一列のデータをランダムに並べ替える」VBAソースが知りたいです。 (Google検索をかなりしたのですが、この条件を満たすVBAソースが見つかりませんでした。) ----------------------------------- たとえば、 【A列】に A1:えんぴつ A2:消しゴム A3:定規 A4:コンパス A5:赤ペン A6:下敷き A7:ノート A8:クリアファイル A9:クリップ A10:色鉛筆 と入力したとします。 そして、コマンドボタンを一回押します。   ↓↓↓ 【A列】が A1:下敷き A2:ノート A3:クリップ A4:コンパス A5:定規 A6:色鉛筆 A7:えんぴつ A8:赤ペン A9:消しゴム A10:クリアファイル ↑のように、 【A列】にある「えんぴつ」「消しゴム」「定規」「コンパス」「赤ペン」「下敷き」「ノート」「クリアファイル」「クリップ」「色鉛筆」の文字が、【ランダムで並べ替え】されるようにしたいです。 【補足】 ※1回限定のランダム並べ替えではなく、コマンドボタンを押すたびに【何度でも】ランダム並べ替えできるようにしたいです(回数無制限のランダム並べ替えがしたいです)。 ※上記の【A列】に並べた文字はあくまで例です。実際は、【A列】に自由に文字を入力できる応用の利く仕様にしたいです(Excelの【A列】に、どんな言葉や数字を直接入力してもランダム並べ替えできる、という意味です)。 ※上記の【A列】が10行というのもあくまで例です。実際は、【A列】が何行にでも対応できる仕様にしたいです(具体的には【A列】が、時間がかかってでも5000行くらいまで対応できるのが理想です)。 実際はVBAを使わなくてもランダム並べ替えはできるのですが、その方法は効率が悪いと分かったので効率のため、コマンドボタンひと押しでランダムに並べ替えられる【VBAソース】が知りたいです。 上記の条件を満たすVBAソースがわかる方がいましたら、どうかご教授ください。 よろしくおねがいします。

  • Excel VBA ある範囲内で検索条件に一致したデータを入力する

    Excel VBA ある範囲内で検索条件に一致したデータを入力する Excel2003を使用しています。 Sheet2で選択している範囲内のB列のデータがSheet1で選択している範囲内のB列のデータと一致していたら、そのA列のデータをSheet2のA列に入力するというマクロを作成中ですが、うまくいきません…。 Sheet1とSheet2の選択範囲については、このマクロを実行前に都度選択するようにし、A列のデータは日付、B列のデータは数値です。 以前、示していただいたサンプルを参考にコードを書き換えて試していますが、なかなか思うようにいかず、質問させていただきました。 よろしくお願いします。

  • EXCEL2007で並べ替えができません

    OSはXPで、EXCEL2007を使用しています。 ランダムに入力した名簿(A列:連番、B列:地区・班番号、C列:氏名、D列:住所、E列:電話、F列誕生月、G列:備考、H列:会員番号)を氏名の昇順で並べ替えをしようとしてもできません。 ちなみにデータタブでカーソルをC列に置き、昇順ボタンを押しても、飯田が1番に来、新井が25番目に来てしまう始末です。 また、並べ替えボタンで、並べ替えウイザードの最優先されるキーに氏名を選択し、並べ替えキーを値、順序を昇順にしてOKボタンを押しても結果は同じでした。 解決方法をご教示ください。