VBA第一个数组项始终为空

时间:2017-09-01 19:36:01

标签: arrays excel vba excel-vba loops

下面的代码我在网上找到的几个例子中修改过,我不是VBA专家。

clist数组中的第一项(以及下拉列表中的第一项)始终为空,我假设它与redim s有关,但我无法弄清楚。

可能是什么问题?

Private Sub ComboBox1_Change()
    ReDim clist(0)
    'If any value is input
    If ComboBox1.Value <> "" Then
        Dim kword As Variant
        Dim product As Variant
        'For each product description in our sheet table
        For Each product In [Produtos[Descrição]].Rows
            'Keyword search
            For Each kword In Split(ComboBox1.Value, " ")
                If InStr(Replace(product.Value, "", " "), kword) And kword <> "" Then
                    'Issue most likely here
                    ReDim Preserve clist(UBound(clist) + 1) As Variant
                    clist(UBound(clist)) = product.Value
                    Exit For
                End If
            Next kword
        Next product
        ComboBox1.list = clist
        'If found something
        If UBound(clist) > 0 Then
            ComboBox1.DropDown
        End If
    'If no Input just show all products, here it doesn't show a blank item
    Else
        ComboBox1.list = [Produtos[Descrição]].Value2
    End If
End Sub

2 个答案:

答案 0 :(得分:4)

试一试,

    ReDim clist(0)
    For Each product In [Produtos[Descrição]].Rows
        'Keyword search
        For Each kword In Split(ComboBox1.Value, " ")
            If InStr(Replace(product.Value, "", " "), kword) And kword <> "" Then
                'Issue most likely here
                clist(UBound(clist)) = product.Value
                ReDim Preserve clist(UBound(clist) + 1)
                Exit For
            End If
        Next kword
    Next product
    ReDim Preserve clist(UBound(clist) - 1)

答案 1 :(得分:2)

这是因为你增加了数组的大小,然后才将值设置为它的最后一个索引。

ReDim Preserve clist(UBound(clist) + 1) As Variant 'Increase array size by 1
clist(UBound(clist)) = product.Value 'Set a value to the higher index

这样您就不会为index 0

设置值

这样的事情可以解决你的问题:

if clist(Ubound(clist)) <> empty then
    ReDim Preserve clist(UBound(clist) + 1) As Variant
end if
clist(UBound(clist)) = product.Value