Динамический поиск точных и частичных совпадений в Excel с помощью кнопок выбора - PullRequest
0 голосов
/ 20 марта 2019

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

Любая помощь, где я могу изменить код ниже?

Sub SearchBox()

Dim myButton As OptionButton
Dim SearchString As String
Dim ButtonName As String
Dim sht As Worksheet
Dim myField As Long
Dim DataRange As Range
Dim mySearch As Variant

'Load Sheet into A Variable
  Set sht = ActiveSheet

'Unfilter Data (if necessary)
  On Error Resume Next
    sht.ShowAllData
  On Error GoTo 0

'Filtered Data Range (include column heading cells)
  'Set DataRange = sht.Range("E5:H200") 'Cell Range
   Set DataRange = sht.ListObjects("Table1").Range 'Table

'Retrieve User's Search Input
  'mySearch = sht.Shapes("UserSearch").TextFrame.Characters.Text 'Control Form
  mySearch = sht.OLEObjects("Hello").Object.Text 'ActiveX Control
  'mySearch = sht.Range("A1").Value 'Cell Input

'Determine if user is searching for number or text
  If IsNumeric(mySearch) = True Then
    SearchString = "=" & mySearch
  Else

  'change this to =* if you want to search for anything that containts mysearch rather than just mysearch
    SearchString = "=*" & mySearch & "*"

    End If

'Loop Through Option Buttons
  For Each myButton In sht.OptionButtons
    If myButton.Value = 1 Then
      ButtonName = myButton.Text
      Exit For
    End If
  Next myButton

'Determine Filter Field
  On Error GoTo HeadingNotFound
    myField = Application.WorksheetFunction.Match(ButtonName, DataRange.Rows(1), 0)
  On Error GoTo 0

'Filter Data
  DataRange.AutoFilter _
    Field:=myField, _
    Criteria1:=SearchString, _
    Operator:=xlAnd

'Clear Search Field
  'sht.Shapes("UserSearch").TextFrame.Characters.Text = "" 'Control Form
  sht.OLEObjects("Hello").Object.Text = "" 'ActiveX Control
  'sht.Range("A1").Value = "" 'Cell Input

Exit Sub

'ERROR HANDLERS
HeadingNotFound:
  MsgBox "The column heading [" & ButtonName & "] was not found in cells " & DataRange.Rows(1).Address & ". " & _
    vbNewLine & "Please check for possible typos.", vbCritical, "Header Name Not Found!"

End Sub


Sub ClearFilter()
'PURPOSE: Clear all filter rules

'Clear filters on ActiveSheet
  On Error Resume Next
  ActiveSheet.ListObjects(1).AutoFilter.ShowAllData

  On Error GoTo 0

End Sub

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

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

Function getSearchString(searchVal as variant, searchFieldName as string)
    If IsNumeric(searchVal) Then
        getSearchString = "=" & searchVal 
    ElseIf searchFieldName = "MyField1" _
        Or searchFieldName = "MyField2" _
        Or (... List all fields where you want to search partial) Then
        getSearchString = "=*" & searchVal & "*"
    Else
        getSearchString = "=" & searchVal
    End If
End Function

Вы вызываете функцию после установки переменной ButtonName.

    searchStr = getSearchString(mySearch, ButtonName)

(вы, конечно, можете подумать оболее сложный способ определить, следует ли использовать частичный поиск или нет, или, возможно, добавить CheckBox, чтобы позволить пользователю выбрать)

0 голосов
/ 20 марта 2019

Измените и попробуйте следующее:

Option Explicit

Sub test()

    Dim ws As Worksheet
    Dim SearchValue As String, FullReport As String
    Dim rng As Range, cell As Range

    'What i m looking for
    SearchValue = "Test"

    'Where to look for
    Set rng = ThisWorkbook.Worksheets("Sheet1").UsedRange

    For Each cell In rng

        If cell.Value = SearchValue Then
            If FullReport = "" Then
                FullReport = "The word " & SearchValue & " appears in " & "Column " & cell.Column & ", Row " & cell.Row & "."
            Else
                FullReport = FullReport & vbNewLine & "The word " & SearchValue & " appears in " & "Column " & cell.Column & ", Row " & cell.Row & "."
            End If
        End If

    Next cell

    MsgBox FullReport

End Sub
...