2017-10-19 211 views
1

我有數據在多個字段中排序,包括一對是自定義排序順序的數據。其中一種自定義排序是按大小排列,其中包括57個類別。如果我宣佈排序變量定義自定義排序順序

Const SizeSort As String = "XXS,2XS,XS,S,M,L,XL,1X,2XL,2X,XXL,2X/3X,... (out to 57 items) 

及用途:

.SortFields.Add Key:=Columns("H"), CustomOrder:=SizeSort 

一切工作正常。但是,我希望有人能夠更改排序順序而不必進入代碼本身。我與節約包含一列當前的排列順序的工作簿,然後使用的想法玩:

unicorns = Cells(Rows.Count, "A").End(xlUp).Row 
For i = 1 To unicorns 
    SizeSort = SizeSort & "," & Range("A" & i) 
Next i 
SizeSort = Right(SizeSort, Len(SizeSort) - 1) 

不幸的是,這並不工作 - 我得到運行時錯誤13類型不匹配。我想這與常量聲明有關,但我不能爲我的生活弄清楚爲什麼 - 在立即窗口中查看時,兩個字符串看起來都是相同的

+0

此線程可能會幫助https://stackoverflow.com/questions/22366188/vba-type-mismatch-on-customorder – SJR

+2

@SJR通過該線程挖掘,答案是使用單獨的函數來構建您的排序字符串,然後直接從.Sort,CustomOrder:=語句中調用它。奇怪,但它的作品!謝謝。 – CAW

回答

0

爲了完整起見,這裏是工作方法,(從VBA Type Mismatch on CustomOrder適應,鏈接由SJR提供):定義建立您的排序列表中的功能

Function Sortlist(TmpName) As String 
    '(TmpName = name of file with your sort values) 

    Dim unicorns, i As Long 
    Dim TmpBook as Workbook 
    Set TmpBook = Workbooks.Open(TmpName) 
    unicorns = Cells(Rows.Count, "A").End(xlUp).Row 
    For i = 2 To unicorns 
     Sortlist = Sortlist & "," & Range("A" & i) 
    Next i 
    Sortlist = Right(Sortlist, Len(Sortlist) - 1) 'trim the leading "," 
    TmpBook.Close 

End Function 

然後調用該功能直接從您的排序過程:

With ActiveSheet.Sort 
    .SortFields.Clear 
    .SetRange Range("A1:M" & LR) 
    .SortFields.Add Key:=Columns("A") 
    .SortFields.Add Key:=Columns("B") 
    .SortFields.Add Key:=Columns("L"), CustomOrder:=YNSort 
    .SortFields.Add Key:=Columns("H"), CustomOrder:=Sortlist(filename) 
    .Header = xlYes 
    .Apply 
End With 

我只會推薦這個非常長的自定義排序列表,或列表需要變動經常編輯而不編輯程序本身。但我可以肯定地確認它以這種方式工作......如果有人能告訴我爲什麼,我將不勝感激!