Страница 1 из 2
Поиск данных по всем листам
Добавлено: 28 мар 2014, 13:30
Настя Белова
Проблема такая. Я не знаю как написать программу на поиск. существует книга в ней 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.но не знаю как ее осуществить.
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 14:42
Настя Белова
НАподоби этого необходимо мне.Но эта программа ищет только на одном листе
Код: Выделить всё
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
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 17:09
pashulka
Код: Выделить всё
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
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 17:40
Naeel Maqsudov
Искать циклом очень плохо. Надо продолжать делать тот де самый Selection.Find/FindNext, только отключить обновление экрана пока крутится цикл.
И, кстати, метод Find ищет по всем выделенным листам, а не только по текущему.
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 17:54
pashulka
Какой смысл отключать обновление экрана, применительно к моему примеру ?
Да, и поиск по всем выделенным листам, это не секрет, только зачем нам выделять листы ... только для того, чтобы избавиться от цикла ? что мы выигрываем ? ведь цикл всё равно будет, либо наш, либо тот, что осуществит метод Find
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 18:14
Naeel Maqsudov
А Find разве не двигает курсор?
В Вашем примере я не заметил Find — невнимательно прочитал код. Сорри.
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 19:48
Настя Белова
Всё работает.но все равно что то не то.пользователю не удобко будет осуществлять поиск.а если попыться по столбцам сузить поиск.чтобы было по всем листам но по столбцам C,I,O
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 19:55
pashulka
Такая ошибка возникает, если в модуле формы
уже наличествует событие ListBox1_Click()
Да, и не нужно цитировать всё сообщение целиком, ибо это излишне.
P.S. Может имеет смысл не сразу писать на форум, а немного подумать самостоятельно, и тогда решение будет найдено без посторонней помощи
касаемо нового вопроса, просто замените UsedRange на Range("C:C,I:I,O:O")
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 20:01
Настя Белова
я уже поняла

извините я тут новичок.пока не могу разобраться что тут к чему
Re: Поиск данных по всем листам
Добавлено: 28 мар 2014, 20:22
Настя Белова
ну извините что я такая глупенькая.и не внимательная. и я меня. как Вы и сказали UsedRange на Range. но у меня ошибка