web-dev-qa-db-ja.com

カスタム順序とコンマを含む値を使用してExcel VBAソートをコーディングする

VBAでは、Excelでは、CustomOrderパラメーターを使用して値を並べ替え、並べ替えるアイテムを選択できます。残念ながら、アイテムのシーケンスはコンマで区切られており、私の並べ替えアイテムの1つにコンマが含まれています。たとえば、最初の列のデータを2番目の列のカテゴリで並べ替えたいとします。 「Air、Land、or Sea」カテゴリにはカンマが含まれています。

Data1 Aerospace 
 Data2 Cyber​​space 
 Data3 Cyber​​space 
 Data4 Air、Land、or Sea 
 Data5 Aerospace 
 Data6 Air、Land、or Sea 
 Data7 Cyber​​space 

VBAマクロを記録すると、作成されるコードは次のようになります。

MyWorksheet.Sort.SortFields.Add Key:=Range( _
    "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
    CustomOrder:= "Cyberspace,Air,Land,or Sea,Aerospace", _
    DataOption:=xlSortNormal  
MyWorksheet.Sort.Apply

したがって、カスタムの並べ替え順序は、「Cyber​​space」、「Air、Land、またはSea」、「Aerospace」の順になります。ただし、コンマのため、2番目のカテゴリーは3つのカテゴリーとして扱われます。 「空気、陸、または海」の行は、Excelがそれらに一致するカスタムの並べ替えを見つけられないため、下に並べ替えられます。埋め込まれたコンマを含むカテゴリでCustomOrderを機能させる方法はありますか?

カテゴリを二重引用符で囲み、区切り文字のコンマをセミコロンに置き換えてみました(Excelがコンマではなくセミコロンを受け入れることを期待しています)。どちらもうまくいきませんでした。

11
Dean Hill

Applyがないようです。追加できますか

MyWorksheet.Sort.Apply

あなたが持っているカスタムオーダーは私のサンプルのように機能しています。

[〜#〜] edit [〜#〜] OP更新質問に基づいて更新

マクロを次のように編集します-OrderCustomパラメータに配列を使用します。

Dim oWorksheet As Worksheet
Set oWorksheet = ActiveWorkbook.Worksheets("Sheet1")
Dim oRangeSort As Range
Dim oRangeKey As Range

' one range that includes all colums do sort
Set oRangeSort = oWorksheet.Range("A1:B9")
' start of column with keys to sort
Set oRangeKey = oWorksheet.Range("B1")

' custom sort order
Dim sCustomList(1 To 3) As String
sCustomList(1) = "Cyberspace"
sCustomList(2) = "Aerospace"
sCustomList(3) = "Air, Land, or Sea"

Application.AddCustomList ListArray:=sCustomList
' use this if you want a list on the spreadsheet to sort by
' Application.AddCustomList ListArray:=Range("D1:D3")

oWorksheet.Sort.SortFields.Clear
oRangeSort.Sort Key1:=oRangeKey, Order1:=xlAscending, Header:=xlGuess, _
    OrderCustom:=Application.CustomListCount + 1, MatchCase:=False, _
    Orientation:=xlTopToBottom, DataOption1:=xlSortNormal

' clean up
Application.DeleteCustomList Application.CustomListCount
Set oWorksheet = Nothing
16
Steve Mallory

わかりました...更新された説明に基づいて、並べ替えるものの横にある列の数式はどうですか。

したがって、「Air、Land、or Sea」がB1列にある場合、C1は次のようになります。

=SUBSTITUTE(B1,",","|")

次に、次のようにカスタムソートを実行できます。

MyWorksheet.Sort.SortFields.Add Key:=Range( _

        "B:B"), SortOn:=xlSortOnValues, Order:=xlAscending, _
        CustomOrder:= "Cyberspace,Air|Land|or Sea,Aerospace", _
        DataOption:=xlSortNormal  
    MyWorksheet.Sort.Apply

範囲を適切に調整してください。

0
ray