Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> VBA  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1702340
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何动态定义数组大小?

作者:cg1  摘自:access911.net  :cg1  更新日期:2003-11-10  浏览人次:

 

问题:

如何动态定义数组大小?
如何在重定义该数组的大小时,不清除其中的数据?

 

回答:

Access 中 (VBA中)更改数组时,只能在更改最末维大小时保持数组中的数据。
Redim 可以用来重定义数组大小,它有一个可选关键字 Preserve 
Preserve 可选关键字用来当改变原有数组最末维的大小时,使用此关键字可以保持数组中原来的数据。 
请看以下示例:

Function testRedim()
    Dim i As Integer
    Dim a() As String
    '赋值
    For i = 1 To 20
        ReDim Preserve a(i)
        a(i) = "test" & CStr(i)
    Next i
    
    '测试结果
    For i = 1 To 20
        Debug.Print a(i)
    Next i
End Function

以下源自帮助:

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 变量。

--------------------------------
eg.
--------------------------------
ReDim 语句示例
该示例使用 ReDim 语句为动态数组变量分配和重分配存储空间。假设 Option Base 是 1。

Dim MyArray() As Integer    '声明动态数组。
Redim MyArray(5)    '分配 5 个元素。
For I = 1 To 5    '循环 5 次。
    MyArray(I) = I    '初始化数组。
Next I

下一条语句重定义该数组的大小,并清除其中的元素。

Redim MyArray(10)    '大小重定为 10 个元素。
For I = 1 To 10    '循环 10 次。
    MyArray(I) = I    '初始化数组。
Next I

下面的语句重定义该数组的大小,但没有清除其中的元素。

Redim Preserve MyArray(15)    '大小重定为 15 个元素。

 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接


 

 
相关文章
     没有手动相关文章
     如何对一维数组或者二维数组进行排序?
     在 windows XP | 2003 中如何自定义纸张大小?
     如何实现让客户动态的改变(用鼠标拖移)窗体上控件的位置以及大小
     如何建立动态公式的工资系统?
     Access不编程生成菜单,自定义菜单如何调用自定义过程?
     为什么老出现XXX函数未定义错误?
     新手来看:数据库体积变大问题
     在Jet SQL查询中,如何区分大小写?
     用VBA灵活生成查询,动态生成查询
     数据定义查询不会怎么办?
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利