Поиск по первой и последующим буквам

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

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

Ответить
Man1K
Сообщения: 4
Зарегистрирован: 09 мар 2014, 12:04

Есть ListBox и TextBox при вводе в TextBox названия элемента ListBox он выделяется в нем.
Вопрос таков: Нужно сделать чтобы он сравнивал не целиком а начиная с первой буквы, То есть если есть элемент Шаблон при вводе Ш он его выделял а при вводе на пример Шу он выделял элемент ( если такой есть) там Шурша на пример. Изначальный код:
Private Sub TextBox1_Change()
Dim i As Integer
Dim b As Variant
b = TextBox1.Text
For i = 0 To ListBox1.ListCount - 1 Step 1
If ListBox1.List(i) = b Then
UserForm2.ListBox1.Selected(i) = True: Exit For
End If
Next i
End Sub

Если написать If ListBox1.List(i) = b + "*" Then не работает но не могу понять почему
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Если хотите мучить символ подстановки, в Вашем случае, это * то используйте оператор Like (информацию о котором, вкупе с примерами, можно найти в справке)

Впрочем, для решения поставленной задачи, можно воспользоваться и VB(A) функцией InStr

P.S. А если работа осуществляется в Excel, то программный поиск также можно организовать с помощью стандартной функции рабочего листа =ПОИСКПОЗ() которая работает с массивами.
Man1K
Сообщения: 4
Зарегистрирован: 09 мар 2014, 12:04

Данная программа пишется на VBA и оператор Like не подходит т.к список меняется в зависимости от названия листов. Через InStr я вообще не знаю как можно организовать.
Есть вариант через FindNext и т.д но не не знаю как сделать.
По идее мне надо чтобы при вводе в TextBox проверялась каждая буква в элементе ListBox с последующем любым символом и выделялся этот элемент.
ListBox и TextBox находятся на форме, и все это пишется в Excel.
=ПОИСКПОЗ() Я думаю не подойдет для поиска в ListBox находящегося на форме, эта функция применяется к листу если я не ошибаюсь.
pashulka
Сообщения: 831
Зарегистрирован: 24 ноя 2004, 03:46
Контактная информация:

Man1K писал(а):Данная программа пишется на VBA и оператор Like не подходит т.к список меняется в зависимости от названия листов.
Неужели так сложно просто посмотреть, например, в справке, примеры касательно данного оператора, чтобы воочию убедиться, что он подходит для данного случая ... а ещё "лучше" сразу сказать, что Вам нужно готовое решение

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

Option Compare Text

Private Sub TextBox1_Change()

Dim lngCount As Long, strText As String
strText = TextBox1.Text & "*"

For lngCount = 0 To ListBox1.ListCount - 1
    If ListBox1.List(lngCount) Like strText Then
       ListBox1.Selected(lngCount) = True
       Exit For '<<< Кстати, а кто сказал, что таких слов не может быть несколько ?
    End If
Next

End Sub
Man1K писал(а):Через InStr я вообще не знаю как можно организовать.

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

Private Sub TextBox1_Change()

Dim lngCount As Long, strText As String
strText = TextBox1.Text

For lngCount = 0 To ListBox1.ListCount - 1
    If InStr(1, ListBox1.List(lngCount), strText, vbTextCompare) = 1 Then
       ListBox1.Selected(lngCount) = True
       Exit For '<<<
    End If
Next

End Sub
Man1K писал(а):=ПОИСКПОЗ() Я думаю не подойдет для поиска в ListBox находящегося на форме, эта функция применяется к листу если я не ошибаюсь.
Плохо думаете, ибо если Вам говорят, что эта функция может работать с массивами, значит так оно и есть.
Man1K писал(а):Есть вариант через FindNext и т.д но не не знаю как сделать.
Как раз этот вариант требует, наличия ячеек со списком.


P.S. Важно : Обратите внимание на то, что в текстовое поле можно не только вводить данные, но и удалять их, а значит есть вероятность, что после редактирования у Вас останется выделенным предыдущий найденный элемент списка.
Man1K
Сообщения: 4
Зарегистрирован: 09 мар 2014, 12:04

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

И шоб никто не сумлевался в возможности использования стандартных функций рабочего листа, в данном случае, ПОИСКПОЗ/MATCH

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

Private Sub TextBox1_Change()

    Dim strText As String, varCount As Variant
    strText = TextBox1.Text

    If Len(strText) > 0 Then 'If strText <> "" Then
       varCount = Application.Match(strText & "*", ListBox1.List, 0)

       If Not IsError(varCount) Then
          ListBox1.ListIndex = varCount - 1
       Else
          ListBox1.ListIndex = -1
       End If
   
    Else
       ListBox1.ListIndex = -1
    End If

End Sub

Private Sub UserForm_Initialize()

    ListBox1.List = Array("Ананас", "Манго", "Киви", "Апельсин", "Яблоко", "Мандарин")

End Sub
Ответить