·如何知道变长数组变量已有确定的上下标?问题可能不太清楚,这里用代码辅助解释一下:Dim Arr1()   '申明了一个变长数组变量
'Redim Preserve Arr1(0) '有这一句,我在以后的过程中,可以使用Lbound(Arr1)和Ubound(Arr1)来判断Arr1的上下标,因为Arr1已有确定的上下标。
Debug.Print Ubound(Arr1) '如果没有上面一句,这里就会出错,说下界越标。我试过了,Arr1 Is Nothing 或 IsNull(Arr1) 都是错误的,当然,我还可以用Err对象来捕捉错误,如果Ubound(Arr1)运行后发生指定错误号,说明Arr1还没有确定的上下标,但我希望有更好的办法。·如果此变长数组变量是用户自定义类型又该如何办?另外,我发现用户自定义类型的主关键字不能作为公共函数的参数,如果真的有那么一个函数可以判断变长数组变量是否有确定上下标,而我们这个变长数组用户自定义类型变量又不能作为此函数的参数,该如何办?例子1(用户自定义类型的主关键字不能做为公共函数的参数):Public Type Type1 '先定义一个用户自定义类型
  Var As String
End TypePublic T1 As Type1 '申明一个用户自定义类型变量Public Sub Sub1()
  Dim T2 As String
  'IsNull 是公共函数,且它的主参数接受任何数据类型,用它作例子好。
  Debug.Print IsNull(T2) '没问题
  Debug.Print IsNull(T1) '这样会出错,用 IsNull(T1.Var) 就不会出错了。
End Sub
例子2(我的后续问题):Public Type Type1 '先定义一个用户自定义类型
  Var As String
End TypePublic Type1Arr() As Type1 '申明一个变长数组用户自定义类型变量Public Sub Sub1()
  '我们假设 Fun1(Arr) 这个函数可以判断变长数组变量是否有确定的上下标
  Dim Arr1()
  Debug.Print Fun1(Arr1) '这样就知道Arr1这个变长数组变量是否有确定的上下标了。
  Debug.Print Fun1(Type1Arr) '这样会出错,因为Type1Arr是用户自定义类型变量,而用户自定义变量的主关键字是不能做为公共函数的参数的。
End Sub

解决方案 »

  1.   

    用户自定义类型做自定义函数的参数是没有问题的,而如你所述就不行了,因为VB中规定,参数传递有两种方式——值传递和地址传递,前者有三种情况:
        1、如果实参是表达式或常量;例如 fun1(9) 或 fun1(x+y)
        2、如果实参是普通变量,但变量加了括号;例如:fun1((x))
        3、如果形参前加了限制词byval
        除此以外,如果实参是变量或数组变量,那就按地址传递,按地址传递有一个规定,就是必须类型一致。
    在VB中创建标准EXE,在窗体上添加一个按钮,代码如下:
    Private Sub Command1_Click()
        Dim a(3) As pp   '去掉3也可以
        MsgBox ArrayIsNull(a)
    End Sub
    添加一个标准模块,代码如下:
    Type pp
        st As String * 10
    End Type
    '这是一个检测动态数组是否有确定的下标的函数,如果返回值为-1,表示没有确定下标。否则返回最大下标值。
    Function ArrayIsNull(x() As pp) As Integer
        On Error GoTo p
        n = UBound(x)
        ArrayIsNull = n
        Exit Function
    p:    ArrayIsNull = -1
    End Function
      

  2.   

    谢谢cy_nwau(小人物)的解答,使我对函数传递参数有了更进一步的了解。不过关于确定变长数组是否有确定下标,你也是使用捕捉错误的方法来实现的,我希望看到更好的答案,此贴再放一天,实在没有更好的答案就结贴了。