CustomOrder上的VBA类型不匹配
我有一个非常有效的代码:CustomOrder上的VBA类型不匹配,vba,Vba,我有一个非常有效的代码: Sub NewSortTest() ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add key:=Range("A1:A20") _ , SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
Sub NewSortTest()
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add key:=Range("A1:A20") _
, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
"alpha,bravo,charlie,delta,echo,foxtrot,golf,hotel,india,juliet", DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B20")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
我正试图通过为CustomOrder:=
使用名为keyRange
的变量来修改上述代码:
Sub NewSortTest()
Dim keyRange As String
keyRange = "alpha,bravo,charlie,delta,echo,foxtrot,golf,hotel,india,juliet"
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add key:=Range("A1:A20") _
, SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:= _
keyRange, DataOption _
:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B20")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
但是,我得到一个类型不匹配错误。
我可以在MSDN中看到CustomOrder:=
的类型是Variant
。我尝试了Variant
而不是String
,但得到了相同的错误
编辑:
CustomOrder实际上是类型。
如何将字符串keyRange转换为SortField对象?我已经解决了。
您需要使用ListArray:
Sub NewSortTest()
Dim keyRange As Variant
Dim sortNum As Long
keyRange = Array("alpha", "bravo", "charlie", "delta", "echo", "foxtrot", "golf", "hotel", "india", "juliet")
Application.AddCustomList ListArray:=keyRange
sortNum = Application.CustomListCount
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Sheet1").Sort.SortFields.Add key:=Range("A1:A20"), SortOn:=xlSortOnValues, Order:=xlAscending, CustomOrder:=sortNum, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Sheet1").Sort
.SetRange Range("A1:B20")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
很高兴你明白了。以下各项也适用(根据): 编辑:更简单
CustomOrder:=CVar(keyRange)
编辑:为什么这样做?
我一直想自己弄明白。您在搜索中发现,
CustomOrder
属性上的帮助文档缺少任何内容。我一直在尝试不同的东西,看看是否能找到答案,但我运气不太好。我认为CustomOrder
在后台发挥了一些魔力。正如您所发现的那样,使用字符串
文本或长
就可以了。而且它没有问题,因为字符串
正确地转换为变量
。但是它不喜欢字符串变量。它必须与作为引用类型的String
变量有关。我不知道为什么它不能处理这个问题,但我也不知道它是如何从字符串
文本动态创建自定义列表的。如果您能找到任何解释,我很想知道。我仔细研究了如何使用函数填充自定义订单字符串,如前面的回答所示
我一开始忽略了它,后来才意识到这可能有效,因为它返回的是文本字符串而不是普通字符串
不管怎么说,多亏了以前的响应者,它才起作用。这就是我解决问题的方法keyRange
适合.SortFields。如前面的答复所示,添加
字符串
Function keyRange() As String
'Create a string used to sort data on another sheet.
'Becomes part of the .SortFields.Add statement as CustomOrder:=keyfield
'CustomOrder items are in Col "A" of a sheet. The list can change over time
'and is refreshed from an import from a database.
With Sheets("Home Groups")
lic = lastInCol(.Range("A1")) 'Gets the last used cell in column A
'lastInCol is one of John Walkenbach's routines
'From his book Excel 2010 Power Programming with VBA
'Create a string from those items from row 2 to the last used row
For rw = 2 To lic
If rw = 2 Then
keyRange = .Cells(rw, 1) 'This is the first item
Else
keyRange = keyRange & "," & .Cells(rw, 1) 'The remaining items - comma separated
End If
Next rw
End With
End Function
我知道这是一条老线索,但我觉得我的方法似乎值得分享
我将SortField存储为一个变量,然后按照下面的设置CustomOrder属性,似乎编译器将获取分隔字符串并将其转换为所需的任何内容。仅供参考,loNewReport是一个ListObject
Dim sField As SortField
Set sField = loNewReport.Sort.SortFields.Add(loNewReport.ListColumns("Branch").DataBodyRange, xlSortOnValues, xlAscending)
sField.CustomOrder = "QLD, NSW, VIC"
loNewReport.Sort.Apply
Set sField = Nothing
你第一次是对的CustomOrder
是一个变体。
它是SortField
对象的属性。谢谢。你的版本简单多了。你能解释一下为什么你的版本有效,而我的版本无效吗?为什么从函数中获取keyRange是有效的,而仅仅用Dim keyRange作为字符串声明它是无效的?
Dim sField As SortField
Set sField = loNewReport.Sort.SortFields.Add(loNewReport.ListColumns("Branch").DataBodyRange, xlSortOnValues, xlAscending)
sField.CustomOrder = "QLD, NSW, VIC"
loNewReport.Sort.Apply
Set sField = Nothing