先日からの「並び替えに関する課題」について、少しずつ進めている。
昨日は、書き出したコードを、並び替え順を表す数字に置き換えてみた。
infoment.hatenablog.com
今日はさらに、決められた行に空白行を挿入してみる。
と言っても、実際に空白行を挿入するのは面倒だ。
そこで、表の下に沢山転がっている空白行を利用する。
昨日の時点で ↓ こうだったものが、
仮にこうなれば、
E列で並び替えると、↓ こうなる。
後で空白行を挿入する場合と、結果は同じだ。
そこでまず、コードと順位の対照表を更新する。
後は、空白行の順位を追記して、並び替え。
最後に並び替え用の列を削除して、完成だ。
Sub 並べ替え() ' 元データ保護のため、シートごとコピーして並べ替え。 Dim Sh As Worksheet ActiveSheet.Copy After:=ActiveSheet Set Sh = ActiveSheet Sh.Name = "並べ替え後" ' 正規表現。 Dim myReg As Object Set myReg = CreateObject("VBScript.RegExp") ' パターン定義。 ' 一文字以上の英字のあとに、一回以上連続してスペースが続く。 ' その後に英字が3文字続き、ピリオドののち、商品名となる。 ' 今回必要なのは、英字が3文字続く部分。 myReg.Pattern = "^[A-Z]+\s+([A-Z]{3})\..*$" ' A列をループで確認。キーとなるコードをE列に書き出す。 Dim MC As Object ' MatchCollection Dim Dict As Scripting.Dictionary Set Dict = SortDict Dim r As Range For Each r In Range("A2:A6") If myReg.Test(r) Then Set MC = myReg.Execute(r) Dim temp As String temp = MC(0).SubMatches(0) If Dict.Exists(temp) Then Cells(r.Row, "E") = Dict(temp) End If End If Next ' 空白行並び替え用 Dim arr As Variant arr = Array(3, 5, 6) ' 並び替え用順位の貼り付け。 Cells(Rows.Count, "E").End(xlUp).Offset(1).Resize(UBound(arr) + 1) = _ WorksheetFunction.Transpose(arr) ' 並び替え。 Dim SortRange As Range Set SortRange = Range("A1").CurrentRegion Sh.Sort.SortFields.Clear Sh.Sort.SortFields.Add2 Key:=SortRange.Columns("E:E") With Sh.Sort .SetRange SortRange .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Columns("E:E").Delete Shift:=xlToLeft Range("A1").Select End Sub Public Property Get SortDict() As Scripting.Dictionary Dim Tb As ListObject Set Tb = Sheets("並び順").ListObjects(1) Dim Dict As Scripting.Dictionary Set Dict = New Scripting.Dictionary Dim ListRow As Excel.ListRow For Each ListRow In Tb.ListRows With ListRow.Range Dict(.Cells(1).Value) = .Cells(2).Value End With Next Set SortDict = Dict End Property
それでは、ステップ実行で確認してみよう。
これで一応、目的の並び替えが完了した。
なお皆さんご承知のとおり、これは唯一無二の解法ではない。あくまで一つの解答例であるからして、興味のある方は是非他の方法も探ってみて欲しい。
ということで、今回のシリーズは、これでおしまいです。
参考まで。