[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『3箇所の並び替えをマクロで』(狭山)
先日は大変お世話になりまして有難うございました。 以前はNHが(日にち)でしたが、エンディングが変なため、今後は(狭山)で投稿します。 よろしくお願いいたします。
以下の3箇所の範囲を昇順で並び替えをマクロ式で行いたいのですが。
一箇所目 C11:M30の範囲を昇順で並び替え(優先順位はD列C列E列の順番で) C D E ・・・・・ M
タイトル行→ 10 県名 月日 電話番号 ・ ・ 30
二箇所目 C36:M45の範囲を昇順で並び替え(優先順位はD列C列E列の順番で)
C D E ・・・・・ M タイトル行→ 35 県名 月日 電話番号 ・ ・ 45
三箇所目 C51:M60の範囲を昇順で並び替え(優先順位はD列C列E列の順番で)
C D E ・・・・・ M タイトル行→ 50 県名 月日 電話番号 ・ ・ 60 よろしくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
(γ) 2016/09/01(木) 22:05
ありがとうございました。 マクロの記録を行う方法を調べていたため時間がかかりました。 以下の構文で出来ましたがこんなに長いものなのでしょうか。 また、シート名が実際のが入っていますが別のシートでもフリーに使用できる場合 何を入れればよろしいのでしょうか。 よろしくお願いいたします。
Sub Macro2() ' ' Macro2 Macro '
'
ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Clear ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "D11:D30"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "C11:C30"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "E11:E30"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("詳細").Sort .SetRange Range("C10:M30") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveWindow.SmallScroll Down:=-9 End Sub
Sub Macro4()
'
' Macro4 Macro
'
'
ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Clear ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "D36:D45"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "C36:C45"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "E36:E45"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("詳細").Sort .SetRange Range("C35:M45") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
Sub Macro5()
'
' Macro5 Macro
'
'
ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Clear ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "D51:D60"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "C51:C60"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal ActiveWorkbook.Worksheets("詳細").Sort.SortFields.Add Key:=Range( _ "E51:E60"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("詳細").Sort .SetRange Range("C50:M60") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
(狭山) 2016/09/01(木) 22:41
http://officetanaka.net/excel/vba/tips/tips148.htm を挙げておきます。
Excel2007からSortオブジェクトが導入されています。 それまでの方式(RangeオブジェクトのSortメソッド)も従来通り使えますから、 ソート列が3つまでといった条件を満たすなら、従来の方式を使ってもOKでしょう。
マクロ記録のコードは以下のように整理することも可能です。
Sub test() Dim ws As Worksheet
Set ws = Worksheets("詳細") With ws.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("D11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("C11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("C10:M30") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
なお、引数を持つFunctionプロシージャにしたてて、 何度も同一記述を避ける工夫もできるでしょう。 検討してみてください。
なお、シートの指定が煩わしかったら省略してもよいでしょう。 その場合は、With ActiveSheet.Sort とします。 (γ) 2016/09/02(金) 06:48
(γ)さん早速ありがとうございました。 また、サイトまで感謝いたします。 以下の構文でできました。
しかし、指定が煩わしかったらWith ActiveSheet.Sort ですが どの構文を変更すればよいのでしょうか 因みに Set ws = Worksheets("詳細")をSet ws =With ActiveSheet.Sort にしてみましたが 構文エラーになってしまいました。
Sub 並び替え()
Dim ws As Worksheet
Set ws = Worksheets("詳細") With ws.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("D11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("C11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("C10:M30") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
Set ws = Worksheets("詳細") With ws.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("D36"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("C36"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E36"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("C35:M45") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With
Set ws = Worksheets("詳細") With ws.Sort .SortFields.Clear .SortFields.Add Key:=ws.Range("D51"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("C51"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=ws.Range("E51"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange ws.Range("C50:M60") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
(狭山) 2016/09/02(金) 09:32
>因みに Set ws = Worksheets("詳細")をSet ws =With ActiveSheet.Sort にしてみましたが >構文エラーになってしまいました。
そんな自己流はNGです。 With句は勉強されたことがないようですね。 この際ですから、テキストを引っ張り出して、よく確認してください。
"詳細"シートがアクティブであることが確実であるなら、 以下のように省略ができます。 こんな書き方になるでしょう。(最初のブロックだけ示します。)
Sub 並び替え() With ActiveSheet.Sort .SortFields.Clear .SortFields.Add Key:=Range("D11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("C11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=Range("E11"), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange Range("C10:M30") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
私は、シートを指定したほうが間違いは少ないと思います。
■------------------
ところで、3つのブロックの繰り返し記述を避けようとするなら、 こんな書き方もできるでしょう。(一例です。色々な書き方があると思います)
Sub test()
mySort Worksheets("詳細").Range("C10:M30") mySort Worksheets("詳細").Range("C35:M45") mySort Worksheets("詳細").Range("C50:M60") End Sub
Function mySort(rng As Range) Dim ws As Worksheet
Set ws = rng.Parent With ws.Sort .SortFields.Clear .SortFields.Add Key:=rng.Cells(1, 2), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=rng.Cells(1, 1), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SortFields.Add Key:=rng.Cells(1, 3), SortOn:=xlSortOnValues, _ Order:=xlAscending, DataOption:=xlSortNormal .SetRange rng .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Function
まずは、少し冗長でも結果を出すことを優先したほうがよいかもしれません。 慣れてきたら、上記のようなことにトライするのもよいでしょう。その時の参考に。
# 自宅でしかアクセスしないので、勢い遅くなります。
(γ) 2016/09/02(金) 21:13
(γ)さん。本当にありがとうございます。 最後の繰り返しを避けるマクロで行いました。 また、マクロボタンも作ってもました。 今後も少しずつ勉強したいと思います。難しいと思いますが また、よろしくお願い致します。
(狭山) 2016/09/03(土) 11:58
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.