私は、コンボボックスにデータを追加するための高速なソリューションを探しています。Excel VBAシステムコレクション配列リスト
2つのシートで使用されるユーザーフォームがあり、アクティブシートに応じてアドレスリストが作成されます。アドレスリストは2枚のシートのいずれかから作成されます。
アクティブなシート名= SCHECK.nameの場合は、System.Collection.ArrayList
を使用して、シートWIRからコンボボックスに追加された一意のソート値のリストを作成しています。
アクティブシートがS20FAの場合は、CALからリストを作成します。私はシステムコレクションを使用して、これを作成するのがはるかに速いので、私が現在アレイを作成していて、その後配列をループして、Comboboxに追加しています。
この問題は、アドレスがアレイに追加される前に、System.Collection.ArrayList
で必要なチェックを実行する方法がわかりません。
これに加えて、System.Collection.ArrayList
を使用して、マルチカラムコンボボックスで使用する多次元配列を作成できますか?
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のおかげを使用して、直接コンボボックスに配列を追加することができます約1000秒間にループを実行するのに約5秒かかりました。ループを最後に変更して、それをリストに変更すると時間にほとんど影響しませんでした。これはそれほど悪くはありませんが、この文書はCitrix接続で使用されています。これは、タスクを完了するための時間を3倍にしなければ2倍になります。 system.collection.arraylistは20000行以上のデータセットを完成させるのに0.01秒かかりましたが、私はその解決策を使用できるようにしたいと考えています。ありがとうございます – atame
あなたは 'System.Collection.ArrayList'を使うことになっていますか?あなたが達成しようとしているもののための最良のソリューションではありません。そしてそれはあなたのコードがなぜ遅いのかを説明します。 –