Vlookup,数组和集合的问题。在VBA中

时间:2017-01-27 15:19:50

标签: arrays excel vba vlookup

好的,这个有点背景。我有一些代码可以对部件的位置列表进行排序,以创建可以选择的下拉列表位置,并在以后的其他地方用于排序。该位置是一个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

提前感谢您的帮助!

2 个答案:

答案 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的引用