- 締切済み
【VBA】全てのシートを並び替え 反映せず
For Each Ws In Worksheets Ws.Activate 「並び替えの処理」 Next Ws を記述したのですが、 「並び替えの処理」を記憶マクロからコピペした為、 ("Sheet1")しか並び替えの処理がされません。(全シート並び替えの処理がしたい) 下記コードをどの様に修正すれば良いでしょうか。 ご教示願います。 '5行目から最終行迄範囲選択し、W列で昇順に並び替え Rows("5:5").Select Range(Selection, Selection.End(xlDown)).Select ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add Key:=Range("W5:W40") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Sheet1").Sort .SetRange Range("A5:X40") .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- SI299792
- ベストアンサー率47% (772/1616)
マクロの記録を使うと、長くなります。使わなければこれだけです。全シートできます。 データが無い場合は考慮していません。 Option Explicit ' Sub Macro1() Dim S As Worksheet ' For Each S In Worksheets S.[A5:X65536].Sort Key1:=S.[W5], Order1:=xlAscending Next S End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
(1)すべてのシートのデータをまとめて、一律に並べ替えする。 (2)各シートのデータの範囲内で並べ替えを行い、それを全シートに行う (1)(2)のどちらか? (1)の場合は(2)の結果をマージオートのロジックなどで1本化する必要がある。 あるいは事前に1シートにしておくなど。 ーーーー 第Ⅰ行目の各列に、見出し文字列が入っていると、考慮しなくてはならず、その点を データ例を挙げて質問すべきだ。 ーー データがテーブル形式(新・旧・使わない)を使ったものかどうかが、影響するので、そのことも 書いておくべきだ。 ーー コードのデバッグなどは、回答者にやらすのでなく、回答の範疇的な指摘に基づき、自分で考えるべきだ。 ーー シート各々でB列でソートする場合。見出しは第1行だけ。シート・データにはテーブル設定なしの例。 Sheet1,Sheet2以外のシートがある場合の例。なけれな If sh.Name = "Sheet1" Or sh.Name = "Sheet2" Then は不要。 やってみて、色々難しい面があるようで、1例として、参考までに。 ーー Sub test01() Dim a, b As Range For Each sh In Worksheets 'MsgBox sh.Name If sh.Name = "Sheet1" Or sh.Name = "Sheet2" Then MsgBox sh.Name Set a = sh.Range("A1").CurrentRegion Set b = a.Resize(a.Rows.Count - 1).Offset(1, 0) b.Sort Key1:=b.Range("B1"), Order1:=xlAscending End If Next End Sub ーー Sheet1 データ例 ソート前 氏名 体重 山田 56 木村 49 佐藤 72 中村 54 ーー Sheet2 氏名 体重 山口 59 木下 53 藤田 69 富田 55
- kkkkkm
- ベストアンサー率66% (1719/2589)
以下で試してみてください。 Sub Test() Dim ws As Worksheet Dim LastRow As Long For Each ws In Worksheets ws.Activate 'シートの表示を切り替えたくなければいりません。 'W列の最終行までを並び替え対象と考えて LastRow = ws.Cells(5, "W").End(xlDown).Row ws.Sort.SortFields.Clear ws.Sort.SortFields.Add Key:=ws.Range(ws.Cells(5, "W"), ws.Cells(LastRow, "W")) _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ws.Sort .SetRange ws.Range(ws.Cells(5, "A"), ws.Cells(LastRow, "X")) .Header = xlGuess .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Next ws End Sub