CustomOrder上的VBA类型不匹配

Bac*_*ave 6 vba

我有这个代码非常有效:

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
Run Code Online (Sandbox Code Playgroud)

我试图通过使用一个名为keyRangefor 的变量来修改上面的代码CustomOrder:=:

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
Run Code Online (Sandbox Code Playgroud)

但是我收到类型不匹配错误.我可以在MSDN中看到CustomOrder:=类型Variant.我试过Variant而不是String,但我得到了同样的错误.

编辑:CustomOrder实际上是SortField类型.如何将String keyRange转换为SortField对象?

tmo*_*e82 5

很高兴你想出来了.以下也有效(根据这篇文章):

Sub NewSortTest()
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

Function keyRange() As String

keyRange = "alpha,bravo,charlie,delta,echo,foxtrot,golf,hotel,india,juliet"

End Function
Run Code Online (Sandbox Code Playgroud)

编辑:更容易

CustomOrder:=CVar(keyRange)
Run Code Online (Sandbox Code Playgroud)

编辑:为什么这有效?

我一直试图弄明白自己.CustomOrder正如您在搜索中发现的那样,该物业的帮助文档缺乏任何肉食.我一直在尝试不同的事情,看看我是否能得到答案,而且我没有多少运气.我认为CustomOrder在后台做一些魔术.正如你所发现StringLong,它可以用文字或a 做得很好.它没有String适当的演员阵容Variant.但它不喜欢String变量.它必须与String变量作为引用类型有关.我不知道它为什么不能处理它,但我也不知道它如何从String文字中动态创建自定义列表.如果你找到解释它的任何东西,我很想知道.