2017-10-19 208 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 

我只会推荐这个非常长的自定义排序列表,或列表需要变动经常编辑而不编辑程序本身。但我可以肯定地确认它以这种方式工作......如果有人能告诉我为什么,我将不胜感激!