Поиск данных по всем листам

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

Проблема такая. Я не знаю как написать программу на поиск. существует книга в ней 12 листов.
На главном меню есть кнопка поиск.при нажатии выводить форма куда пользователь вводит часть предположении или цифру. Нашла программупо поиску.но в ней проблема в том что она сразу перебрасывает пользователя на ячейку с похожим словом.а мне необходимо что пользователь выбирал из предложенного поиска и его перебрасывали на эту ячейку.так сказать.

Код: Выделить всё

Sub bb()
Dim ac As Range
Set ac = ActiveCell
Worksheets.Select
Range("C:C,I:I,O:O").Select
On Error Resume Next
Selection.Find(InputBox("Введите слово"), , xlFormulas, xlPart).Select
If Err Then
  ac.Parent.Activate
  ac.Select
  MsgBox "Не найдено"
End If
End Sub
_____
у меня была уже идея Создала форму.поместила TextBox и ListBox. и кнопку. думаю пользователь вводит часть слова и результат поиска выводиться на ListBox.но не знаю как ее осуществить.
Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

НАподоби этого необходимо мне.Но эта программа ищет только на одном листе

Код: Выделить всё

Private Sub ListBox1_Click()
    If ListBox1.ListIndex = -1 Then Exit Sub
    Cells(ListBox1.Value, 1).Select
End Sub

Код: Выделить всё

Private Sub TextBox1_Change()
Dim j As Long, i As Long
ListBox1.Clear
'при отсутствии символов для поиска - выход
   If Len(TextBox1.Value) = 0 Then Exit Sub   
   j = 0
'для одного символа поиск осуществляем по первой букве
If Len(TextBox1.Value) = 1 Then
    For i = 7 To Cells(Rows.Count, 1).End(xlUp).Row
        If UCase(Left(Cells(i, 1), 1)) = UCase(TextBox1.Value) Then
            ListBox1.AddItem i
            ListBox1.List(j, 1) = Cells(i, 1)
            j = j + 1
        End If
    Next i
    'если найден только один эл-т, то переходим к нему
    If j = 1 Then Cells(ListBox1.List(0, 0), 1).Select
    Exit Sub
End If 
For i = 7 To Cells(Rows.Count, 1).End(xlUp).Row
    If InStr(1, UCase(Cells(i, 1)), UCase(TextBox1.Value)) > 0 Then
       ListBox1.AddItem i
       ListBox1.List(j, 1) = Cells(i, 1)
       j = j + 1
    End If
Next i
   'если найден только один эл-т, то переходим к нему
   If j = 1 Then Cells(ListBox1.List(0, 0), 1).Select
End Sub
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Код: Выделить всё

Private Sub TextBox1_Change()
    ListBox1.Clear
    
    Dim iText$, iAddress$, iCount&, iList As Worksheet, iCell As Range
    iText = TextBox1.Value
    
    If iText <> "" Then 'If Len(iText) > 0
       For Each iList In ThisWorkbook.Worksheets
           Set iCell = iList.UsedRange.Find(iText, , xlValues, xlPart)
           If Not iCell Is Nothing Then
              iAddress = iCell.Address
              Do
                   ListBox1.AddItem
                   ListBox1.List(iCount, 0) = iCell.Value
                   ListBox1.List(iCount, 1) = iCell.Address(, , , True)
                   iCount = iCount + 1
                   Set iCell = iList.UsedRange.FindNext(iCell)
              Loop While iCell.Address <> iAddress
           End If
       Next
    End If
End Sub

Private Sub ListBox1_Click()
    If ListBox1.ListIndex > -1 Then
       Application.Goto Application.Range(ListBox1.List(ListBox1.ListIndex, 1))
    End If
End Sub
P.S. Если ячеек, где осуществляется поиск, слишком много и сам процесс поиска будет занимать ощутимое время, то имеет смысл добавить кнопку и искать только после её нажатия, в противном случае, можно ограничиться двумя элементами управления TextBox1 и ListBox1
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Искать циклом очень плохо. Надо продолжать делать тот де самый Selection.Find/FindNext, только отключить обновление экрана пока крутится цикл.
И, кстати, метод Find ищет по всем выделенным листам, а не только по текущему.
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Какой смысл отключать обновление экрана, применительно к моему примеру ?

Да, и поиск по всем выделенным листам, это не секрет, только зачем нам выделять листы ... только для того, чтобы избавиться от цикла ? что мы выигрываем ? ведь цикл всё равно будет, либо наш, либо тот, что осуществит метод Find
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

А Find разве не двигает курсор?

В Вашем примере я не заметил Find — невнимательно прочитал код. Сорри.
Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

Всё работает.но все равно что то не то.пользователю не удобко будет осуществлять поиск.а если попыться по столбцам сузить поиск.чтобы было по всем листам но по столбцам C,I,O
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Такая ошибка возникает, если в модуле формы уже наличествует событие ListBox1_Click()

Да, и не нужно цитировать всё сообщение целиком, ибо это излишне.

P.S. Может имеет смысл не сразу писать на форум, а немного подумать самостоятельно, и тогда решение будет найдено без посторонней помощи :)

касаемо нового вопроса, просто замените UsedRange на Range("C:C,I:I,O:O")
Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

я уже поняла :rolleyes: извините я тут новичок.пока не могу разобраться что тут к чему
Настя Белова
Сообщения: 31
Зарегистрирован: 28 мар 2014, 13:17

ну извините что я такая глупенькая.и не внимательная. и я меня. как Вы и сказали UsedRange на Range. но у меня ошибка
Ответить