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