Фильтровать столбец Excel для ячеек, содержащих различные комбинации символов - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь отфильтровать диапазон в Excel, скажем, DATA, основываясь на том, что ячейки в другом столбце, например, отмечены флажками CHECKBOXES.Это будет выглядеть примерно так:

ДАННЫЕ
aa
ab
ac
ba
bb
bc
ca
cb
cc

БЛОКИРОВКИ
a [x]
b [x]
c [x]

Таким образом, если в столбце CHECKBOXES проверено «a», в столбце DATA будут отображаться ячейки, содержащие только букву a, а не «b» или «c».Но если были отмечены «a» и «b», в столбце «ДАННЫЕ» будут отображаться ячейки, которые содержат либо буквы a ИЛИ b, но не «c».Если бы все три «a», «b» и «c» были проверены, очевидно, что никакой фильтрации не требовалось.

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

Ответы [ 2 ]

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

Вы не можете сделать это так, как вы описали.

  1. Для фильтрации требуется заголовок столбца.Данные должны начинаться со строки 2, а не со строки 1.
  2. Фильтрация или скрытие могут выполняться только для полных строк или полных столбцов.Если бы A были скрыты, ваши флажки в C1: C3 также были бы скрыты.

Переосмыслите ваше предложение и попытайтесь найти что-то для решения проблемы.Если у вас возникнут проблемы, отредактируйте свое сообщение, добавив в него новые данные.

, если в столбце CHECKBOXES отмечен «a», в столбце DATA будут отображаться ячейки, содержащие только букву a, а не «b».'или' c '.Но если бы были отмечены «a» и «b», в столбце «ДАННЫЕ» были бы показаны ячейки, содержащие либо буквы a OR b, но не «c».Если бы все три «a», «b» и «c» были проверены, то, очевидно, не было бы необходимости в какой-либо фильтрации.

Вот метод, который работает.

  • Используйте Developer, Controls, Insert для добавления трех ActiveX флажков . не добавьте флажки управления формой и не добавьте дополнительные кнопки любого типа.
  • По одной щелкните правой кнопкой мыши флажки ActiveX и получить доступ к свойствам.Измените имена на CheckBoxA, CheckBoxB и CheckBoxC и заголовки на A, B и C .
  • Изменить размерустановите соответствующие флажки и разместите их в верхнем ряду, где они не будут скрыты фильтрацией значений.Когда вы будете довольны результатами, нажмите «Разработчик», «Элементы управления», «Режим разработки», чтобы выйти из режима разработки.
  • Щелкните правой кнопкой мыши на вкладке имени листа и выберите «Просмотреть код».Вставьте следующее.

    Option Explicit
    
    Sub CheckBoxABC_Click()
    
        Dim i As Long, dict As Object, str As String
    
        Set dict = CreateObject("scripting.dictionary")
        dict.comparemode = vbTextCompare
    
        If AutoFilterMode Then AutoFilterMode = False
    
        With Range(Cells(1, "A"), Cells(Rows.Count, "A").End(xlUp))
    
            For i = 2 To .Rows.Count
                'store the cell value
                str = .Cells(i, "A").Value
    
                'see if it might belong and add it
                If CBool(InStr(1, str, "A", vbTextCompare)) And .Parent.CheckBoxA Then _
                    dict.Item(str) = vbNullString
                If CBool(InStr(1, str, "B", vbTextCompare)) And .Parent.CheckBoxB Then _
                    dict.Item(str) = vbNullString
                If CBool(InStr(1, str, "C", vbTextCompare)) And .Parent.CheckBoxC Then _
                    dict.Item(str) = vbNullString
    
                'see if it doesn't belong and remove it
                If dict.Exists(str) And CBool(InStr(1, str, "A", vbTextCompare)) And Not .Parent.CheckBoxA Then _
                    dict.Remove str
                If dict.Exists(str) And CBool(InStr(1, str, "B", vbTextCompare)) And Not .Parent.CheckBoxB Then _
                    dict.Remove str
                If dict.Exists(str) And CBool(InStr(1, str, "C", vbTextCompare)) And Not .Parent.CheckBoxC Then _
                    dict.Remove str
    
            Next i
    
            If dict.Count > 0 Then
                .AutoFilter field:=1, Criteria1:=dict.keys, Operator:=xlFilterValues, VisibleDropDown:=False
            Else
                .AutoFilter field:=1, Criteria1:="Z", VisibleDropDown:=False
            End If
    
        End With
    End Sub
    
    Private Sub CheckBoxA_Click()
        CheckBoxABC_Click
    End Sub
    
    Private Sub CheckBoxB_Click()
        CheckBoxABC_Click
    End Sub
    
    Private Sub CheckBoxC_Click()
        CheckBoxABC_Click
    End Sub
    
  • Ваши результаты должны быть похожи на следующие.

enter image description here

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

Ну, это можно сделать несколькими разными способами.Тем не менее, это один из способов, которым вы можете сделать то, что вы пытаетесь сделать.Создайте три флажка с помощью режима разработки на вкладке разработчика, а затем просто назначьте 3 макроса для выполнения 3 разных кнопок.Вы также можете просто создать одну подпрограмму, а затем просто выполнить эту подпрограмму (макрос).Это действительно зависит от вас.

 Sub OptionButton1_Click()

 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=a*", _
        Operator:=xlAnd

End Sub

Sub OptionButton2_Click()
 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=b*", _
        Operator:=xlAnd
End Sub

Sub option3_click()
 Range("A1").Select
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$A$10").AutoFilter Field:=1, Criteria1:="=c*", _
        Operator:=xlAnd
End Sub

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...