我知道可以
dim str() as string
str(0)="0"   ////系统报数组越界
但又不能声明 dim str(n) as string
请问 如何声明一个不定长的数组

解决方案 »

  1.   

    dim str() as stringredim str(0) as stringstr(0)="0"
      

  2.   

    dim str() as stringredim str(0) 
    str(0)="0"不好意思!上面有点错误
      

  3.   

    那能
    dim str() as string 
    dim n as integer
    redim str(n) as string
      

  4.   

    Dim str() As StringReDim str(10)
    str(0) = "0" '这样就不会出错了
      

  5.   

    ReDim 语句在过程级别中使用,用于为动态数组变量重新分配存储空间。语法ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]] . . .ReDim 语句的语法包括以下几个部分:部分 描述
    Preserve 可选的。关键字,当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。
    varname 必需的。变量的名称;遵循标准的变量命名约定。
    subscripts 必需的。数组变量的维数;最多可以定义 60 维的多维数组。subscripts 参数使用下面的语法:
    [lower To] upper [,[lower To] upper] . . .
    如果不显式指定 lower,则数组的下界由 Option Base 语句控制。如果没有 Option Base 语句则下界为 0。
    type 可选的。变量的数据类型;可以是 Byte、Boolean、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(对变长的字符串)、String * length(对定长的字符串)、Object、Variant、用户定义类型或对象类型。所声明的每个变量都要有一个单独的 As type 子句。对于包含数组的 Variant 而言,type 描述的是该数组的每个元素的类型,不能将此 Variant 改为其它类型。
    说明ReDim 语句用来定义或重定义原来已经用带空圆括号(没有维数下标)的 Private、Public 或 Dim 语句声明过的动态数组的大小。可以使用 ReDim 语句反复地改变数组的元素以及维数的数目,但是不能在将一个数组定义为某种数据类型之后,再使用 ReDim 将该数组改为其它数据类型,除非是 Variant 所包含的数组。如果该数组确实是包含在某个 Variant 中,且没有使用 Preserve 关键字,则可以使用 As type 子句来改变其元素的类型,但在使用了此关键字的情况下,是不允许改变任何数据类型的。如果使用了 Preserve 关键字,就只能重定义数组最末维的大小,且根本不能改变维数的数目。例如,如果数组就是一维的,则可以重定义该维的大小,因为它是最末维,也是仅有的一维。不过,如果数组是二维或更多维时,则只有改变其最末维才能同时仍保留数组中的内容。下面的示例介绍了如何在为已有的动态数组增加其最末维大小的同时而不清除其中所含的任何数据。ReDim X(10, 10, 10)
    . . .
    ReDim Preserve X(10, 10, 15)同样地,在使用 Preserve 时,只能通过改变上界来改变数组的大小;改变下界则会导致错误。如果将数组改小,则被删除的元素中的数据就会丢失。如果按地址将数组传递给某个过程,那么不要在该过程内重定义该数组的各维的大小。在初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素作为各自独立的变量进行初始化。在使用引用对象的变量之前,必须使用 Set 语句将一个已有的对象赋给该变量。在被赋值之前,所声明的对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。小心   如果 ReDim 语句所使用的变量在模块级别或过程级别不存在,则该语句就相当于一个声明语句。如果此后在一个更广的范围内又创建了同名的变量,即使使用了 Option Explicit,ReDim 也将使用后声明的这个变量,且不会导致编译错误。为了避免这种冲突,就不应把 ReDim 作为声明语句使用,而只应作为重定义数组大小的语句。注意   要改变 Variant 所包含的数组的大小,必须在试图改变其数组大小之前显式声明该 Variant 变量。
      

  6.   

    也就是说不能 
    redim str(n)
    了啊
      

  7.   

    3.5.3 动态数组
       Dim a() As Inteqer  当我们在程序中要改变动态数组的大小时,我们要使用ReDim语  Redim  a ( 1 To 5 )
    使用动态数组时,要注意下面几点:
     ReDim语句只能放在过程中,而不能放在模块的声明部分。因为· ReDim 语句是可执行的,而Dim ,private 等是不可执行的。· 不能用ReDim语句改变动态数组的类型。比如,下面的用法是错误
    dim ()A as Inteaer
    ReDim a(1 to 5)as long
    · 在使用ReDim语句改变动态数组的大小时, VlsuaI Basic会自动为元素赋初值,而该数组中原值丢丰。为了保留原有元素所存储的值,我们可以使用Preserve关键字,比如:    dim a() as Intrger
        ReDim a(1 to 3)
    a(1)=1;
    a(2)=1;
    a(3)=1;
    Redim preserve a (1 To 5)    这样,动态数组的5个元素的值将分别是1、2、3、0、0。
    使用了pre1serve关键字的ReDim语句只能改变动态数组的上界,而不能改变动态数组的下界。如果试图执行下面的语句,将产生错误:
    dim a() as Intrger
        ReDim a(1 to 3)
    a(1)=1;
    a(2)=1;
    a(3)=1;
    Redim preserve a (2 To 3) 
      

  8.   

    怕你看不全:
    3.5数组3.5.2  定长数组 Dim a(1 to 10) as Intrger缺省情况下,数组的下界是0但如果在模块声明部分写下:  Option Base 1 则下界将是13.5.3 动态数组
       Dim a() As Inteqer  当我们在程序中要改变动态数组的大小时,我们要使用ReDim语  Redim  a ( 1 To 5 )
    使用动态数组时,要注意下面几点:
     ReDim语句只能放在过程中,而不能放在模块的声明部分。因为· ReDim 语句是可执行的,而Dim ,private 等是不可执行的。· 不能用ReDim语句改变动态数组的类型。比如,下面的用法是错误
    dim ()A as Inteaer
    ReDim a(1 to 5)as long
    · 在使用ReDim语句改变动态数组的大小时, VlsuaI Basic会自动为元素赋初值,而该数组中原值丢丰。为了保留原有元素所存储的值,我们可以使用Preserve关键字,比如:    dim a() as Intrger
        ReDim a(1 to 3)
    a(1)=1;
    a(2)=1;
    a(3)=1;
    Redim preserve a (1 To 5)    这样,动态数组的5个元素的值将分别是1、2、3、0、0。
    使用了pre1serve关键字的ReDim语句只能改变动态数组的上界,而不能改变动态数组的下界。如果试图执行下面的语句,将产生错误:
    dim a() as Intrger
        ReDim a(1 to 3)
    a(1)=1;
    a(2)=1;
    a(3)=1;
    Redim preserve a (2 To 3) 
    4 多维数组    Dim a(0 to 5, 0 to 10) As Long
        a   (3,4) = vbBlue
        这样,我们就将蓝色赋给了坐标为(3, 4)的点。 可以声明更多维的数组,如:
            Dim a ( 5,3,3, 1 To 2 ) As lnteger
        对于动态数组来说,无论是一维还是多维的,声明的方式是一样的,都可以按如下式声明:
     Dim a() as integer
        然后,在使用ReDim语句改变动态数组的大小时,随时指定该数组的大小和维数:
        ReDim a ( 1 To l0,0 To 10 )
    在这里要注意,对于多维的动态数组,如果在ReDim语句中使用Preserve关键字,只能改变最后一维的上界,否则就要出错。