Я пытаюсь найти быстрое решение для добавления данных в Combobox.Excel VBA System Collection Array List
У меня есть пользовательская форма, которая используется на двух листах, она создает список адресов, в зависимости от активного листа, список адресов создается с одного из двух листов.
Ниже приведен код, который у меня есть в настоящее время, если имя активного листа = SCHECK.name, то я использую System.Collection.ArrayList
, чтобы создать список уникальных отсортированных значений из листа WIR, который добавляется в Combobox.
Если активным листом является S20FA, тогда создайте список из CAL. Я хотел бы использовать System Collection, чтобы создать это, поскольку это намного быстрее, чем решение, которое у меня в настоящее время создает массив, затем перебирает массив и добавляет в Combobox.
Проблема с этим, я не уверен, как выполнить проверки, которые мне нужны, с System.Collection.ArrayList
, прежде чем адрес будет добавлен в массив.
Наряду с этим можно ли использовать System.Collection.ArrayList
для создания многомерного массива fo с многоколоновыми Combobox?
Dim wb As Workbook: Set wb = ThisWorkbook
Dim myArrayList As Object
Dim i, lastRow As Long
Dim address() As String
Dim number_address As Integer
Dim cell As Range
Dim addressList, addressItem
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Call wb.defineCols
Call wb.defineSheets
If ActiveSheet.Name = wb.SCHECK.Name Then
If wb.WIR.FilterMode = True Then wb.WIR.AutoFilter.ShowAllData
lastRow = wb.WIR.cells(Rows.count, wb.COL_Address_code).End(xlUp).Row
Set myArrayList = CreateObject("System.Collections.ArrayList")
addressList = wb.WIR.Range(wb.WIR.cells(3, wb.COL_Address_code), wb.WIR.cells(lastRow, wb.COL_Address_code))
With myArrayList
For Each addressItem In addressList
If Not .Contains(addressItem) Then .add addressItem
Next
.Sort
If .count Then Me.address_combo.List = Application.Transpose(myArrayList.toarray())
End With
myArrayList.Clear
Set myArrayList = Nothing
ElseIf ActiveSheet.Name = wb.S20FA.Name Then
If wb.CAL.FilterMode = True Then wb.CAL.AutoFilter.ShowAllData
lastRow = wb.CAL.cells(Rows.count, "A").End(xlUp).Row
Set cellRange = wb.CAL.Range("A8:A" & lastRow)
DoEvents
number_address = 0
For Each cell In cellRange
number_address = number_address + 1
ReDim Preserve address(number_address - 1)
If IsError(Application.match(cell, address, False)) Then
'''' Test cells
If wb.CAL.Range("G" & cell.Row) <> "" Then
If IsError(wb.CAL.Range("K" & cell.Row).value) = False Then
If wb.CAL.Range("K" & cell.Row).value <> "" And wb.CAL.Range("K" & cell.Row).value <> 0 Then
If (wb.CAL.Range("Q" & cell.Row).value <> "" And wb.CAL.Range("Q" & cell.Row).value <> 0) Or _
(wb.CAL.Range("W" & cell.Row).value <> "" And wb.CAL.Range("W" & cell.Row).value <> 0) Then
address(number_address - 1) = wb.CAL.Range("A" & cell.Row).value
Else
number_address = number_address - 1
End If
Else
number_address = number_address - 1
End If
End If
Else
number_address = number_address - 1
End If
Else
number_address = number_address - 1
End If
Next cell
DoEvents
For i = 0 To UBound(address)
If address(i) <> "" Then
address_combo.AddItem address(i)
End If
Next i
End If
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Вы можете добавить массив непосредственно в выпадающий список с помощью ComboBox.List = MyArray() –
@JiminyCricket Спасибо за ответ, хотя это не снижает скорость, что много, я СКОРОСТЬ протестировали его и его заняло около 5 секунд, чтобы запустить цикл около 1000 строк, с циклом в конце, с изменением его на список мало повлияло на время. что не так уж плохо, но этот документ используется в соединении Citrix, которое удваивается, если не утроит время выполнения задач. В то время как system.collection.arraylist занял 0,01 секунды, чтобы заполнить набор данных из более чем 20000 строк, поэтому я хотел бы иметь возможность использовать это решение. Спасибо – atame
Вы обязаны использовать 'System.Collection.ArrayList'? Это действительно не лучшее решение для того, чего вы пытаетесь достичь. И это объясняет, почему ваш код медленный. –