Несоответствие типов при сортировке с VBA - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь реализовать код VBA, который автоматически сортирует диапазон данных, зависящий от текста в столбце L, но я получаю ошибку несоответствия типов.Я не уверен, где я ошибся.Вот мой код:

Dim AccuracySortRow
AccuracySortRow = Cells(Rows.Count, "L").End(xlUp).Row
With ActiveSheet
    .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=.Range("L8:L" & AccuracySortRow), _
                        SortOn:=xlSortOnValues, _
                        CustomOrder:="ENTRY DENIED, ENTRY GRANTED", _
                        DataOption:=xlSortNormal
    .Sort.SetRange ("B8:L" & AccuracySortRow)
    .Sort.Header = xlNo
    .Sort.MatchCase = False
    .Sort.Apply
End With

Я указал последнюю строку в диапазоне, который хочу отсортировать, поскольку в этом диапазоне есть другой набор данных, в который я не хочу вмешиваться.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Несоответствие типов наиболее вероятно встречается здесь:

.Sort.SetRange ("B8:L" & AccuracySortRow)

Поскольку выражение ("B8:L" & AccuracySortRow) разрешается в String, а Sort.SetRange ожидает Range объект .Обратите внимание, что .Sort.SetRange (someRangeObject) также выдаст ошибку несоответствия типов, потому что эти круглые скобки заставляют выражение, которое должно быть оценено до , результат передается методу, так что будет передаваться массив 2D Variant (через неявный вызов члена по умолчанию для Range.[_Default], который в этом контексте разрешается до Range.Value, который все еще не является Range объектом: удалите скобки.

Кроме того, я подозреваю, что значение AccuracySortRow таков, что вы включаете эти «другие данные», в которые вы не хотите вмешиваться - при условии, что столбец L содержит данные в обоих наборах данных.

Если в столбце L нет пробелов, вам необходимо использовать .End(xlDown) сверху (ну, из строки 8, я думаю), а не .End(xlUp) снизу, если вы хотите получить номер строки, который находится в верхнем наборе данных.Все это было бы гораздо проще сделать, если бы сортируемый диапазон был ListObject / table (обратите внимание, что .Sort.SetRange нельзя использовать с таблицей).

0 голосов
/ 07 февраля 2019

Добавьте пользовательский заказ в виде массива в CustomListCount, затем используйте его в качестве аргумента OrderCustom.

Option Explicit

Sub customsortL()

    'add the custom order to the CustomListCount
    Application.AddCustomList ListArray:=Array("ENTRY DENIED", "ENTRY GRANTED")

    With Worksheets("sheet11")
        With .Range(.Cells(8, "L"), .Cells(.Rows.Count, "L").End(xlUp))

            .Sort Key1:=.Columns(1), Order1:=xlAscending, _
                  Orientation:=xlTopToBottom, Header:=xlNo, MatchCase:=False, _
                  OrderCustom:=Application.CustomListCount + 1

        End With
    End With

End Sub
...