Множественные критерии фильтрации для пробелов и чисел с использованием подстановочных знаков в одном поле просто не работают

Несмотря на количество вопросов по этой теме, я не смог найти решение своей проблемы (в чем может быть моя вина, а может и нет).

Мне нужно автофильтровать диапазон, чтобы возвращать пробелы и числа, начинающиеся с 614.

Этот столбец был предварительно отформатирован с использованием следующего:

Range("B:C").NumberFormat = "###0"

Это сделано для того, чтобы удалить формат экспоненциальной записи, который Excel хочет использовать для некоторых чисел.

Затем я использую следующее, чтобы применить фильтр:

With ActiveSheet
    .AutoFilterMode = False 'remove any active filters
    .Range("A1:O1").AutoFilter Field:=2, Criteria1:="614*", Operator:=xlOr, Criteria2:="="
End With

Независимо от того, как я применяю фильтр, включая использование массива, фильтр возвращает только пустые значения. Я также использовал Criteria1:="=614*" для того же результата.

Единственное, в чем я уверен, так это в том, что номер будет начинаться с 614 и будет иметь множество комбинаций.

Проблема с типом данных? Пробелы - это строки, а числа - это числа? Был только один блог, в котором немного затрагивалась эта проблема и, похоже, было указано, что я не могу использовать подстановочные знаки в этом случае. Это верно?

По сути, это австралийские мобильные номера, поэтому они имеют длину 11 символов, причем только первые 3 являются постоянными. Вот почему я действительно хочу использовать подстановочный знак для поиска этих записей. Мне нужно исключить их и пробелы из набора данных. Согласно вашим ответам и тому, что я в значительной степени начал понимать, мой единственный выбор - преобразовать числа в строки, если я хочу сделать это как одноэтапный процесс. Это повлияет на более поздний код. Я предполагаю, что это нельзя сделать как часть критериев автофильтра (принятие желаемого за действительное)?


person JCarson    schedule 21.05.2015    source источник
comment
Вы не можете использовать подстановочные знаки, если данные на самом деле хранятся в виде чисел, что, похоже, так и есть. Все числа четырехзначные?   -  person Rory    schedule 21.05.2015
comment
Что представляет собой разнообразие следующих комбинаций? Вы можете преобразовать числа в текст, если хотите найти опцию Starts With. Или найдите числа 6140<=x<=6149.   -  person Byron Wall    schedule 21.05.2015


Ответы (2)


Каждый раз, когда вы сталкиваетесь с ограничением на то, что вы можете делать с Range.AutoFilter метод, просто создайте словарь критериев соответствия, используя манипуляции с текстом, числами и/или датами VBA, и примените ключи словаря к операции автофильтра в виде массива.

Sub wildcard_Number_Filter()
    Dim a As Long, aTMPs As Variant, dVALs As Object

    Set dVALs = CreateObject("Scripting.Dictionary")
    dVALs.CompareMode = vbTextCompare

    With Worksheets("Sheet1")
        If .AutoFilterMode Then .AutoFilterMode = False
        With .Cells(1, 1).CurrentRegion
            'build a dictionary so the keys can be used as the array filter
            aTMPs = .Columns(2).Cells.Value2
            For a = LBound(aTMPs, 1) + 1 To UBound(aTMPs, 1)
                Select Case True
                    Case Not CBool(Len(aTMPs(a, 1)))
                        dVALs.Item(Chr(61)) = Chr(61)   'blanks
                    Case CStr(aTMPs(a, 1)) Like "614*"
                        'The set of numbers have to be strings in the array
                        If Not dVALs.Exists(aTMPs(a, 1)) Then _
                            dVALs.Add Key:=CStr(aTMPs(a, 1)), Item:=aTMPs(a, 1)
                    Case Else
                        'no match. do nothing
                End Select
            Next a

            'test the array
            'Dim k As Variant
            'For Each k In dVALs.Keys
            '    Debug.Print k & " - " & dVALs.Item(k)
            'Next k

            'filter on column B if dictionary keys exist
            If CBool(dVALs.Count) Then _
                .AutoFilter Field:=2, Criteria1:=dVALs.Keys, _
                                      Operator:=xlFilterValues, VisibleDropDown:=False

            'data is filtered on 614* and blanks (column B)
            'Perform work on filtered data here

        End With
        If .AutoFilterMode Then .AutoFilterMode = False
    End With

    dVALs.RemoveAll: Set dVALs = Nothing
End Sub

Используя этот метод, любые манипуляции, которые вы можете выполнять со значениями, чтобы проверить их на включение или исключение с помощью стандартных методов VBA, могут создать допустимый массив, который будет использоваться в качестве набора фильтров. Благодаря массовой загрузке значений из рабочего листа в массив вариантов время на чтение и оценку отдельных ячеек практически отсутствует.

number_Wildcards_Filter_before
            Перед построением и применением фильтра

number_Wildcards_Filter_after
            После применения фильтра

person Community    schedule 16.01.2016
comment
Отличный ответ, только что использованный с минимальными изменениями :) - person Shai Rado; 13.08.2017

Рассмотрите возможность добавления ' в каждый из ваших данных.

Example :
100 => '100
person Eric K.    schedule 01.12.2015