Страницы: 1 2 След.
RSS
Как прикрутить функцию поиска в форму
 
Добрый день всем !

Нашел  функцию Function FindAll для поиска работает  - но как ее прикрутить в созданную форму для поиска в книге ?
 В форме
TextBox1 - вводим текст для поиска  
ListBox1   - выводятся результаты поиска со ссылками результатов

Пример с формой во вложении
Изменено: igrek2 - 21.01.2017 14:54:54
 
Если Вам нужно искать во всей книге (что следует из надписи на форме), то лучше уж "прикрутить" FindAllOnWorksheets. Пример ее использования есть в Вашем файле. Например так (в модуль формы)
Скрытый текст

Изменено: Sanja - 22.01.2017 00:08:50
Согласие есть продукт при полном непротивлении сторон
 
Спасибо за подсказку !
Доделал форму  (во вложении)  но возник еще один вопрос
Как сделать поиск по частичному совпадению текста в этой форме  - допустим ищем "Сидоров"  если набрали "Сид" в поиске   -  найдет и Сидоров и Сидаков ?
Изменено: igrek2 - 22.01.2017 01:21:50
 
Код
Me.TextBox1.Value & "*"

Может я еще до конца не понял весь гениальный задум этой формы поиска, но зачем дублировать Ctrl+F?
 
Посмотрите готовый макрос с таким функционалом
http://excelvba.ru/code/searchcells
 
Спасибо Dima S  за подсказку  - макрос доделал
Во вложении поправленный файл
Причины по которой делаю форму:
1.Ввести координатное выделение
2.Возможность привязать форму к заданной ячейке
3)Ctrl+F по условиям поиска каждый раз настраивать - введу потом в форму условия поиска - полное или частичное совпадение

Но еще один вопрос если можно:
Как избавится от кнопки Поиск - те искать сразу при появлении текста в поле поиска
по условию изменения значения в TextBox1 и исключении len > 0
Изменено: igrek2 - 22.01.2017 12:27:16
 
Цитата
igrek2 написал: те искать сразу при появлении текста
Как вы себе это представляете? Начали ввод - введи первую букву и сразу-же начался поиск? Он найдет Вам все слова, начинающиеся на эту букву
Согласие есть продукт при полном непротивлении сторон
 
думаю что ничего плохого тут нет - возникают ситуации когда ищешь по части слова приблизительно и на ходу меняешь текст   при этом каждый раз перебирать пуск по кнопке надо

Начали ввод - введи первую букву и сразу-же начался поиск? С этим согласен - тогда можно ввести ограничение - искать в случае простого набора в поле Значение поиска  только когда количество символов больше 3

те искать сразу при появлении текста в поле поиска по условию1 изменения значения в TextBox1 и по условию2  len > 3
Изменено: igrek2 - 22.01.2017 12:31:47
 
Цитата
igrek2 написал: думаю что ничего плохого тут нет
да никто и не говорит что это плохо
Цитата
igrek2 написал: ищешь по части слова приблизительно
сейчас у Вас ищет по части слова С НАЧАЛА слова (хотя может только такой поиск и нужен)
Цитата
igrek2 написал: искать сразу при появлении текста в поле поиска
У TextBox'а есть событие TextBox1_Change(). Отслеживайте в нем длину введенного текста и запускайте поиск
Изменено: Sanja - 22.01.2017 12:52:04
Согласие есть продукт при полном непротивлении сторон
 
работает благодарю !

только условия поиска нужно все равно править
пока ищет только в начале слова или словосочетания в ячейке (ранее проверял сначала только на еденичных словах в ячейках)  те в словосочетаниях в середине или в конце не ловит
те видимо надо так
1)Часть текста - поиск в любом месте части текста целого слова в любом месте словосочетания
"*" & Me.TextBox1.Value & "*"
2)Полный текст - поиск в любом месте полный текст  целого слова в любом месте словосочетания
доделал "*" & " " & Me.TextBox1.Value & " " & "*"     но вообще так надо ("*" & " " & Me.TextBox1.Value & " " & "*") Or (Me.TextBox1.Value & " " & "*") Or ("*" & " " & Me.TextBox1.Value)  но VBA не принимает так. Прописал так
Код
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value & " " & "*")
i = 0
For N = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(N) Is Nothing Then
        For Each FoundCell In FoundRanges(N).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, i) = FoundCell.Worksheet.Name
                .Column(1, i) = FoundCell.Address(False, False)
                .Column(2, i) = FoundCell.Value
                i = i + 1
            End With
        Next FoundCell
    End If
Next N
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, Me.TextBox1.Value & " " & "*")
t = 0
For F = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(F) Is Nothing Then
        For Each FoundCell In FoundRanges(F).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, t) = FoundCell.Worksheet.Name
                .Column(1, t) = FoundCell.Address(False, False)
                .Column(2, t) = FoundCell.Value
                t = t + 1
            End With
        Next FoundCell
    End If
Next F
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value)
j = 0
For O = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(O) Is Nothing Then
        For Each FoundCell In FoundRanges(O).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, j) = FoundCell.Worksheet.Name
                .Column(1, j) = FoundCell.Address(False, False)
                .Column(2, j) = FoundCell.Value
                j = j + 1
            End With
        Next FoundCell
    End If
Next O
Но так тоже не ищет текст- ловит только последний блок
"*" & " " & Me.TextBox1.Value

Как прописать все 3 условия в коде ?

Поправил файл

Осталась 2 доделки
- как прописать 3 условия на поиск полный текст
- при большой таблице поиск по части текста  - притормаживает набор текста в поле Значения поиска  - хотя везде поставил где можно Application.ScreenUpdating и прочее
Изменено: igrek2 - 23.01.2017 07:33:05
 
Уберите пробелы
Код
"*" & Me.TextBox1.Value & "*"
Согласие есть продукт при полном непротивлении сторон
 
если убрать пробелы - тогда целое слово не ловится (часть слова будет ловить)   у целого слова  в словосочетании всегда пробелы есть  
1.когда полный текст в середине словосочетания - пробелы справа слева "*" & " " & Me.TextBox1.Value & " " & "*"
2.полный текст в начале словосочетания  Me.TextBox1.Value & " " & "*"
3.полный текст в конце  словосочетания  "*" & " " & Me.TextBox1.Value

и как эти 3 условия  прописать в этой строке корректно вместо "*" & Me.TextBox1.Value & "*"
Код
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & Me.TextBox1.Value & "*")

или другое какое решение есть по этим условиям поиска ?
Изменено: igrek2 - 23.01.2017 11:44:50
 
добавьте на форму еще SpinOptBt с нужными условиями
Изменено: Sanja - 23.01.2017 11:50:06
Согласие есть продукт при полном непротивлении сторон
 
так добавлено уже  - частичное совпадение (OptBt - часть текста)  и полное совпадение слова (OptBt - полный текст) в последнем файле Книга9.xlsm (еще перевыложил)
Все работает токо в макросе (который в форме) надо поправить строку
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value & " " & "*")
и ввести 3 условия на место "*" & " " & Me.TextBox1.Value & " " & "*"


Код
Private Sub CommandButton1_Click()
Dim sSheets As String
Dim sRange As String
Dim Sh As Worksheet

'Ускоряем макросы блок
Application.ScreenUpdating = False 'чтоб не моргало выключаем скрин
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
    

'устанавливаем диапазон поиска
For Each Sh In Worksheets
    If sSheets <> Empty Then
        sSheets = sSheets & ":" & Sh.Name
    Else
        sSheets = Sh.Name
    End If
    If sRange = Empty Then
        sRange = Sh.UsedRange.Address
    ElseIf Range(sRange).Count < Sh.UsedRange.Count Then
        sRange = Sh.UsedRange.Address
    End If
Next
'стираем ListBox1 от старых значений
Me.ListBox1.Clear

'проверка TextBox1 пустой или нет
If Me.TextBox1.Value = "" Then
        MsgBox "Введите значения поиска !", vbOKOnly, "Сообщение"
        Exit Sub
        Else
        Me.ListBox1.Clear
        'Me.TextBox1.Value = Me.TextBox1.Value & "*"
        Me.TextBox1.Value = Me.TextBox1.Value
        'Me.TextBox1.Value & "*"
End If

'FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value & " " & "*") Or _
'FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, Me.TextBox1.Value & " " & "*") Or _
'FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value)

'FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, ("*" & " " & Me.TextBox1.Value & " " & "*") Or (Me.TextBox1.Value & " " & "*") Or ("*" & " " & Me.TextBox1.Value))

'FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value & " " & "*") And
'FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, Me.TextBox1.Value & " " & "*") And _
'FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value)
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, "*" & " " & Me.TextBox1.Value & " " & "*")
i = 0
For N = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(N) Is Nothing Then
        For Each FoundCell In FoundRanges(N).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, i) = FoundCell.Worksheet.Name
                .Column(1, i) = FoundCell.Address(False, False)
                .Column(2, i) = FoundCell.Value
                i = i + 1
            End With
        Next FoundCell
    End If
Next N


'проверка ListBox1 пустой или нет
If Me.ListBox1.ListCount = 0 Then
        'MsgBox "Ничего не найдено !"
        MsgBox "Ничего не найдено !", vbOKOnly, "Сообщение"
Else:
'раскрываем форму
ПоискФорма.Height = 528
'запускаем координатное выделение
Call Лист1.Selection1_On  'на клике на ссылку результатов поиска в Лист1
Call Лист2.Selection2_On  'на клике на ссылку результатов поиска в Лист2
Call Лист3.Selection3_On  'ввести на клике на ссылку результатов в Лист3
End If

'Снимаем ускорение макросов
Application.ScreenUpdating = True 'включаем скрин
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayStatusBar = True
Application.DisplayAlerts = True

End Sub
 
Цитата
igrek2 написал: так добавлено уже
Мало добавлено. Добавьте со ВСЕМИ нужными условиями (См. свойство Tag у OptBt)
Согласие есть продукт при полном непротивлении сторон
 
я про Tag ничего не знаю  но мысль вроде понял
1) Создаются дополнительные OptBt - 3 шт  в Начале  В середине В конце   у каждого свой Tag
2) В Tag основного OptBt  Полный текст   прописываются  таги дополнительных   OptBt
3) При включении OptBt  Полный текст   автоматом включаются дополнительные

Так ???
 
Посмотрите в файле. В коде TextBoxt_Change есть блок Select Case
Согласие есть продукт при полном непротивлении сторон
 
Чето запутали
в коде  Private Sub TextBox1_Change()   все нормально работает

на кнопку поиск надо 3 условия добавить
Private Sub CommandButton1_Click()

или так  в Case вставить все условия  ??  - и как их потом разделить Полный и Частичный поиск ?   Я в этом ниче не понимаю  такого опыта не было   только на примерах понимаю
Изменено: igrek2 - 23.01.2017 13:41:07
 
Ну перенесите эту часть кода туда где это нужно
Цитата
igrek2 написал: Чето запутали
я сам уже перестаю понимать что Вам нужно
Согласие есть продукт при полном непротивлении сторон
 
Что нужно

1)Поиск Часть текста  -  производится при наборе в TextBox1
Условие по OptionButton1 Часть текста - "*" & Me.TextBox1.Value & "*"
Прописано в Private Sub TextBox1_Change()
Все работает как надо

2)Поиск Полный текст  -  производится при нажатии CommandButton1 (кнопка Поиск)
Условия по OptionButton2  Полный  текст - (3 условия)
Код
"*" & " " & Me.TextBox1.Value & " " & "*" 
Me.TextBox1.Value & " " & "*" 
 "*" & " " & Me.TextBox1.Value 

Все 3 условия (с пробелами) должны одновременно работать при отмеченном OptionButton2
Прописано в Private Sub CommandButton1_Click()
Не работает тк не могу запихнуть в строку  FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange,.............
все 3 условия одновременно

Подскажите как можно эти 3 условия на поиск одновременно внести.
Изменено: igrek2 - 23.01.2017 14:34:54
 
Цитата
igrek2 написал: Подскажите как можно эти 3 условия на поиск одновременно внести
Посмотрите в коде TextBox1_Change. Вместо Me.TextBox1.Value используется переменная sText , значение которой присваивается в зависимости от того, какой из OptBt имеет значение True. Попробуйте эту часть кода перенести и адаптировать в CommandButton1_Click()
Код
...............................
'выполняем поиск
For Each Ctr In Me.Controls
    If TypeName(Ctr) = "OptionButton" Then
        If Ctr.Value = True Then
            Select Case Ctr.Tag
                Case "Начало"
                    sText = Me.TextBox1.Value & " " & "*"
                Case "Середина"
                    sText = "*" & " " & Me.TextBox1.Value & " " & "*"
                Case "Конец"
                    sText = "*" & " " & Me.TextBox1.Value
            End Select
            Exit For
        End If
    End If
Next
FoundRanges = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, sText)
.................................
Согласие есть продукт при полном непротивлении сторон
 
так сделал  но ничего не получилось  ругается на строку For N = LBound(FoundRanges) To UBound(FoundRanges)
Код
For Each Ctr In Me.Controls
    If TypeName(Ctr) = "OptionButton" Then
        If Ctr.Value = True Then
            Select Case Ctr.Tag
                Case "Начало"
                    sText1 = Me.TextBox1.Value & " " & "*"
                Case "Середина"
                    sText2 = "*" & " " & Me.TextBox1.Value & " " & "*"
                Case "Конец"
                    sText3 = "*" & " " & Me.TextBox1.Value
            End Select
            Exit For
        End If
    End If
Next
OptionButton1.Value = True
FoundRanges1 = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, sText1)
OptionButton2.Value = True
FoundRanges2 = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, sText2)
OptionButton3.Value = True
FoundRanges3 = FindAllOnWorksheets(ThisWorkbook, sSheets, sRange, sText3)

FoundRanges = Application.Sum(FoundRanges1, FoundRanges2, FoundRanges3)

i = 0
For N = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(N) Is Nothing Then
        For Each FoundCell In FoundRanges(N).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, i) = FoundCell.Worksheet.Name
                .Column(1, i) = FoundCell.Address(False, False)
                .Column(2, i) = FoundCell.Value
                i = i + 1
            End With
        Next FoundCell
    End If
Next N
Изменено: igrek2 - 23.01.2017 19:54:27
 
Цитата
igrek2 написал: FoundRanges = Application.Sum(
откуда взяться
Цитата
igrek2 написал: LBound(FoundRanges)
и
Цитата
igrek2 написал: UBound(FoundRanges)
 
Цитата
igrek2 написал: так сделал
Вы сделали НЕ так. Где у меня в коде Вы видели sText1(2,3)? Там ОДНА переменная и в зависимости от того, какой OptBt = True ей присваивается значение, которое затем используется как аргумент в функции FindAllOnWorksheets
А вот это вообще что?
Код
FoundRanges = Application.Sum(FoundRanges1, FoundRanges2, FoundRanges3)
Что Вы хотите получить сложив 3 диапазона? Наверное какое-то числовое значение. Тогда конечно LBound(FoundRanges) будет ошибку выдавать
P/S/ igrek2,  мне кажется Вы рано взялись за такой, довольно сложный, для новичка (если Вы новичек?) проект. Вам нужно изучить(повторить?) мат.часть
Согласие есть продукт при полном непротивлении сторон
 
Я новичек  - только примеры смотрю изменяю как могу под свою задачу. В вашем примере нужно каждый раз активировать  либо начало  OptBt1  либо середину OptBt2 либо конец OptBt3  и получать каждый раз свой результат. Но как сложить результаты в один ListBox1 единовременно обьединив 3 процедуры (результата) - не знаю
Изменено: igrek2 - 23.01.2017 20:11:01
 
Цитата
igrek2 написал: примеры смотрю изменяю как могу под свою задачу
Но без знания основ Вы так далеко не уедете. Так и будете по форумам выспрашивать. Толку в этом практически ноль
Просто эта тема давно вышла за рамки заявленного вопроса. Функцию я Вам "прикрутил"
Но если Вы не знаете что такое массив и как с ним работать, то это не ко мне, извините
Согласие есть продукт при полном непротивлении сторон
 
хорошо  благодарю за ваши советы и терпение к новичкам - буду изучать и пробовать
 
ну вот вроде получилось  поиск по Полный текст сделать
OptionButton Поиск по листу   и Поиск в книге позже введу выложу
Изменено: igrek2 - 23.01.2017 21:32:35
 
форму доделал Поиск по листу и Поиск в книге ввел + Удаление переносов пробелов на акт листе

такто все работает - единственная доработка точно мне не под силу
Как сделать - вывести в 3 колонке ListBox1  значение только найденного слова (а не словосочетания в ячейке как сейчас)
Пример:
1)Ищем по тексту "позвон"  по частичному совпадению текста
2)В найденной ячейке присутствует текст "Петров позвонил мне вчера"
3) Сейчас в колонке 3 ListBox1  появляется  весь текст "Петров позвонил мне вчера"
4) а нужно чтобы там в колонке 3 ListBox1 появился только слово "позвонил" - там где было найдено частичное совпадение (без лишних слов)
Кусок кода из формы где прописывается это значение по колонке 3 ListBox1 ниже. Чем заменить в строке.Column(2, i) = FoundCell.Value   -  средствами функции
FindAllOnWorksheets это можно сделать ?  Есть там данные про найденный текст в виде BeginsWith и EndsWith - но как их прикрутить для меня загадка.

PS. Если нарушаю правила форума - извините создам отдельную тему но тк история вопроса в этой теме решил здесь файл выложить с вопросом

Код
FoundRanges = FindAllOnWorksheets(ThisWorkbook, "Таблица:Горячий:Теплый:Перезвон:Холодный:НетДанных:Финиш", sRange, Me.TextBox1.Value, xlValues, xlPart, xlByRows, False)
i = 0
For N = LBound(FoundRanges) To UBound(FoundRanges)
    If Not FoundRanges(N) Is Nothing Then
        For Each FoundCell In FoundRanges(N).Cells
            With Me.ListBox1
                .AddItem
                .Column(0, i) = FoundCell.Worksheet.Name
                .Column(1, i) = FoundCell.Address(False, False)
                .Column(2, i) = FoundCell.Value
                .Column(3, i) = FoundCell.Worksheet.Index
                i = i + 1
            End With
        Next FoundCel
Изменено: igrek2 - 31.01.2017 07:58:59
 
В модуль, где у Вас хранятся функции поиска, добавьте еще одну функцию
Код
Function FoundWord(st As String, wd As String)
Dim i&
For i = 0 To UBound(Split(st))
    If Split(st)(i) Like "*" & wd & "*" Then
        If FoundWord <> Empty Then
            FoundWord = FoundWord & ", " & Split(st)(i)
        Else
            FoundWord = Split(st)(i)
        End If
    End If
Next
End Function


а строку
Код
.Column(2, i) = FoundCell.Value
запишите так
Код
.Column(2, i) = FoundWord(FoundCell.Value, Me.TextBox1.Value)
Согласие есть продукт при полном непротивлении сторон
Страницы: 1 2 След.
Наверх