确定声明的数组是否已初始化

本文介绍了一种在VBA中确定动态数组是否已初始化的方法。通过使用Not运算符两次,可以检查数组指针是否为零,从而判断数组是否已通过ReDim语句初始化。这种方法避免了错误触发,适用于需要在代码中安全检查数组状态的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介 NB。 {编辑}

随后,当我使用这种方法时,我发现项目中发生了奇怪的事情。 已经使用了多年的代码中出现了奇怪的错误。 当我删除这一行代码后,它又恢复了以前的工作。 我将其留在此处以供参考,但是

您已被警告

有时我们需要确定是否已声明数组

ReDim med还没有。 如果我们尝试事先引用它,它将崩溃。 不好的情况:-(

这是帮助文件的摘录,可帮助解释为什么会发生这种情况:

ReDim帮助:
ReDim语句用于调整动态数组的大小或大小,该数组已经使用PrivatePublicDim语句(带空括号)(没有维下标)正式声明。
我怀疑他们可能遗漏了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值