2016-10-12 4 views
-1

У меня есть лист Excel со всеми SKU в нашем инвентаре. Есть около 1300 записей. У единиц SKU одинаковые номера с небольшими вариантами цвета и т. Д.Excel Macros - FindAll и разрешить пользователю выбирать результат

У меня уже есть код, который найдет строку, введенную пользователем. Мой вопрос заключается в том, как представить список пользователю и позволить ему выбрать один SKU, который я могу использовать для ввода.

Например, представьте себе мою базу данных как:

Shirt-red 
Shirt-Blue 
Shirt-Pink 
Trouser-red 
Trouser-blue 

Если пользователь вводит строку Рубашку я хочу представить пользователю рубашка-красный, рубашка-синий & рубашка-розовый и позволяет пользователю выбрать один из 3 вариантов, которые я буду использовать для дальнейшей обработки

Благодаря

+1

Выполните цикл поиска и добавление каждого результата в ListBox, то пользователь может быстро просмотреть все результаты и выберите элемент из списка. Если это предпочтительнее, список может быть установлен на MultiSelect, чтобы можно было выбрать более одного результата. (Хотя предполагается, что вы используете Userform, который я рекомендую для чего-то подобного) – tigeravatar

+0

Я уже пробовал это. Я добавил список в соответствии с: http://www.excel-easy.com/vba/examples/list-box.html Но этот список всегда отображается на листе. Я хочу, чтобы пользовательский эксперимент был похож на find all in excel. Результаты отображаются, выбираются пользователем, а затем окно списка исчезает. Также в списке нет кнопок отмены. Что произойдет, если кто-то войдет в неправильную строку поиска, будет представлен с результатами, но не сможет отменить и повторить попытку. – HamzaR

+0

Просьба уточнить ваш вопрос с помощью * конкретной инструкции о проблеме, предпочтительно также включая ваш код (минимальную сумму, необходимую для репликации вашей проблемы) , –

ответ

2

для руководства о том, как создать базовую UserForm, вот text tutorial и video tutorial.

Обратите внимание, что на UserForm вы создаете, я предлагаю следующие имена элементов управления:

  • Textbox: txtFind
  • кнопка Поиск: btnFind
  • Listbox: listResults

После у вас есть ваша пользовательская форма с текстовым полем, которое пользователь может ввести для того, что они хотят найти, кнопкой поиска и списком, вы бы нам е этот код для вашей кнопки Find:

Private Sub btnFind_Click() 

    Dim ws As Worksheet 
    Dim aData As Variant 
    Dim vData As Variant 
    Dim aResults() As Variant 
    Dim lIndex As Long 
    Dim sFind As String 

    Set ws = ActiveWorkbook.ActiveSheet 
    sFind = Me.txtFind.Text 
    Me.listResults.Clear 

    With ws.Range("A2", ws.Cells(ws.Rows.Count, "A").End(xlUp)) 
     If .Row < 2 Then 
      Me.txtFind.SetFocus 
      MsgBox "No data in " & ws.Name 
      Exit Sub 
     End If 
     aData = .Value 
     ReDim aResults(1 To WorksheetFunction.CountIf(.Cells, "*" & sFind & "*"), 1 To 1) 
    End With 

    lIndex = 0 
    For Each vData In aData 
     If InStr(1, vData, sFind, vbTextCompare) > 0 Then 
      lIndex = lIndex + 1 
      aResults(lIndex, 1) = vData 
     End If 
    Next vData 

    If lIndex > 0 Then Me.listResults.List = aResults 

End Sub 
+0

В качестве побочного примечания причина, по которой я перебираю массив вместо использования Find Loop, заключается в том, что в общем случае итерация по массиву будет намного быстрее, чем Find Loop. – tigeravatar

+0

не будет '' .Row <2 Then' be 'If .Rows.Count <2 Then'? – user3598756

+0

Нет, потому что предполагается, что строка 1 является строкой заголовка, и если в столбце A нет данных, диапазон будет A2: A1, который по-прежнему приводит к .rows.count из 2, но .row будет 1, потому что это это начальная строка, указывающая, что в столбце A. ничего не было найдено. – tigeravatar

Смежные вопросы