简介 NB。
{编辑}
随后,当我使用这种方法时,我发现项目中发生了奇怪的事情。 已经使用了多年的代码中出现了奇怪的错误。 当我删除这一行代码后,它又恢复了以前的工作。 我将其留在此处以供参考,但是
您已被警告 。有时我们需要确定是否已声明数组
ReDim
med还没有。
如果我们尝试事先引用它,它将崩溃。
不好的情况:-(
这是帮助文件的摘录,可帮助解释为什么会发生这种情况:
ReDim帮助:我怀疑他们可能遗漏了
ReDim语句用于调整动态数组的大小或大小,该数组已经使用Private , Public或Dim语句(带空括号)(没有维下标)正式声明。
Static
语句,但这是另一回事-这不是我们的问题。
我将介绍并说明一种方法,该方法允许代码自行确定而不会触发和捕获错误(无论数组变量是否已初始化)。 就本文而言,我将提及
ReDim
初始化为初始化。
因此,动态数组变量在初始化或ReDim
med之前没有分配存储空间,但是在其第一个ReDim
它就被初始化并且确实分配了存储空间。
ReDim帮助:请参阅下面的说明,以了解我们如何利用它来确定动态数组变量的初始化状态。 说明
在过程级别用于重新分配动态数组变量的存储空间。
在初始化之前,动态数组变量的指针值为零(0),此时指针值变为非零。 就我们的目的而言,我们不关心该值,除非它是否为零。
通常,当没有任何限定条件引用数组变量(例如为维度指定的元素标识符)时,代码将失败,因为在VBA中不允许直接引用数组指针。 也就是说,除非作为类似的参数
LBound()
或UBound()
。
但是,完全可以在Not
运算符之后引用它。
我们将使用它来确定是否已设置。
如果指针值为零,则
Not
指针值是-1 -或全1点的位。
要测试所有零位(零)并不容易,因此我们使用Not Not
来返回指针的原始值。
我们可以将其与零进行比较,甚至可以使用CBool()
来确定动态数组变量是否尚未设置。
注意
我们不能做的只是简单地对其进行测试 。
Not Not Not {dynamic array variable}
等效于Not {dynamic array variable}
,但是无论指针的原始值是否为零,这两个Not {dynamic array variable}
都将采用True路径。
因此,指示与零比较或使用CBool()
。
代码说明
Public Sub ReDimTest()
Dim astrVar() As String
If (Not Not astrVar) = 0 Then Debug.Print "A Uninitialised"; (Not Not astrVar);
If Not Not astrVar Then Debug.Print " B Initialised"; (Not Not astrVar);
ReDim astrVar(0 To 1)
If (Not Not astrVar) = 0 Then Debug.Print " C Uninitialised"; (Not Not astrVar);
If Not Not astrVar Then Debug.Print " D Initialised"; (Not Not astrVar);
astrVar = Split("")
If (Not Not astrVar) = 0 Then Debug.Print " E Uninitialised"; (Not Not astrVar);
If Not Not astrVar Then Debug.Print " F Initialised"; (Not Not astrVar);
Debug.Print " G ";UBound(astrVar);
Debug.Print " H";astrVar(0);
End Sub
Results:
A Uninitialised 0 D Initialised 204031032 F Initialised 204031032 G -1 {Crashes here}
错误为错误#9-下标超出范围 。
在上面的代码中,您会注意到
UBound(astrVar)
返回值-1,该值低于零的下限。
如果需要确保您的代码不会受到任何此类情况的影响,请对此进行测试。
结论
希望这个对你有帮助 :-)
From: https://bytes.com/topic/access/insights/965403-determine-if-declared-array-has-been-initialised