Предотвращение изменения критериев автофильтра от строки к дате - PullRequest
0 голосов
/ 23 июня 2019

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

"0 - 4", "5 - 9", "10 - 49", "50 - 99", "100 - 249", "250 or more"

Все они хранятся в виде текста.

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

activesheet.range("a1:a5000").autofilter field:=1, criteria1:="<>" & strValue

strValue заполняется каждым значением и объявляется как строка.

  • Все работает нормально, кроме случаев, когда оно достигает "10 - 49".Это не исключает "10 - 49" при отображении.
  • Я могу повторить поведение вручную - если я перейду к раскрытию автофильтра для столбца, выберите Текст Filters>Does Not Equal, а затем выберите вариант раскрытия для "10 - 49" (или просто введите его) и нажмите OK, это не будет применяться.Он по-прежнему показывает 10 - 49 строк.
  • Когда я возвращаюсь к текстовому фильтру Filters>Custom, он не равен 18172.

18172это значение даты для "Oct-1949".

Даже если я явно установлю код:

activesheet.range("a1:a5000").autofilter field:=1, criteria1:="<>10 - 49"

Он преобразует 10 - 49 в значение даты.Если вы запишите макрос и сделаете его вручную через раскрывающийся список автофильтров, в записанном коде будет показан критерий 1 как "<>Oct-1949".

Я получил его для работы с помощью criteria1:="<>*" & strValue, но это работает сэти данные, но могут не работать, если бы у меня были другие значения с 10 - 49.

Поэтому мой вопрос, есть ли какой-либо способ предотвратить преобразование

"<>10 - 49"

в * 1046?*

"<>Oct-1949"

Нужно ли как-то избегать, чтобы сказать, что он должен воспринимать это как истинный текст?Или это просто причуда Excel?Он работает с criteria1:="=10 - 49" (даже при записи макроса).

Это происходит в Excel 2010, 2013 и 2016.

1 Ответ

0 голосов
/ 23 июня 2019

Можно подумать, что будет выход, особенно с пробелами в 10 - 49. Пока / пока кто-нибудь не придет с ответом, вы можете попробовать это.

  • создать уникальный список всех записей в столбце для фильтрации
  • исключить strvalue из этого списка
  • Используйте этот уникальный список, чтобы выбрать все записи в столбце, кроме strValue

Ниже приведен пример с единственным значением для strValue. Вы должны быть в состоянии использовать этот принцип для применения этой техники другими способами.

Например, заполнить коллекцию всем списком, а затем заполнить arrVals всеми, кроме strValue, может быть лучше для сценария, в котором вы заполняете strValue другими значениями


Option Explicit
Sub filterTest()
    Dim R As Range, WS As Worksheet
    Const strValue As String = "10 - 49" 'value to exclude
    Dim colVals As Collection, vVals As Variant
    Dim arrVals() As String, I As Long

Set WS = Worksheets("sheet1")
With WS
    Set R = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
End With

WS.ShowAllData

'Get list of values to include
Set colVals = New Collection

'read the range into variant array for speed of execution
vVals = R.Offset(1, 0).Resize(R.Rows.Count - 1)

On Error Resume Next 'to skip the duplicates
    For I = 1 To UBound(vVals, 1)
        If Not vVals(I, 1) = strValue Then 'exclude if strValue
            colVals.Add vVals(I, 1), vVals(I, 1)
        End If
    Next I
On Error GoTo 0

ReDim arrVals(1 To colVals.Count)
For I = 1 To colVals.Count
    arrVals(I) = colVals(I)
Next I

R.AutoFilter field:=1, Criteria1:=arrVals, Operator:=xlFilterValues

End Sub
...