Private Sub CommandButton1_Click()
iText$ = TextBox1.Value
If iText$ <> "" Then
With ThisWorkbook.Worksheets(1).[B:B]
'Укажите нужную рабочую книгу и рабочий лист
Dim iCell As Range
Set iCell = .Find(iText$, , xlValues, xlPart)
If Not iCell Is Nothing Then
iAddress$ = iCell.Address
ListBox1.Clear
Do
Set iCell = .FindNext(iCell)
ListBox1.AddItem iCell.Value
Loop While iAddress$ <> iCell.Address
End If
End With
Else
TextBox1.SetFocus
MsgBox "Необходим образец для поиска", , ""
End If
End Sub
Excel VBA поиск строк
на vba написана программа для работы с данными эксель. и есть небольшая проблема с поиском. на форме: listbox, textbox и кнопка. в текстбокс вводится ФИО, по нажатию кнопки происходит поиск по ячейкам (к, "В") и в листбокс выводится целиком строка к.
но это работает только при полном совпадении данных в текстбоксе с содержимым ячейки (к, "В"). можно ли сделать поиск по части? например, если ввести только имя или только фамилию, и поиск выдавал бы все строки, в которых присутствуют такие имя или фамилия?
в листбоксе 8 колонок, соответствующих ячейкам. в последней 8ой колонке - сборные данные из четырех ячеек (I,L,K,L).
можно ли модифицировать данный код, чтобы запись строки происходила по колонкам? так как сейчас запись происходит в первую колонку.
Код:
Private Sub CommandButton1_Click()
iText$ = TextBox1
If iText$ <> "" Then
With ThisWorkbook.Worksheets(1).[B:B]
'Укажите нужную рабочую книгу и рабочий лист
Dim iCell As Range
Set iCell = .Find(iText$, , xlValues, xlPart)
If Not iCell Is Nothing Then
iAddress$ = iCell.Address
ListBox1.Clear
Do
ListBox1.AddItem
ListBox1.List(iCount&, 0) = iCell(1, 1) 'iCell
ListBox1.List(iCount&, 1) = iCell(1, 2)
ListBox1.List(iCount&, 2) = iCell(1, 5)
'и т.д.
iCount& = iCount& + 1
Set iCell = .FindNext(iCell)
Loop While iAddress$ <> iCell.Address
End If
End With
Else
TextBox1.SetFocus
MsgBox "Необходим образец для поиска", , ""
End If
End Sub
iText$ = TextBox1
If iText$ <> "" Then
With ThisWorkbook.Worksheets(1).[B:B]
'Укажите нужную рабочую книгу и рабочий лист
Dim iCell As Range
Set iCell = .Find(iText$, , xlValues, xlPart)
If Not iCell Is Nothing Then
iAddress$ = iCell.Address
ListBox1.Clear
Do
ListBox1.AddItem
ListBox1.List(iCount&, 0) = iCell(1, 1) 'iCell
ListBox1.List(iCount&, 1) = iCell(1, 2)
ListBox1.List(iCount&, 2) = iCell(1, 5)
'и т.д.
iCount& = iCount& + 1
Set iCell = .FindNext(iCell)
Loop While iAddress$ <> iCell.Address
End If
End With
Else
TextBox1.SetFocus
MsgBox "Необходим образец для поиска", , ""
End If
End Sub
Примечание :
- если Вам непривычен синтаксис Item(RowIndex, ColumnIndex), то, к примеру, вместо iCell(1, 2) можно использовать iCell.Offset(, 1)/iCell.Offset(0, 1), только учтите, что смещение зависит от наличия об'единённых ячеек.
- при наличии восьми столбцов имеет смысл организовать их заполнение с помощью цикла.
- если этот вариант, по каким-то причинам, не устроит, то заполнить список можно также использовав свойство List
При объединении ячеек индексы сместил на -1 и все стало ок.
Код, в принципе, понимаю )) но сам такого не напишу :o не велики мои познания в VBA.