[[20220506200629]] 『[20220504065443]並べ替えのマクロ』(素人) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『[20220504065443]並べ替えのマクロ』(素人)

[[20220504065443]]の内容において、さらに質問させていただきます。
25行ごとに並べ替えさせるマクロの設定ができればと思っています。
B5:G29を一組(25行)として、以下31組あるものを、
第1キー F列(数値)
第2キー G列(数値)
第3キー E列(I5:I14を参照(文字列)、ただし、10セル全てが入力済とは限らず空欄もあり得る)
を条件に、並べ替えさせるマクロの設定について教えてください。
よろしくお願いいたします。

< 使用 Excel:Excel2019、使用 OS:Windows10 >


一組の中で並び替えればいいのですか?
それとも、31あるブロックを入れ替えるのですか?

(わからん) 2022/05/06(金) 21:08


わからん様、ありがとうございます。
1ブロックごとに、31ブロック、前述の要件にて並べ替え出来たらと思います。
(素人) 2022/05/06(金) 21:12

1つのブロックの並び替えを手動でやってみてください。

そして、その操作を「マクロの記録」で記録して、コードを提示してみましょう。
<参考>
https://excel-ubara.com/excelvba1/EXCELVBA303.html

(わからん) 2022/05/06(金) 21:21


わからん様、ありがとうございます。
1ブロックのコードを記録してみました。

Sub Macro1()
'
' Macro1 Macro
'

'

    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add2 Key:=Range("F5:F29") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add2 Key:=Range("G5:G29") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    ActiveWorkbook.Worksheets("Sheet2").Sort.SortFields.Add2 Key:=Range("E5:E29") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
        "ホンダ,ニッサン,ヒノ,ダイハツ,スバル,スズキ", DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Sheet2").Sort
        .SetRange Range("C5:H29")
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("C5").Select
End Sub
(素人) 2022/05/06(金) 21:34

.SetRange Range("C5:H29")←誤りです。実際には、C5:G29です。
(素人) 2022/05/06(金) 21:42

1ブロック分ができたら、31ブロック分を繰り返すようにすればいいです。

 Sub Macro1()
    For i = 0 To 30
        With ActiveWorkbook.Worksheets("Sheet2").Sort
            .SortFields.Clear
            .SortFields.Add2 key:=Range("F5:F29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add2 key:=Range("G5:G29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add2 key:=Range("E5:E29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
                "ホンダ,ニッサン,ヒノ,ダイハツ,スバル,スズキ", DataOption:=xlSortNormal
            .SetRange Range("C5:G29").Offset(i * 25)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next

    Range("C5").Select
 End Sub

(わからん) 2022/05/06(金) 21:56


わからん様、ありがとうございます。
[20220504065443]にて、γ様に教えていただいた現在位置を記憶するコードを追加したところ、実行時の挙動がとても静かになりました。他の書式にも流用できそうです。
ありがとうございました。

Sub Macro1()

     Application.ScreenUpdating = False
     Set r = ActiveCell      'セルの位置を記憶
    For i = 0 To 30
        With ActiveWorkbook.Worksheets("Sheet2").Sort
            .SortFields.Clear
            .SortFields.Add2 Key:=Range("F5:F29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add2 Key:=Range("G5:G29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SortFields.Add2 Key:=Range("E5:E29").Offset(i * 25) _
                , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
                "ホンダ,ニッサン,ヒノ,ダイハツ,スバル,スズキ", DataOption:=xlSortNormal
            .SetRange Range("C5:G29").Offset(i * 25)
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
    Next
     r.Select                'セルの位置を復旧
     Application.ScreenUpdating = True
End Sub
(素人) 2022/05/07(土) 00:06

 補足と余談です。

 とても静かになりました、というのは事実であり、それで結構なんですが、
 それは"現在位置を記憶するコード"というよりも、
 "画面更新を抑止するコード"の効果と言った方が適切でしょう。

 以下は細かい話なので、忘れて頂いて結構です。
 (1)
 今回のコードでは、ソート処理では(画面抑止しない場合ですが)
 ・画面はスクロールしますが、
 ・アクティブセルそのものは変化しませんので、
 Application.ScreenUpdatingを操作するだけでOKです。

 (2)余談の余談です。(たいていの人はスキップして頂いて結構です)
 「余計なSelectはするな」ということが言われます。
 中級者になる一里塚とも言われるほど有益なTipsです。

 盲点になるのは、
 「実質的に、Selectしているものは結構ありふれている」
 という話があります。

 SelectionChangeで調べてみると、
 Range("セル1").Copy Range("セル2") とか
 Range("セル1").Copy
 Range("セル2").PasteSpecial などでも
 SelectionChangeが起動するんですね。

 今回のコードで言うと、.Applyのところで、ソート対象範囲をTargetとして
 SelectionChangeが動きます。

 だからと言って、それを回避せよということでなく(効果があるものは使わざるを得ない)、
 内部ではSelectと同様なことが起きている、
 ということを頭の片隅に入れておくとよいかもしれません、という話です。
 SelectionChangeイベントプロシージャを使う場合に役立つTipsかもしれない。
 (別の掲示板での記事で教えていただいたことの受け売りでした)

(γ) 2022/05/07(土) 09:47


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.