Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CustomOrder上的VBA类型不匹配_Vba - Fatal编程技术网

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