Новости:

Подпишитесь на рассылку новых сообщений форума через службу рассылок: Subscribe.ru

Главное меню

Ускорить загрузку UserForm

Автор lovko, 02.02.2016, 15:29

« назад - далее »

lovko

Здравствуйте! Не подскажите, как можно ускорить загрузку UserForm? Список для ComboBox, вроде, небольшой, но уходят ценные секунды, а если действия последовательно выполняются с несколькими формами, то минуты.

vikttur

#1
Set oColumn = Workbooks("Книга2.xlsm").Sheets("Лист1").Columns("C")
For Each oCell In oColumn.Cells

1. Просмотр ВСЕХ ячеек столбца. Зачем? Это же время...
2. Обращение к ячейкам листа - медленная операция. Записать в массив, обработать.
Private Sub UserForm_Initialize()
Dim ArrData()
Dim lRws As Long, i As Long
    'Заполняем первый список
    With Worksheets("Лист1")
        lRws = .Cells(.Rows.Count, "C").End(xlUp).Row ' последняя строка с данными
        If lRws < 2 Then Exit Sub
        ArrData = .Range("C1:C" & lRws).Value ' данные в массив
    End With
   
    For i = 1 To lRws ' цикл по данным
        If ArrData(i, 1) <> "" Then
        ComboBox1.AddItem ArrData(i, 1) ' новая запись в список
        End If
    Next i
   
    With ComboBox1
        .FontSize = 14: .ListIndex = 0
    End With
End Sub

lovko

Спасибо, действительно загружается быстрее.

vikttur

If ArrData(i, 1) <> "" Then
Еслипроверка была введена только для отсечения пустых строк ниже диапазона и в самих данных нет пустот, то еще проще и быстрее:
Private Sub UserForm_Initialize()
Dim lRws As Long
    'Заполняем первый список
    With Worksheets("Лист1")
        lRws = .Cells(.Rows.Count, "C").End(xlUp).Row ' последняя строка с данными
        If lRws < 1 Then Exit Sub
        ComboBox1.List = .Range("C1:C" & lRws).Value ' данные в список
    End With
   
    With ComboBox1
        .FontSize = 14: .ListIndex = 0
    End With
End Sub

lovko

Спасибо! Чем быстрее, тем лучше. Подскажите, а за что отвечает параметр ListIndex = 0?

d7d1cd

#5
ListIndex - это номер выделенной строки в ComboBox. Нумерация строк начинается с нуля.