如何在VBA中重读阵列

如何在VBA中重读阵列,vba,excel,Vba,Excel,我有重复的代码片段,可以在需要时增加动态数组的大小,所以我更喜欢在子例程中使用它们。我在谷歌上搜索了半天,似乎找不到在另一个例行程序中重拨阵列的解决方案。找到了一个解决方案,但该解决方案适用于2000年代早期版本的VBA,不适用于此Excel 2013版本 reDim仅reDim阵列的大小,而不是应通过引用传递的实际arrgp。我正在使用Excel 2013。关于如何reDim通过byRef的数组的任何解决方案 Sub ArraySizeUp(ByRef theArray) 'theArray(

我有重复的代码片段,可以在需要时增加动态数组的大小,所以我更喜欢在子例程中使用它们。我在谷歌上搜索了半天,似乎找不到在另一个例行程序中重拨阵列的解决方案。找到了一个解决方案,但该解决方案适用于2000年代早期版本的VBA,不适用于此Excel 2013版本

reDim
reDim
阵列的大小,而不是应通过引用传递的实际
arrgp
。我正在使用Excel 2013。关于如何
reDim
通过
byRef
的数组的任何解决方案

Sub ArraySizeUp(ByRef theArray) 'theArray() doesn't work also

    'increment size by 1
    If ArrayIsAllocated(theArray) Then
        ReDim Preserve theArray(UBound(theArray) + 1)
    Else
        ReDim theArray(0)
    End If

End Sub
-


您不能重拨使用dim定义的数组。你需要从redim开始

 Sub Main()

  ReDim arrGrp(0)

 ArraySizeUp arrGrp

 Debug.Print UBound(arrGrp)
 End Sub

如果
ArrayIsAllocated
功能编码正确,代码应该可以工作。你的问题我看不出来,所以我说不出来。但是请考虑这个代码:

Sub ArraySizeUp(ByRef theArray)
    ReDim theArray(0)
    theArray(0) = 5
    ReDim Preserve theArray(UBound(theArray) + 1)
    theArray(1) = 6
End Sub

Sub Main()
    Dim arrGrp()
    ArraySizeUp arrGrp
End Sub
我刚刚删除了
arrayiassocated
函数,但代码与您的相同,并且运行良好。第一个
ReDim
添加一个项目,我将其分配为5,然后第二个
ReDim
添加另一个项目,我将其分配为6。回到
Main()
时,您将看到带有两个项目的
arrgp
,即5和6


因此,您需要在
ArrayIsAllocated
函数中检查代码并修复它。如果您需要帮助,请将其张贴在您的问题中。

我道歉。代码现在可以工作了。我不知道为什么会出现这个问题。昨晚我花了两个小时调试这个问题,但都没用。大量的谷歌搜索和阅读stackoverflow没有发现任何帮助,所以在这里发布了一个问题作为最后手段

具体的问题是,当我“观察”arrgp和阵列时,只有阵列的大小增加了,而不是arrgp。事实上,这是第一次奏效。第二次之后,问题开始出现,我认为这是因为我使用了“ArraySizeUp arrgp”而不是“Call ArraySizeUp(arrgp)”,尽管我的stackoverflow读数表明“Call”是不必要的。从那时起,它完全拒绝增加ARRGP的大小。这会在以后访问UBound(arrGrp)时引发错误


在此期间,我唯一没有做的事情就是关闭并启动计算机。我只能猜测,这个问题不知怎么解决了。感谢你们所有人的贡献。我在Adobe Director的行话编程方面有着丰富的经验,但我昨天才在这项临时任务中学习了VBA,因此非常感谢VBA编程视角。

Excel 2013到底为您带来了什么?虽然您尚未显示
IsArrayAllocated
的代码,但代码在我看来很好。顺便说一下,数组只通过ref传递。FWIW
ReDim Preserve theArray(UBound(theArray)+1)
效率相当低。使调整大小值得,而不仅仅是+1。更好:除非你知道需要多少元素,否则不要使用数组。到底什么是“不工作”呢?您的问题不清楚。您当然可以
ReDim
使用
Dim
定义的数组,您试过了吗?请尝试我答案中的代码,它会运行并给出预期结果。这不是真的-您可以
Redim
,只要数组最初没有声明特定的边界。
Sub ArraySizeUp(ByRef theArray)
    ReDim theArray(0)
    theArray(0) = 5
    ReDim Preserve theArray(UBound(theArray) + 1)
    theArray(1) = 6
End Sub

Sub Main()
    Dim arrGrp()
    ArraySizeUp arrGrp
End Sub