我总是遇到阵列问题,这就是为什么我通常会避开它们,但这次我试图绕过它们
我试图在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
答案 0 :(得分:2)
您只能Redim Preserve
多维数组的最后一个维度 - 请参阅here。您是否考虑过使用Collection
或Dictionary
?
编辑:使用您在上面发布的代码,以下是如何从与“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
在测试代码时给我反馈,请:)