Есть 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 не работает но не могу понять почему
Поиск по первой и последующим буквам
Модератор: Naeel Maqsudov
Если хотите мучить символ подстановки, в Вашем случае, это * то используйте оператор Like (информацию о котором, вкупе с примерами, можно найти в справке)
Впрочем, для решения поставленной задачи, можно воспользоваться и VB(A) функцией InStr
P.S. А если работа осуществляется в Excel, то программный поиск также можно организовать с помощью стандартной функции рабочего листа =ПОИСКПОЗ() которая работает с массивами.
Впрочем, для решения поставленной задачи, можно воспользоваться и VB(A) функцией InStr
P.S. А если работа осуществляется в Excel, то программный поиск также можно организовать с помощью стандартной функции рабочего листа =ПОИСКПОЗ() которая работает с массивами.
Данная программа пишется на VBA и оператор Like не подходит т.к список меняется в зависимости от названия листов. Через InStr я вообще не знаю как можно организовать.
Есть вариант через FindNext и т.д но не не знаю как сделать.
По идее мне надо чтобы при вводе в TextBox проверялась каждая буква в элементе ListBox с последующем любым символом и выделялся этот элемент.
ListBox и TextBox находятся на форме, и все это пишется в Excel.
=ПОИСКПОЗ() Я думаю не подойдет для поиска в ListBox находящегося на форме, эта функция применяется к листу если я не ошибаюсь.
Есть вариант через FindNext и т.д но не не знаю как сделать.
По идее мне надо чтобы при вводе в TextBox проверялась каждая буква в элементе ListBox с последующем любым символом и выделялся этот элемент.
ListBox и TextBox находятся на форме, и все это пишется в Excel.
=ПОИСКПОЗ() Я думаю не подойдет для поиска в ListBox находящегося на форме, эта функция применяется к листу если я не ошибаюсь.
Неужели так сложно просто посмотреть, например, в справке, примеры касательно данного оператора, чтобы воочию убедиться, что он подходит для данного случая ... а ещё "лучше" сразу сказать, что Вам нужно готовое решение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. Важно : Обратите внимание на то, что в текстовое поле можно не только вводить данные, но и удалять их, а значит есть вероятность, что после редактирования у Вас останется выделенным предыдущий найденный элемент списка.
Огромное спасибо. Попытаюсь в следующий раз быть более понятливым.
И шоб никто не сумлевался в возможности использования стандартных функций рабочего листа, в данном случае, ПОИСКПОЗ/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