好的,这个有点背景。我有一些代码可以对部件的位置列表进行排序,以创建可以选择的下拉列表位置,并在以后的其他地方用于排序。该位置是一个9位数的代码,我试图使用VLookup从不同的工作表中找到其位置代码的相应名称,将它们组合成一个数组,然后在组合框中显示该数组。
我目前在包含VLookup的行上收到“下标超出范围”错误。
Locan2(i, 1) = Application.VLookup(Locan(i), Sheet16.Range("A2:D700"), 2, False)
我已经在下面列出了整个子程序的上下文,任何帮助都会被理解这很烦我,而且我找不到类似我搜索的内容。
Private Sub Compbox() '<============Populates Location Drop down list==============>
Dim lastrow As Long
Dim Locn As String
Dim Locan() As String
Dim Locan2() As String
Dim Location As Collection
lastrow = Sheet5.Cells(Sheet5.Rows.Count, "J").End(xlUp).Row 'Find length of Sheet5
Set Location = New Collection
For i = 4 To lastrow
Locn = Sheet5.Cells(i, 10).Value
On Error Resume Next
Location.Add (Locn), CStr(Locn) 'Add location values, ignore duplicates
On Error GoTo 0
Next i
i = 0
QuickSort Location, 1, Location.Count 'Sort into ascending order
CollectionToArray Location, Locan 'Turn into an array
ReDim Locan2(UBound(Locan), 2)
For i = 0 To UBound(Locan)
Locan2(i, 0) = Locan(i)
Locan2(i, 1) = Application.VLookup(Locan(i), Sheet16.Range("A2:D700"), 2, False)
Next i
'Find the corresponding location name and create a 2D array
With Me.ComboBox2
.ColumnCount = 2
.BoundColumn = 1 'display combo box
.ColumnWidths = "1 in; 3in"
.List = Locan
End With
End Sub
提前感谢您的帮助!
答案 0 :(得分:0)
你得到错误是因为你要经过Locan2的最后一个索引,我会在该行上放一个断点并查看i的值。如果不把整张纸放在我面前,很难说更多。
答案 1 :(得分:0)
在这些步骤中,您的逻辑可能存在一些缺陷:
QuickSort Location, 1, Location.Count
CollectionToArray Location, Locan 'Turn into an array
ReDim Locan2(UBound(Locan), 2)
可能会返回一个错误或者没有分配的arr?
我注意到您正在使用自定义VBA函数对集合进行排序并转换为Array。
为什么不使用内置的ArrayList对象?
Dim Location As mscorlib.ArrayList
Dim Locan As Variant
Set Location = New mscorlib.ArrayList
For i = 4 To lastrow
Locn = Sheet5.Cells(i, 10).Value
On Error Resume Next
Location.Add CStr(Locn) 'ArrayList has the add function too!
On Error GoTo 0
Next i
Location.Sort 'Has the sort function built-in too!
Locan = Location.toArray 'And the toArray function is built-in too!!
如果您正在执行标准的快速排序并且支持阵列功能,这可能对您有所帮助。
我保留了完整的Object声明,因此您可以看到需要添加对mscorlib.dll的引用