用vba改变2D数组的大小

时间:2014-08-07 12:06:45

标签: arrays vba excel-vba excel

我总是遇到阵列问题,这就是为什么我通常会避开它们,但这次我试图绕过它们

我试图在vba中改变全局数组的大小

我已使用Public UseArr() As String

声明了它

现在我编写了一个搜索SQL表并将用户信息作为记录集返回的函数。

我想把这个记录集放到我的Global Array

这是我为填充它而编写的一些代码

a = 0
If Not Not UseArr Then
    For i = 0 To UBound(UseArr)
        If StrComp(UseArr(i, 0), rs("Alias")) = 0 Then a = 1
    Next i
    b = i
Else
    b = 0
End If

If a = 0 Then
    ReDim Preserve UseArr(0 To b, 0 To 10)
    With rs
        If Not .BOF And Not .EOF Then
            For j = 0 To 10
                If Not rs(j) = "" Then
                    UseArr(b, j) = rs(j)
                Else
                    UseArr(b, j) = "Null"
                End If
            Next j
        End If
    End With
End If

想法是,如果用户已经在那里,它不会填充,如果没有填充。

它可以很好地初始化Array但是当我去第二个用户时它会抛出一个调整大小的错误。

有人可以帮忙吗?

提前致谢

汤姆

使用字典尝试更新

If UseList Is Nothing Then
    Set UseList = New Dictionary
    MsgBox "Created New"
End If

If UseList.Exists(rs("Alias")) Then

    Dim temp()
    For i = 0 To 10
        temp(i) = rs(i + 1)
    Next i

    With UseList
        .Add Key:=rs("Alias"), Item:=temp
    End With
End If

Debug.Print UseList

3 个答案:

答案 0 :(得分:2)

您只能Redim Preserve多维数组的最后一个维度 - 请参阅here。您是否考虑过使用CollectionDictionary

编辑:使用您在上面发布的代码,以下是如何从与“tom”键相关联的数组中显示元素4

MsgBox UseList("tom")(4)

或等效

MsgBox UseList.Item("tom")(4)

答案 1 :(得分:0)

Here您对Dictionary对象的工作方式及其某些属性和功能有一些解释。

我认为这是实现目标的最佳方式,因为它们易于使用,快速高效。

首先,您必须将mscorlib.dll导入项目参考。

您可以使用类似的东西来声明字典:

Dim UseDict As Dictionary
Set UseDict = New Dictionary

要知道您正在搜索的密钥是否不在字典中,然后添加新用户:

If Not UseDict.Exists(Key) Then
   UseDict.Item(Key) = 1
End If

此处的值并不重要,但如果您想计算某个键出现的次数,则可以在UseDict.Exists(Key) = True时增加该值。 这就是字典,哈希地图或地图所代表的含义:有效计算和搜索。

希望它有所帮助!

答案 2 :(得分:0)

我附上了一些修正代码。我认为问题在于您尝试访问数组,就好像它是一个变量一样。这意味着你必须遍历一个键的项目。

我在以下代码中添加注释:

<强>更新

If UseList Is Nothing Then
    Set UseList = New Dictionary
    MsgBox "Created New"
End If

If UseList.Exists(rs("Alias")) Then
'i think is better to specify the data type and the dimension.
    Dim temp(10) as string
'if you loop from 0 to 10 the array will have 11 elements
    For i = 0 To 9
        temp(i) = rs(i + 1)
    Next i
'This will work also and looks nicer (in my opinion) than the method 
'you pasted, but if that worked anyway don't change it ;)
UseList(rs("Alias")).Item = temp

End If

现在,如果要检索结果,您必须:

For i = 0 To UBound(UseList.Item(rs("Alias")) - 1
    Debug.Print UseList.Item(rs("Alias"))(i)
Next i

在测试代码时给我反馈,请:)