Найти и отфильтровать по строковому значению - PullRequest
0 голосов
/ 09 января 2020

Я получаю отчет об организации работы и хочу найти и отфильтровать по уникальному значению идентификатора. Уникальный фильтруемый идентификатор определяется свойством publi c (этот номер используется в другом случае, поэтому он публикуется c), вводимым через текстовое поле в пользовательской форме.

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

Существует 9 различных уровней менеджера, по которым я фильтрую, столбцы AU, AW, AY, BA, B C , BE, BG, BI и BK, и все они располагаются в строке 3. Поэтому у меня есть столбцы «A3: BK3», но я выполняю фильтрацию только между «AU3: BK3» для извлечения данных из более ранних столбцов.


++++++Open File Dialog:

```
Private Sub SelectButton_Click()

Dim SelectedFile As String

    SelectedFile = Application.GetOpenFilename()

    SelectedFiletxtbox = SelectedFile

End Sub
```

++++++Public Property Code:

```
Public Property Get OpenFileTxt() As String

    OpenFileTxt = SelectedFiletxtbox.Value

End Property
```

++++++Execution Piece:

```
Private Sub EmailButton_Click()

    'Workbooks.Open OpenFile

Application.ScreenUpdating = False

    If Len(Trim(Me.EnterWWIDtxtbox.Text)) = 0 Then
        Me.EnterWWIDtxtbox.SetFocus
        MsgBox "Must provide a Unique ID"
        Exit Sub
    End If

    'WWID = Trim(Me.EnterWWIDtxtbox.Text)

    'Path to be pulled from open file dialog as reports are dynamic
    Dim ws As Worksheet
    Dim wb As Workbook
    Set wb = Workbooks.Open(Filename:=OpenFileTxt)
    Set ws = wb.Worksheets("Sheet1")


    Dim aColumns() As String
    aColumns = Split("AU,AW,AY,BA,BC,BE,BG,BI,BK", ",")

    Dim bFound As Boolean
    bFound = False

    Dim rFound As Range
    Dim vColumn As Variant
    For Each vColumn In aColumns
        Set rFound = ws.Columns(vColumn).Find(WWID, , xlValues, xlPart)
        If Not rFound Is Nothing Then
            bFound = True
            MsgBox "Found [" & WWID & "] in column " & vColumn
            With ws.Columns(vColumn)
                .AutoFilter 1, rFound.Value

                MsgBox "filtered"
                'Do stuff with the filtered data here

            End With
            Exit For
        End If
    Next vColumn

    If bFound = False Then MsgBox "Unique ID [" & WWID & "] not found"

'Filter by Region Selected

'Range("AG3").AutoFilter Field:=33, Criteria1:=Region

Unload DistrUserForm

'Open E-Mail

Application.ScreenUpdating = True

End Sub
```

1 Ответ

1 голос
/ 09 января 2020

Я создал тестовую книгу для этого и заполнил ее ненужными данными. Затем я создал базовую пользовательскую форму c, в которой было только текстовое поле (с именем txtUniqueID) и кнопка (с именем CommandButton1). Ввели искомый идентификатор в текстовое поле и нажали кнопку, чтобы запустить поиск и фильтр, если он найден. Проверено, это работает как задумано. Вы должны быть в состоянии приспособить это к вашим потребностям. Вот полный код пользовательской формы. Обратите внимание на Dim WWID As Variant в верхней части внешнего элемента, так как вы сказали, что это переменная publi c (это также могло быть в стандартном модуле, и вместо Dim это было бы Public, я просто сделал это для удобства тестирования).

Dim WWID As Variant

Private Sub CommandButton1_Click()

    If Len(Trim(Me.txtUniqueID.Text)) = 0 Then
        Me.txtUniqueID.SetFocus
        MsgBox "Must provide a Unique ID"
        Exit Sub
    End If

    WWID = Trim(Me.txtUniqueID.Text)

    'Explicitly define your workbook and worksheet where the data is
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    Dim aColumns() As String
    aColumns = Split("AU,AW,AY,BA,BC,BE,BG,BI,BK", ",")

    Dim bFound As Boolean
    bFound = False

    Dim rFound As Range
    Dim vColumn As Variant
    For Each vColumn In aColumns
        Set rFound = ws.Columns(vColumn).Find(WWID, , xlValues, xlPart)
        If Not rFound Is Nothing Then
            bFound = True
            MsgBox "Found [" & WWID & "] in column " & vColumn
            With ws.Columns(vColumn)
                .AutoFilter 1, rFound.Value

                MsgBox "filtered"
                'Do stuff with the filtered data here

                .AutoFilter 'Remove filter afterwards
            End With
            Exit For
        End If
    Next vColumn

    If bFound = False Then MsgBox "Unique ID [" & WWID & "] not found"

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