Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Поиск в строке по n-условиях - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск в строке по n-условиях (Макросы/Sub)
Поиск в строке по n-условиях
MisterYu Дата: Среда, 22.08.2018, 16:28 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Доброго времени суток.

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

Потом по количество слов должно быть такое же кол. условий.

Пример:

444 555 66 ... n- слов

Условие1 (444) и условие2 (555) и условие3(66) ... условие n-(слов)

Вот этих слов может быть много, заранее знать сколько невозможно. Соответственно условий тоже.
Думал использовать Case, но тут нужно заранее знать максимальное количество слов.

Подкиньте идею как это реализовать.
 
Ответить
СообщениеДоброго времени суток.

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

Потом по количество слов должно быть такое же кол. условий.

Пример:

444 555 66 ... n- слов

Условие1 (444) и условие2 (555) и условие3(66) ... условие n-(слов)

Вот этих слов может быть много, заранее знать сколько невозможно. Соответственно условий тоже.
Думал использовать Case, но тут нужно заранее знать максимальное количество слов.

Подкиньте идею как это реализовать.

Автор - MisterYu
Дата добавления - 22.08.2018 в 16:28
MisterYu Дата: Среда, 22.08.2018, 16:49 | Сообщение № 2
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Наверное нужно использовать Рекурсивную функцию.
 
Ответить
СообщениеНаверное нужно использовать Рекурсивную функцию.

Автор - MisterYu
Дата добавления - 22.08.2018 в 16:49
Roman777 Дата: Среда, 22.08.2018, 17:26 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
MisterYu, а какие будут формироваться действия от условий? их тоже будет столько же, сколько и условий?


Много чего не знаю!!!!
 
Ответить
СообщениеMisterYu, а какие будут формироваться действия от условий? их тоже будет столько же, сколько и условий?

Автор - Roman777
Дата добавления - 22.08.2018 в 17:26
MisterYu Дата: Четверг, 23.08.2018, 08:16 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Roman777, это так званый быстрый поиск по базе, по этому данные базы будут сравниваться з каждым условием.

для примера:

база:
44 55 33
11 44 33
99 334 6
67 2 89

строка поиска:
4 3

Результат:
44 55 33
11 44 33
99 334 6
 
Ответить
СообщениеRoman777, это так званый быстрый поиск по базе, по этому данные базы будут сравниваться з каждым условием.

для примера:

база:
44 55 33
11 44 33
99 334 6
67 2 89

строка поиска:
4 3

Результат:
44 55 33
11 44 33
99 334 6

Автор - MisterYu
Дата добавления - 23.08.2018 в 08:16
Roman777 Дата: Четверг, 23.08.2018, 09:15 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
MisterYu, Ну тут в лоб 2 способа, в принципе похожие:
либо перебор по всем строкам, внутри которого перебор всех условий, если все условия выполнены, строка попадает в коллекцию (массив, или во что Вы собираете результат).
либо копируете все строки в коллекцию и перебором так же по всем строкам, внутри каждой строки перебираете все условия и если хотя бы одно не выполняется - удаляете из неё неподходящую строку (тут не обязательно нужно будет перебирать все условия, если хотя бы 1 не выполняется, дальнейшие условия для данной строки не обязательно проверять). В коллекции останется нужный вам результат .

Возможно, в Вашем случае, можно будет попробовать ещё регулярные выражения... Но это не точно)


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Четверг, 23.08.2018, 09:19
 
Ответить
СообщениеMisterYu, Ну тут в лоб 2 способа, в принципе похожие:
либо перебор по всем строкам, внутри которого перебор всех условий, если все условия выполнены, строка попадает в коллекцию (массив, или во что Вы собираете результат).
либо копируете все строки в коллекцию и перебором так же по всем строкам, внутри каждой строки перебираете все условия и если хотя бы одно не выполняется - удаляете из неё неподходящую строку (тут не обязательно нужно будет перебирать все условия, если хотя бы 1 не выполняется, дальнейшие условия для данной строки не обязательно проверять). В коллекции останется нужный вам результат .

Возможно, в Вашем случае, можно будет попробовать ещё регулярные выражения... Но это не точно)

Автор - Roman777
Дата добавления - 23.08.2018 в 09:15
MisterYu Дата: Четверг, 23.08.2018, 11:08 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Roman777, спасибо за направление.

Результат моего шаманства:
Функция для подсчета пробелов между словами
[vba]
Код

Function Count_Probel(Strocka As String) As Integer
Dim Count As Integer: Count = 0
Dim s As String: s = Strocka
Do While InStr(1, s, "  ") > 0
    s = Replace(s, "  ", " ")
Loop
Do While InStr(1, s, " ") > 0 And Len(s) > InStr(1, s, " ")
    s = Mid(s, InStr(1, s, " ") + 1, Len(s))
    Count = Count + 1
Loop
Count_Probel = Count
End Function
[/vba]

Процедура сравнения:
[vba]
Код

Sub Sravn(Base As String, Stroka_find As String, Proverca As Boolean)
Dim Pos As String
Dim i As Integer
Dim s As String
s = Stroka_find
    If Count_Probel(Stroka_find) > 0 Then
        For i = 1 To Count_Probel(Stroka_find) + 1
            Pos = InStr(1, s, " ")
            If Pos > 0 Then
                If InStr(1, LCase(Base), LCase(Mid(s, 1, Pos - 1))) Then
                    s = Mid(s, Pos + 1, Len(s))
                    Proverca = True
                Else
                    Proverca = False
                    Exit Sub
                End If
            Else
                If InStr(1, LCase(Base), LCase(s)) Then
                    Proverca = True
                Else
                    Proverca = False
                    Exit Sub
                End If
            End If
        Next i
    Else
        If InStr(1, LCase(Base), LCase(s)) Then
            Proverca = True
        Else
            Proverca = False
        End If
    End If
End Sub
[/vba]

Код может и не оптимизирован, но работает.
Всем спасибо
 
Ответить
СообщениеRoman777, спасибо за направление.

Результат моего шаманства:
Функция для подсчета пробелов между словами
[vba]
Код

Function Count_Probel(Strocka As String) As Integer
Dim Count As Integer: Count = 0
Dim s As String: s = Strocka
Do While InStr(1, s, "  ") > 0
    s = Replace(s, "  ", " ")
Loop
Do While InStr(1, s, " ") > 0 And Len(s) > InStr(1, s, " ")
    s = Mid(s, InStr(1, s, " ") + 1, Len(s))
    Count = Count + 1
Loop
Count_Probel = Count
End Function
[/vba]

Процедура сравнения:
[vba]
Код

Sub Sravn(Base As String, Stroka_find As String, Proverca As Boolean)
Dim Pos As String
Dim i As Integer
Dim s As String
s = Stroka_find
    If Count_Probel(Stroka_find) > 0 Then
        For i = 1 To Count_Probel(Stroka_find) + 1
            Pos = InStr(1, s, " ")
            If Pos > 0 Then
                If InStr(1, LCase(Base), LCase(Mid(s, 1, Pos - 1))) Then
                    s = Mid(s, Pos + 1, Len(s))
                    Proverca = True
                Else
                    Proverca = False
                    Exit Sub
                End If
            Else
                If InStr(1, LCase(Base), LCase(s)) Then
                    Proverca = True
                Else
                    Proverca = False
                    Exit Sub
                End If
            End If
        Next i
    Else
        If InStr(1, LCase(Base), LCase(s)) Then
            Proverca = True
        Else
            Proverca = False
        End If
    End If
End Sub
[/vba]

Код может и не оптимизирован, но работает.
Всем спасибо

Автор - MisterYu
Дата добавления - 23.08.2018 в 11:08
_Boroda_ Дата: Четверг, 23.08.2018, 11:35 | Сообщение № 7
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Функцию можно чуть попроще написать
[vba]
Код
Function Count_Probel_1(Strocka As String) As Integer
    Count_Probel_1 = UBound(Split(WorksheetFunction.Trim(Range("A1"))))
End Function
[/vba]
Процедуру не смотрел - все равно без файла бесполезно


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеФункцию можно чуть попроще написать
[vba]
Код
Function Count_Probel_1(Strocka As String) As Integer
    Count_Probel_1 = UBound(Split(WorksheetFunction.Trim(Range("A1"))))
End Function
[/vba]
Процедуру не смотрел - все равно без файла бесполезно

Автор - _Boroda_
Дата добавления - 23.08.2018 в 11:35
MisterYu Дата: Четверг, 23.08.2018, 12:58 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, по поводу функции, строка введена в текстбокс.
 
Ответить
Сообщение_Boroda_, по поводу функции, строка введена в текстбокс.

Автор - MisterYu
Дата добавления - 23.08.2018 в 12:58
MisterYu Дата: Четверг, 23.08.2018, 13:03 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 28
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, я Вас понял, можно было использовать функцию Split
 
Ответить
Сообщение_Boroda_, я Вас понял, можно было использовать функцию Split

Автор - MisterYu
Дата добавления - 23.08.2018 в 13:03
_Boroda_ Дата: Четверг, 23.08.2018, 13:04 | Сообщение № 10
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
строка введена в текстбокс

И что? Вместо Range вставляете значение текстбокса
Я принцип показал, а детали без файла никто Вам придумывать самостоятельно не будет


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
строка введена в текстбокс

И что? Вместо Range вставляете значение текстбокса
Я принцип показал, а детали без файла никто Вам придумывать самостоятельно не будет

Автор - _Boroda_
Дата добавления - 23.08.2018 в 13:04
InExSu Дата: Воскресенье, 02.09.2018, 00:11 | Сообщение № 11
Группа: Друзья
Ранг: Ветеран
Сообщений: 648
Репутация: 96 ±
Замечаний: 0% ±

Excel 2010, 365
Привет!
быстрый поиск по базе

Жаль делается не быстро :-)
Можете посмотреть в готовых решениях


Разработчик Битрикс24 php, Google Apps Script, VBA Excel Windows/Mac

Сообщение отредактировал InExSu - Воскресенье, 02.09.2018, 21:00
 
Ответить
СообщениеПривет!
быстрый поиск по базе

Жаль делается не быстро :-)
Можете посмотреть в готовых решениях

Автор - InExSu
Дата добавления - 02.09.2018 в 00:11
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Поиск в строке по n-условиях (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!