Sub renshu()
Dim wFm As Worksheet
Dim cMx As Long
Dim cGyo As Long
Dim cMigi As Long
cMx = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
cMigi = 2
For cGyo = 2 To cMx
Range("A" & cGyo).Value = cGyo - 1
Next
Set wFm = ActiveWorkbook.Worksheets("main") 'ブレークポイント①↑通し番号を振る
With wFm.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
For cGyo = 2 To cMx 'ブレークポイント②↑B列で並べ替え
If Range("B" & cGyo).Value <> Range("B" & cGyo - 1).Value Then
Range("D" & cMigi).Value = cMigi - 1
Range("E" & cMigi).Value = Range("B" & cGyo).Value
cMigi = cMigi + 1
End If
Next
With wFm.Sort 'ブレークポイント③↑リスト書き出しまで
.SortFields.Clear
.SortFields.Add Key:=Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
Range("A2:A" & cMx).ClearContents 'ブレークポイント④↑A列で並べ替え
End Sub '⑤番号を消す-A列を削除
Sub renshu_ogawa1()
Dim wFm As Worksheet
Dim cMx As Long
Dim cGyo As Long
Dim cMigi As Long
'↓以下2行はインデント過多です (^^; ogawa
cMx = Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
cMigi = 2
For cGyo = 2 To cMx
Range("A" & cGyo).Value = cGyo - 1
Next
Set wFm = ActiveWorkbook.Worksheets("main") 'ブレークポイント①↑通し番号を振る
'↓丁寧にやるなら、以下のとおり、range("xx") の手前に wFm. をつけます。でないと、アクティブシートが wFm でないときに誤動作する可能性が高いです。
' (「並べ替え対象は wFm で、諸条件の設定はアクティブシート」となってしまうため)
' シートが1枚しかないか、このマクロ実行時には絶対に worksheets("main") がアクティブになっているという保証があれば話は別ですが。
' あるいは、この並べ替えが実行されるより前に、 wFm を明示的にアクティブにしておくこと。
With wFm.Sort
.SortFields.Clear
.SortFields.Add Key:=wFm.Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange wFm.Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
For cGyo = 2 To cMx 'ブレークポイント②↑B列で並べ替え
If Range("B" & cGyo).Value <> Range("B" & cGyo - 1).Value Then
Range("D" & cMigi).Value = cMigi - 1
Range("E" & cMigi).Value = Range("B" & cGyo).Value
cMigi = cMigi + 1
End If
Next
With wFm.Sort 'ブレークポイント③↑リスト書き出しまで
.SortFields.Clear
.SortFields.Add Key:=wFm.Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange wFm.Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
Range("A2:A" & cMx).ClearContents 'ブレークポイント④↑A列で並べ替え
End Sub '⑤番号を消す-A列を削除
Sub renshu_ogawa2() '↓ここまですれば、アクティブシートがどれであろうと動作します。
Dim wFm As Worksheet
Dim cMx As Long
Dim cGyo As Long
Dim cMigi As Long
Set wFm = ActiveWorkbook.Worksheets("main") 'この段階で、シートへの参照設定(ニックネームつけ)を早々にする。以降では、セルを指定する部分で wFm. とシートを明示する。
cMx = wFm.Range("B" & ActiveSheet.Rows.Count).End(xlUp).Row
cMigi = 2
For cGyo = 2 To cMx
wFm.Range("A" & cGyo).Value = cGyo - 1
Next
' Set wFm = ActiveWorkbook.Worksheets("main")
With wFm.Sort
.SortFields.Clear
.SortFields.Add Key:=wFm.Range("B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange wFm.Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
For cGyo = 2 To cMx
If wFm.Range("B" & cGyo).Value <> wFm.Range("B" & cGyo - 1).Value Then
wFm.Range("D" & cMigi).Value = cMigi - 1
wFm.Range("E" & cMigi).Value = wFm.Range("B" & cGyo).Value
cMigi = cMigi + 1
End If
Next
With wFm.Sort
.SortFields.Clear
.SortFields.Add Key:=wFm.Range("A1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange wFm.Range("A1:B" & cMx)
.Header = xlYes
.Orientation = xlTopToBottom
.Apply
End With
wFm.Range("A2:A" & cMx).ClearContents
End Sub
浦山大さんの投稿
(投稿ID: 3440)
※記法、インデント等問題ないでしょうか?
※並べ替えが大変(ごちゃごちゃ)でした。
→過去の皆さんのコメント等参考にさせて頂いて自分なりに編集してみました。
■動作は確認しました、意図通りに動いています。
■別解の様に変数namaeを使用するのにもチャレンジしてみます。
基礎編で実施していることについてはサラサラ書けています。不思議です…。
また、今までブレークポイントをあまり使ってこなかったんですが、使い方が今回の練習で体得できました。途中途中でしっかり検証、実験しながらでないと訳がわからなくなってしまいますね。Debug.Printも入れながら作業するようにしています。
小川慶一さんのコメント
(コメントID: 4907)
添削を返送します。
> ※記法、インデント等問題ないでしょうか?
一箇所だけ要修正でした。
> ※並べ替えが大変(ごちゃごちゃ)でした。
特に並べ替えでよくある注意点として、シートを明示している部分とアクティブシートでの作業と記載されている部分が混在してしまうことがあります。
どちらかに統一しましょう。
> 基礎編で実施していることについてはサラサラ書けています。不思議です…。
身体で覚えているということでしょうね (^^
> また、今までブレークポイントをあまり使ってこなかったんですが、使い方が今回の練習で体得できました。途中途中でしっかり検証、実験しながらでないと訳がわからなくなってしまいますね。Debug.Printも入れながら作業するようにしています。
ブレークポイント設定等のデバッグのノウハウには、ある程度のスケールのプログラムを書きはじめてようやく実感できるような面がありますね (^^
ひきつづき、お楽しみください☆