Объедините ячейки в строку, чтобы они были доступны для поиска с помощью поля ввода

#excel #vba #input #multiple-columns

#excel #vba #входные данные #многоколоночный

Вопрос:

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

Мы создаем систему для использования ручного сканера со штрих-кодами, содержащими имена сотрудников, в целях отслеживания тестирования на COVID.

В нашей книге есть один столбец для имени, один для последнего.

Итак, B2 = Cluff, C2 = Aaron

Как мне использовать поле ввода (для сканера), которое выполняет поиск в строке «Cluff, Aaron» (пользовательский ввод в поле, а не имя конкретно в коде) и возвращает строку с данными выше?

Бонусные баллы, если откроется новое поле ввода для ввода тестового UPC (другой ввод, ищущий строку) и ввод в столбец AA в той же строке.

Мои знания VBA очень ограничены.

Я пробовал различные изменения в следующем коде:

 Sub DualFind()

    Dim vFind1 As String, vFind2 As String
    Dim rFound As Range, lLoop As Long
    Dim bFound As Boolean
    Dim rLookIn1 As Range, rLookIn2 As Range

    vFind1 = InputBox("Find What: First value?", "FIND FIRST VALUE")
    If vFind1 = vbNullString Then Exit Sub

    vFind2 = InputBox("Find What: Second value?", "FIND SECOND VALUE")
    If vFind2 = vbNullString Then Exit Sub

    If Selection.Areas.Count > 1 Then
        Set rLookIn1 = Selection.Areas(1).Columns(1)
        Set rLookIn2 = Selection.Areas(2).Columns(1)
    Else
        Set rLookIn1 = Selection.Columns(1)
        Set rLookIn2 = Selection.Columns(2)
    End If

    Set rFound = rLookIn1.Cells(1, 1)
    For lLoop = 1 To WorksheetFunction.CountIf(rLookIn1, vFind1)
        Set rFound = rLookIn1.Find(What:=vFind1, After:=rFound, LookAt:=xlWhole)
        If UCase(rLookIn2.Cells(rFound.Row, 1)) = UCase(vFind2) Then
            bFound = True
            Exit For
        End If
    Next lLoop

    If bFound = True Then
        MsgBox "Match found", vbInformation, "ozgrid.com"
        Range(rFound, rLookIn2.Cells(rFound.Row, 1)).Select
    Else
        MsgBox "Sorry, no match found", vbInformation, "ozgrid.com"
    End If

End Sub
 

Насколько я понимаю, для поиска по столбцам требуется два отдельных ввода. Мне это нужно для поиска по двум столбцам с одним вводом. Я полагаю, вам нужно было бы скомпилировать столбцы B и C в строку, а затем выполнить поиск на основе ввода из поля.

Комментарии:

1. Вместо того чтобы пытаться объединить два столбца в одну строку, вы могли бы просто использовать Split и Trim для введенного имени, указав имя и фамилию. Тогда я бы просто использовал Variant массив — прочитал оба столбца в массив, перебрал строки, и если оба столбца совпадают с именем и фамилией, у вас есть совпадение строк.

2. Хорошо, я попробую. Спасибо за ввод! Если у меня получится, я дам вам знать.

3. Или разделить, как говорит БигБен, а затем установить фильтр для таблицы

Ответ №1:

Не совсем уверен, что это то, что вам нужно, но, надеюсь, это, по крайней мере, даст вам еще несколько идей. Я написал это так, чтобы пользователь вводил имя поиска в формате [имя] [фамилия], например, Аарон Клафф. Из того, что вы написали, я предположил, что фамилия находится в столбце 2, а имя — в столбце 3.

 Sub Demo()
    Dim SearchName As String
    Dim UPC As String
    Dim LastRow As Long
    Dim Row As Long
    Dim RowMatch As Long
    Dim ColFirstName As Integer
    Dim ColLastName As Integer
    
    ColLastName = 2
    ColFirstName = 3
    
    SearchName = InputBox("Enter search name:  e.g. Aaron Cuff", "Search")

    If SearchName = "" Then Exit Sub
    
    SearchName = Trim(SearchName)
    
    LastRow = Cells(Rows.Count, ColLastName).End(xlUp).Row
    
    For Row = 1 To LastRow
        If StrComp(SearchName, Trim(Cells(Row, ColFirstName)) amp; " " amp; Trim(Cells(Row, ColLastName)), vbTextCompare) = 0 Then
            RowMatch = Row
            Exit For
        End If
    Next
    
    If RowMatch = 0 Then
        MsgBox "Search Name: " amp; StrConv(SearchName, vbProperCase) amp; vbNewLine amp; vbNewLine amp; _
               "No Match Found", vbInformation, "Search Result"
        Exit Sub
    End If
    
    UPC = InputBox("Enter Test UPC for " amp; StrConv(SearchName, vbProperCase) amp; ": ", "Input")
    
    If UPC <> "" Then
        Cells(RowMatch, "AA") = UPC
    End If
End Sub
 

Комментарии:

1. Спасибо! Он делает то, что мне было нужно! Единственное изменение, которое я бы внес, — это как мне учитывать специальные символы? Более конкретно, исключить их? Я представляю себе его разделенную функцию, но не уверен, как это будет выглядеть, встроенное в приведенный выше код. Ты крут!

2. Я должен быть в состоянии обновить его достаточно легко. Не могли бы вы просто уточнить, что вы подразумеваете под специальными символами и является ли это чем-то, что пользователь вводит в первое поле ввода и / или находит в данных имени в электронной таблице? Можете ли вы привести пример?

3. Конечно! Мне это нужно, чтобы исключить пробелы, запятые, точки и тире » , . -» на всякий случай, если они есть в именах. По сути, имена указаны в штрих-кодах как «Клафф, Аарон», но я бы хотел, чтобы он мог обрабатывать «Смит-Джонс, Джой» или «Хичкок, Альфред А.», Если они есть в списке. Если это имеет смысл. Все имена составлены, примите за мои, если кому-то нужно это знать: P

4. Tbh Меня смутили упоминания о штрих-кодах и сканерах. С первым полем ввода, которое запрашивает имя поиска, вводится ли значение кем-то вручную или вводится каким-либо другим способом? Вводится ли значение (в поле ввода) в формате «Cluff, Aaron» или оно также может быть введено как «Aaron Cluff»? Когда вы говорите, что хотели бы, чтобы он мог обрабатывать «Хичкок, Альфред А.», Как это имя будет выглядеть в электронной таблице (например, будет ли оно без точки?). Возможно, вы могли бы обновить свой пост подробным объяснением, включая примеры, чтобы я знал, как изменить код. Спасибо

5. Эй, чувак, я ценю помощь. Не беспокойтесь о последнем запросе. Я могу переформатировать способ чтения имен, чтобы исключить специальные символы. Спасибо за все

Ответ №2:

Вот один из способов выполнить поиск имени сотрудника:

 Dim ws As Worksheet
Dim rng As Range, m, staffName

Set ws = Worksheets("Staff")

staffName = "Cluff, Aaron"

m = ws.Evaluate("MATCH(""" amp; staffName amp; """,A1:A1000 amp; "", "" amp;B1:B1000,0)")

If Not IsError(m) Then
    Debug.Print "Matched on row " amp; m
Else
    Debug.Print "No match for " amp; staffName
End If