问题是这样的:现在我有一个用户自定义类型数组uArray(),动态的,有的时候里面会有数据,而另一些时候它将会因被Erase掉而呈现出Value为Nothing的状态,现在我想在程序中判断它是否为Nothing,就像对象变量可以用 If someObject is nothing then... 之类的东西一样。请问应该如何实现呢?谢谢了!祝各位朋友好运!

解决方案 »

  1.   

    我一般是这样做的 :1>  先定义一个变量uArrayCount as Long,用于跟踪动态数组的初始化情况;
        if uArrayCount=0 then ReDim uArray(0)    '此后可以正常附值
    2>  当数组附值后(非Nothing状态),uArrayCount=1 (or uArrayCount=uBound(uArray)), 表示数组非Nothing状态.以上,楼主看是否合适,同时也祝你顺利!
      

  2.   

    hi, 在Erase uArray之后别忘了重新设置uArrayCount=0. 
    呵呵, 有点多话了...
      

  3.   


    我给你个函数,可以解决你的问题了:Function IsReDim(ByRef MyArray() As Variant) As Boolean
        On Error GoTo Z
        Dim szTmp
        szTmp = Join(MyArray, ",")
        IsReDim = LenB(szTmp) > 0
        Exit Function
    Z:
        IsReDim = False
    End FunctionIsReDim判断数组是不是被分配过,如果是动态数组被Erase了,将返回False使用例子:
    If IsReDim(uArray) Then
       'uArray里面有数据
    Else
       'uArray里面没有数据
    End If
      

  4.   


     请不要使用Nothing去判断数组是否为空,类型不一致的.
      

  5.   


    IsArray() 函数并不能判断数组是否被分配过空间的它只能用于判断一个变量是不是一个数组
      

  6.   


    再次强调:IsReDim判断数组是不是被分配过,如果是动态数组被Erase了,将返回False使用例子:
    If IsReDim(uArray) Then
       'uArray里面有数据
    Else
       'uArray里面没有数据
    End If
      

  7.   

    tanaya(蜡笔小新)的函数不错,但你自己的变量的状态应该在妳自己的掌握之中,不应该用判断的
    同意cleogo(胖子)的说话
      

  8.   

    to tanaya(蜡笔小新):
    hi,你好,你用函数判断动态数组是否初始化的方法非常棒, 它可以不必让我费力记住另一个变量, 不过在我调试的时候,它向我报错("类型不匹配"),不知道是否有时间帮我检查一下, 谢谢!
    以下是代码:模块中:module1.bas
         
    type test
        i as long 
    end typepublic uArray() as test'函数
    public Function IsReDim(ByRef MyArray() As Variant) As Boolean
        On Error GoTo Z
        Dim szTmp
        szTmp = Join(MyArray, ",")
        IsReDim = LenB(szTmp) > 0
        Exit Function
    Z:
        IsReDim = False
    End Function窗体中form1.frmcommand1事件
    Private Sub Command1_Click()    
        If IsReDim(uArray) Then
            msgbox "ok"
        Else
            msgbox "error"
        End If    
    End Sub在单击按钮后, 报类型不匹配的错误, 错误位置在“If IsReDim(uArray) Then”语句上. 
      

  9.   

    VARIANT实际上是一个联合,其中可以存放各种标准的数据类型注意:"存放存放各种标准的数据类型"这句话的含义再给出 VARIANT STRUCTURE 的描述:/* VARIANT STRUCTURE 

    *  VARTYPE vt;        //WORD 
    *  WORD wReserved1; 
    *  WORD wReserved2; 
    *  WORD wReserved3; 
    *  union { 
    *    LONG          VT_I4 
    *    BYTE          VT_UI1 
    *    SHORT          VT_I2 
    *    FLOAT          VT_R4 
    *    DOUBLE        VT_R8 
    *    VARIANT_BOOL  VT_BOOL 
    *    SCODE          VT_ERROR 
    *    CY            VT_CY 
    *    DATE          VT_DATE 
    *    BSTR          VT_BSTR 
    *    IUnknown *    VT_UNKNOWN 
    *    IDispatch *    VT_DISPATCH 
    *    SAFEARRAY *    VT_ARRAY 
    *    BYTE *        VT_BYREF|VT_UI1 
    *    SHORT *        VT_BYREF|VT_I2 
    *    LONG *        VT_BYREF|VT_I4 
    *    FLOAT *        VT_BYREF|VT_R4 
    *    DOUBLE *      VT_BYREF|VT_R8 
    *    VARIANT_BOOL * VT_BYREF|VT_BOOL 
    *    SCODE *        VT_BYREF|VT_ERROR 
    *    CY *          VT_BYREF|VT_CY 
    *    DATE *        VT_BYREF|VT_DATE 
    *    BSTR *        VT_BYREF|VT_BSTR 
    *    IUnknown **    VT_BYREF|VT_UNKNOWN 
    *    IDispatch **  VT_BYREF|VT_DISPATCH 
    *    SAFEARRAY **  VT_BYREF|VT_ARRAY 
    *    VARIANT *      VT_BYREF|VT_VARIANT 
    *    PVOID          VT_BYREF (Generic ByRef) 
    *    CHAR          VT_I1 
    *    USHORT        VT_UI2 
    *    ULONG          VT_UI4 
    *    INT            VT_INT 
    *    UINT          VT_UINT 
    *    DECIMAL *      VT_BYREF|VT_DECIMAL 
    *    CHAR *        VT_BYREF|VT_I1 
    *    USHORT *      VT_BYREF|VT_UI2 
    *    ULONG *        VT_BYREF|VT_UI4 
    *    INT *          VT_BYREF|VT_INT 
    *    UINT *        VT_BYREF|VT_UINT 
    *  } 
    */ 
      

  10.   


    To: cleogo(胖子):所以你传递一个结构体进去,当然提示你类型不匹配了
      

  11.   

    很长知识 , 多谢 tanaya(蜡笔小新)!