定义自定义排序顺序

时间:2017-10-19 20:03:17

标签: excel-vba sorting vba excel

我将数据分类到多个字段,包括一对是自定义排序顺序。其中一种自定义排序是按尺寸排列,包括57个类别。如果我将sort变量声明为

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-Type Mismatch。我想它与Const声明有关,但我不能为我的生活找出原因 - 当在立即窗口中查看时,两个字符串看起来都是

1 个答案:

答案 0 :(得分: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

然后直接从Sort过程调用该函数:

 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

我只推荐这个非常长的自定义排序列表,或者需要经常更改而不编辑程序本身的列表。但我可以肯定地确认它是这样工作的......如果有人可以告诉我为什么,我会很感激!