Как сделать так, чтобы результат отображался в поле Поиск в текстовом поле БОЛЕЕ 60000 строк - PullRequest
1 голос
/ 25 апреля 2019

У меня есть база данных Excel, в которую я просто хочу ввести только номер тега, и я автоматически выведу результат в текстовое поле ... но для отображения результата потребуется 30 секунд

Private Sub cmdSearch_Click()
Dim x As Long
Dim y As Long
x = Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row
For y = 1 To x
If Sheets("Clients").Cells(y, 1).Text = TextBox1.Value Then

TextBox1.Text = Sheets("Clients").Cells(y, 1)
TextBox4.Text = Sheets("Clients").Cells(y, 3)
TextBox5.Text = Sheets("Clients").Cells(y, 4)
TextBox10.Text = Sheets("Clients").Cells(y, 5)
TextBox11.Text = Sheets("Clients").Cells(y, 6)
TextBox12.Text = Sheets("Clients").Cells(y, 7)
TextBox13.Text = Sheets("Clients").Cells(y, 8)
End If
Next y
End Sub

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Match довольно быстро

Private Sub cmdSearch_Click()
    Dim m As VARIANT


    With Sheets("Clients")
        m = Application.Match(TextBox1.Value, .Columns(1), 0)
        If not iserror(m) then
            TextBox4.Text = .Cells(m, 3)
            TextBox4.Text = .Cells(m, 4)
            'etc
        end if
    end with

End Sub
0 голосов
/ 25 апреля 2019

Цикл по 60000 строк данных будет медленным. Почему бы вам не попробовать Range.Find () вместо этого? Документация здесь https://docs.microsoft.com/en-us/office/vba/api/excel.range.find

Пример кода с этой страницы:

With Worksheets(1).Range("a1:a500") 
    Set c = .Find(2, lookin:=xlValues) 
    If Not c Is Nothing Then 
        firstAddress = c.Address 
        Do 
            c.Value = 5 
            Set c = .FindNext(c) 
        Loop While Not c Is Nothing
    End If 
End With

В вашем коде вы можете сделать что-то вроде следующего. Объявите переменную диапазона и присвойте ей результат команды find. Из найденного диапазона вы можете сместить нужные столбцы, чтобы получить их значения.

dim result as range
x = Sheets("Clients").Range("A" & Rows.Count).End(xlUp).Row
set result = Sheets("Clients").Range("A1:A" & x).Find(TextBox1.Value, lookin:=xlValues)
if not result is nothing then
   TextBox1.Text = result.value
   TextBox4.Text = result.offset(0,2).value
' and so on. use offset to get results from other columns in the row where the found range is
end if
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...