定义自定义排序顺序
问题描述:
我有数据在多个字段中排序,包括一对是自定义排序顺序的数据。其中一种自定义排序是按大小排列,其中包括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类型不匹配。我想这与常量声明有关,但我不能为我的生活弄清楚为什么 - 在立即窗口中查看时,两个字符串看起来都是相同的。
答
为了完整起见,这里是工作方法,(从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
我只会推荐这个非常长的自定义排序列表,或列表需要变动经常编辑而不编辑程序本身。但我可以肯定地确认它以这种方式工作......如果有人能告诉我为什么,我将不胜感激!
此线程可能会帮助https://*.com/questions/22366188/vba-type-mismatch-on-customorder – SJR
@SJR通过该线程挖掘,答案是使用单独的函数来构建您的排序字符串,然后直接从.Sort,CustomOrder:=语句中调用它。奇怪,但它的作品!谢谢。 – CAW