Страницы: 1
RSS
Живой поиск с помощью комбобокса и листбокса, ошибка 70, как устранить ошибку?
 
Здравствуйте.

Пробовал наладить поиск, но программа при запуске выдает ошибку №70. Как решить?
Коротко: в комбобоксе (пока только в первом) нужно набрать комбинацию для поиска, а в листбоксе должны отображатся подходящие данные.

Заранее спасибо.
 
1. Для начала пересмотрите способ наполнения ЛистБокса при инициализации: или перебирайте ячейки листа, или заберите диапазон в массив, а потом скормите его  ЛистБоксу.
2. Добавьте в процедуру ComboBox1_Change очистку Листбокса.
3. For Each i In Лист1.Columns("A:A") - зачем Вы перебираете более миллиона ячеек?
===
Дальше посмотрим )
 
Цитата
Юрий М написал:
1. Для начала пересмотрите способ наполнения ЛистБокса при инициализации: или перебирайте ячейки листа, или заберите диапазон в массив, а потом скормите его  ЛистБоксу.
А что делаю я? Я ведь ячейки перебираю и добавляю, так? На что это влияет? На какую-то согласованность отображения данных?
Цитата
Юрий М написал:
2. Добавьте в процедуру ComboBox1_Change очистку Листбокса.
Добавил. Программа стопорится на этой строке и выдает ошибку -2147467259 (80004005) Unspecified error.
Цитата
Юрий М написал:
3. For Each i In Лист1.Columns("A:A") - зачем Вы перебираете более миллиона ячеек?
Признаться често, подсмотрел и добавил. Я так понимаю, это на ход программы не влияет. Но если влияет или Вы можете подсказать мне более элегантное решение, я с удовольствием имплиментирую в свой проект.
 
1. Вы не перебираете ячейки, а указываете диапазон для RowSource - где там перебор?
2. Вот потому и стопорится.
3. Это скажется на быстродействии: перебрать 100 строк или 1 000 000. Я уже подсказал: или перебирайте строки со второй по последнюю заполненную, или заберите диапазон в массив.
 
А как одной строкой внести таблицу данных в листбокс? Ну, чтоб не было миллиона строк? Разве строкой из процедуры lsb1_init это не делается?
 
По вопросу вечного двигателя слон и муха отдыхают.
Ваш круче, все на круг запускаете
Код
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    ListBox1.Clear
    iValue = ComboBox1.Text
    If iValue = "" Then Exit Sub
    With Лист1
        List = .Range(.Range("A2"), .Range("E" & .Cells(Rows.Count, 1).End(xlUp).Row))
    End With
    For i = 1 To UBound(List)
        If InStr(1, List(i, 1), iValue, vbTextCompare) > 0 Then
            ListBox1.AddItem List(i, 1)
             ListBox1.List(ListBox1.ListCount - 1, 1) = List(i, 2)
              ListBox1.List(ListBox1.ListCount - 1, 2) = List(i, 3)
              ListBox1.List(ListBox1.ListCount - 1, 3) = List(i, 4)
              ListBox1.List(ListBox1.ListCount - 1, 4) = List(i, 5)
        End If
    Next
End Sub
End Sub
Процедуру Sub lsb1_init() не вызывайте.
Изменено: Doober - 07.01.2018 00:18:27
 
Ну а процедуру инициализации напишите так:
Код
Private Sub UserForm_Initialize()
Dim LastRow As Long, Arr()
    With Sheets("Лист1")
        LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        Arr = Range(.Cells(2, 1), .Cells(LastRow, 5)).Value
    End With
    Me.ListBox1.List = Arr
    Label1.Caption = Лист1.Cells(1, 1)
    Label2.Caption = Лист1.Cells(1, 2)
    Label3.Caption = Лист1.Cells(1, 3)
    Label4.Caption = Лист1.Cells(1, 4)
    Label5.Caption = Лист1.Cells(1, 5)
'    Call lsb1_init
'    Me.ComboBox1.List = Range(Cells(2, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1)).Value
End Sub




 
А на сколько правильно, удобно, быстро для таких целей ADODB применять? Пример ниже для заполнения COMBO при вводе и поиске по нескольким полям , но принцип то  тот же хотя к теме не совсем относится, но вдруг ТС пересмотрит подход..
Скрытый текст
Изменено: БМВ - 07.01.2018 00:40:27
По вопросам из тем форума, личку не читаю.
 
Doober, Юрий М, ДА!!! Оно. Очень доступный код. Работает. Спасибо Вам большое!

БМВ, Круто! Но с кодом пока не разобрался.
 
hellm, крутого ничего нет, один плюс есть
Код
        cmbSource.Filter = "( " & strFltrBudget & " And ACC Like '*" & sText & "*') Or ( " & _
            strFltrBudget & " And  AccNames Like '*" & sText & "*')"
тут сразу по двум полям идет фильтрация и хоть в данном случае ищется всегда sText, но если заменить их на sText1 и sText2 то .... для вашего случая в них должны попадать значения из ваших объектов ввода значение, ну и поля браться соответвующие.
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх