VBA UBound返回一个负值

VBA UBound返回一个负值,vba,ms-word,Vba,Ms Word,我想知道我做错了什么 我打开了一个word文档(在word 2010中),其中有三个表。我想在VBA中测试基本表提取,并按照说明进行操作 我在这一行得到一个错误:ReDim Preserve aDataAll(nrRecs,nrFields),这是由于“nrFields”被设置为负值(-1) 不知道数组的上界是如何为负值的。。。在此方面的任何帮助都将不胜感激。尽管非常奇怪,但对于任何维度,VARIANT SAFEARRAY都可能有负的下限值和上限值。数组范围为LBound(,维度)到UBound

我想知道我做错了什么

我打开了一个word文档(在word 2010中),其中有三个表。我想在VBA中测试基本表提取,并按照说明进行操作

我在这一行得到一个错误:ReDim Preserve aDataAll(nrRecs,nrFields),这是由于“nrFields”被设置为负值(-1)


不知道数组的上界是如何为负值的。。。在此方面的任何帮助都将不胜感激。

尽管非常奇怪,但对于任何维度,VARIANT SAFEARRAY都可能有负的下限值和上限值。数组范围为LBound(,维度)到UBound(,维度)


必须为真的是UBound>=LBound

要获取数组大小,请使用UBound-LBound+1


过去习惯使用VBA代码顶部的
Option Base
语句设置下限,当然,这不会影响第三方库返回的数组。大多数人过去都用1作为下限。

我想出来了——我试图提取一个嵌套表。我必须在所有子表中循环并逐个提取。此外,在提取之前,我必须搜索并删除
^p
,以保留表结构

在我弄明白之后,我注意到MS代码示例有一个错误:
aData2(j)
实际上应该是
aData2(lFields)


希望这对其他新手有所帮助

如果UBound为-1且LBound=0,则数组为空。可以按如下方式生成空数组:

Dim EmptyArray() As String
Dim s As String
EmptyArray = Split("")
Debug.Print (UBound(EmptyArray)) ' displays -1
Debug.Print (LBound(EmptyArray)) ' displays 0
在您的情况下,如果阵列为空,我怀疑您需要跳过处理:

aData1 = Split(...)
If (UBound(aData1) < LBound(aData1) Then
    ' UBound is -1 and LBound is 0, array is empty, nothing to do
Else
    ' Array is non-empty, do your stuff
End If
aData1=Split(…)
如果(UBound(aData1)
Hmmm-我的文档肯定有问题:如果我插入以下行:
MsgBox(“UBound:&UBound(aData2())&.LBound:&LBound(aData1())
我得到了UBound:-1.LBound:0。“必须为真的是UBound>=LBound。”-除非数组为空,否则请查看我的答案。
aData1 = Split(...)
If (UBound(aData1) < LBound(aData1) Then
    ' UBound is -1 and LBound is 0, array is empty, nothing to do
Else
    ' Array is non-empty, do your stuff
End If