![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
【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で可能であればと思い、質問させていただきました。
よろしくお願いします。
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
回答ありがとうございます。
教えていただいたコードで試してみたところ、希望通りの結果を得ることができました。
マクロが終了するまであっという間だったので、今まで手作業で1社ずつ範囲選択⇒並べ替えをしていたのがちょっと悲しくなりました。
計を再計算させるオプションまで…すごいです!!
今回はCSVデータをそのまま使用しているので、計算式は入力されていないのですが、勉強になりました。
ありがとうございました。
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
これでいけると思います。
再度の回答ありがとうございます。
>僕は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
ではいかがでしょう?
![「【Excel VBA】複数範囲の並べ替え」の回答画像2](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/a/1234346_5497e46dccb00/M.jpg)
回答ありがとうございます。
教えていただいたコードで試してみたところ、別会社の中にデータが入り込んでしまっている場合が一部ありました。
下記のようにデータが1行しかない場合に、そのようになってしまっているようです。
○○会社
2/1 123 AAA 1,000
計 1,000
1社のデータが2行以上の場合は希望通りの結果が得られていましたので、少し手を加えてみたいと思います。
ありがとうございました。
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
回答ありがとうございます。
教えていただいたコードで試してみたところ、マクロは実行されているようですが、A列の日付順での並べ替えはできていませんでした。
コード内の
>Selection.Sort Key1:=Range("C1").Offset(i)
を
Selection.Sort Key1:=Range("A1").Offset(i)
に書き換えて再度試してみたところ、日付順での並べ替えはできたのですが、C列の会社名が最後の行になってしまいました。
日付(A列)が空欄だからそのようになってしまうのでしょうが、何か条件を加えるとうまくいくかもしれませんね。もう少し考えてみようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) [並べ替えの前に]、[選択範囲を拡張する]のが煩わしいッ! 1 2023/02/28 22:40
- Excel(エクセル) 結合セルのソートについて 5 2022/04/22 11:57
- Excel(エクセル) Googleスプレッドシートの割合の関数と円グラフの並べ替えについて 1 2022/07/22 17:31
- Excel(エクセル) [オートフィルター]機能について 3 2023/02/04 14:32
- Excel(エクセル) Excelで、行に複数の数字が入力されているセルが複数の列存在し、行を跨いでセル内の数値を並び替える 5 2022/06/17 18:03
- Visual Basic(VBA) 【VBA】もし、値が0だったら左のセルと合わせて削除したい 3 2023/04/20 10:12
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
- その他(Microsoft Office) 1の行を固定した上でVBAを用いて日付順に自動並べ替え 2 2022/06/06 15:09
- Excel(エクセル) 重複したデータ(空白は除く)のVBA表記について 4 2022/08/15 07:28
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
Excel関数:「0」を除いた標準...
-
Excel関数で、範囲内の最後のセ...
-
更新前と更新後の差分をVBAを使...
-
【エクセル】区切り位置で分割...
-
エクセル、正数のみの集計[(負...
-
ピボットテーブル 0個の行を...
-
エクセルでデータ照合の仕方
-
SUMPRODUCT関数 行が増えても...
-
値の入っているセルのうち、一...
-
エクセル関数について教えてく...
-
Excelのマクロで行を間引きたい
-
VLOOKUP関数 反映されない
-
あるexcel表からチェックボック...
-
エクセル 8ケタの数字から日数...
-
昇順に並べるボタンをマクロで...
-
エクセル 配列の中の条件に一...
-
日付の数を月ごとにカウントし...
-
Excelのマクロでソートがうまく...
-
複数の候補列から、検索値と一...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelで隣のセルと同じ内容に列...
-
Excel関数で、範囲内の最後のセ...
-
Excel関数:「0」を除いた標準...
-
【エクセル】区切り位置で分割...
-
ピボットテーブル 0個の行を...
-
更新前と更新後の差分をVBAを使...
-
値の入っているセルのうち、一...
-
SUMIFで数値が入力されているセ...
-
エクセル 8ケタの数字から日数...
-
エクセルに入力された日付「S40...
-
エクセルで何種類のデータがあ...
-
複数の候補列から、検索値と一...
-
correl関数の範囲指定
-
Excelで複数列かつ複数行分の一...
-
エクセル、正数のみの集計[(負...
-
Excelのマクロで行を間引きたい
-
スプレッドシートでドロップダ...
-
エクセルVBAを使ってセルに日付...
-
【Excel】歯抜けデータの集約
-
SUMIFとCOUNTIFの違いについて
おすすめ情報