Профессиональные приемы работы в Microsoft Excel

Обмен опытом => Microsoft Excel => Тема начата: lovko от 02.02.2016, 15:29

Название: Ускорить загрузку UserForm
Отправлено: lovko от 02.02.2016, 15:29
Здравствуйте! Не подскажите, как можно ускорить загрузку UserForm? Список для ComboBox, вроде, небольшой, но уходят ценные секунды, а если действия последовательно выполняются с несколькими формами, то минуты.
Название: Re: Ускорить загрузку UserForm
Отправлено: vikttur от 02.02.2016, 15:47
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
Название: Re: Ускорить загрузку UserForm
Отправлено: lovko от 02.02.2016, 16:14
Спасибо, действительно загружается быстрее.
Название: Re: Ускорить загрузку UserForm
Отправлено: vikttur от 02.02.2016, 16:28
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
Название: Re: Ускорить загрузку UserForm
Отправлено: lovko от 03.02.2016, 06:38
Спасибо! Чем быстрее, тем лучше. Подскажите, а за что отвечает параметр ListIndex = 0?
Название: Re: Ускорить загрузку UserForm
Отправлено: d7d1cd от 03.02.2016, 08:20
ListIndex - это номер выделенной строки в ComboBox. Нумерация строк начинается с нуля.