VBA中ReDim语句的语法

分享成果,随喜正能量】一段路,走了很久,依然看不到希望, 那就改变方向; 一件事,想了很久, 依然纠结于心,那就选择放下;一些人,交了很久,依然感觉不到真诚, 那就选择离开;一种活法,坚持了很久,依然感觉不到快乐,那就选择改变。断、舍、离,放下过去,让心归零!。

《VBA经典应用69例》,是我推出的第九套教程,教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开,这套教程案例众多,紧贴“实战”,并做“战术总结”,以便大家能很好的应用。教程的目的是要求大家在实际工作中要利用好VBA。本套教程共三册六十九个专题,今日内容是教程的应用9:VBA中ReDim语句的语法

大家好,我们这讲开始一个新的应用专题讲解,就是VBA中的ReDim声明语句,这个专题应用的讲解也是结合给学员答疑的频度来讲解的,很多学员都问我ReDim的用法,所以我将努力结合我多年应用经验并结合一些经典的用法展示给大家。

ReDim语句用于在VBA中声明动态数组的大小。以后可以根据需要多次使用它,并重新声明数组的大小。它只能用于动态VBA数组(在原始声明中未声明数组大小),不适用于固定VBA 数组(在原始声明中声明数组大小)。

这个语句在过程级使用, 用于为动态数组变量重新分配存储空间。

语法:ReDim [ Preserve ] varname ( subscripts ) [ As type ], [ varname ( subscripts ) [ As type ]] . . .

参数:

1)Preserve 可选。关键字,用于在更改最后一个维度的大小时将数据保存在现有数组中。

2)varname 必需。 变量的名称;紧跟命名约定的标准变量。

3)subscripts 必需。 数组变量的维度;最多可以声明 60 个维度。下标参数使用以下语法:

[lowerTo] upper [,[ lowerTo ] upper] . . .

如果未明确规定 lower的下限, 则由Option Base语句控制数组的下限。如果不存在 Option Base 语句,则下限为零。

4)type 可选。 变量的数据类型;可以是Byte、 Boolean、 Integer、 Long、 Currency、 Single、Double、Decimal (目前不支持)、 Date、 String (对于可变长度字符串) 字符串长度(对于固定长度的字符串)、对象、变量、用户定义类型或对象类型。

对要定义的每个变量使用单独的As type子句。 对于包含数组的 Variant,type 描述数组的每个元素,但不会将 Variant 更改为某种其他类型。

  • 可以反复使用ReDim语句来更改数组中的元素和维度的数目。 但是,不能先声明一种数据类型的数组,然后使用ReDim将该数组更改为其他数据类型,除非该数组包含在 Variant中。如果数组包含在Variant中,则可以使用As type子句更改元素的类型, 除非使用Preserve关键字, 在这种情况下, 不允许对数据类型进行任何更改。
  • 如果使用Preserve关键字,则只能调整最后一个数组维度的大小,并且无法更改维度数目。例如,如果你的数组只有一个维度,则可以调整该维度的大小,因为它既是最后一个维度,也是唯一的一个维度。但是,如果数组有两个或更多维度,则只能更改最后一个维度的大小并保留数组的内容。

[待续]

本讲内容参考程序文件:应用009.xlsm

我20多年的VBA实践经验,全部浓缩在下面的各个教程中:

分享成果,随喜正能量】简单,是自由的根基。而复杂的关系就像蜘蛛网,你不能成为蜘蛛,就只能成为虫子。。

VBA|比较怪异的一些语法规则

C、C++、Java、python等一众流行编程语言,其语法规则有较大的相似性。

唯独VB、VBA的一些语法规则比较怪异,一枝独特。

VBA使用关键字Dim和As声明变量,类型后置,As和后面的类型可选。

不鼓励使用类型提示(Type Hints)。由于历史和向后兼容性的原因,下面是一些演示。建议改用As[DataType]语法。

  • Option Base 0 :数组索引值从0开始
  • Option Base 1 :数组索引值从1开始
  • Dim MyArray(10) :声明一个数组变量,10是最大的可用的数组索引值
  • MyArray(5) = 101 :给数组的元素赋值
  • Dim Data(10,5) :声明一个二维数组变量
  • Data(1,1) = \”A001\” :给数组元素赋值
  • Dim cArr(-11 To 20, 1 To 3) As String :声明一个数组,定义数组索引值的上下界
  • Dim dArr() As String :声明动态数组
  • ReDim dArr(0 To 5, 1 To 2) :改变动态数组的尺寸默认把原数据清除。如果保留原来的数据,必须加上参数
  • Preserve:使用Preserve参数时只能改变最后一位的大小
  • If UBound(vTemp) = -1 Then:判断数组变量vTemp是否为空数组
  • End If Erase MyArrar, Data Erase语句清除数组元素,释放变量占用的空间

使用set来定义对象变量(给对象变量赋值);

后面一般都需要:

它们到底起到什么作用?释放内存?

当一个对象实例化时,系统自动实例化一个对象,然后接受引用,每引用一次,则计数器加一,每=nothing一次,则计数器减一,当计数器为0时,系统有可能释放对象的实例。

准确地说是减少对象引用计数,并使变量指向nothing,当对象的引用计数为0时,系统(注意不是“你”)才会释放对象,只是一般情况只用一个变量指向对象,所以也可直接理解为释放对象,不过还是要注意差别的。

Set XXX = Nothing \’ 这并不是释放那个对象, 它只是断开这个变量与对象本身的引用, 当那个对象的引用计数变成 0, 它就会被释放掉。

这个是释放掉一个对象实例,并且引用计数-1。

如果一个对象被一个以上变量引用, Set XXX = Nothing(其中一个) 后那个对象依然存在。

在 VB6 中,字符串函数有两个版本,分别是带 $ 的和不带 $ 的。带 $ 的还是与老版本相同,不带 $ 的是以 Unicode 方式工作的。

VB中函数名后的“$”符号什么意思?

Left是返回Variant数据类型,而Left$是返回String数据类型,后者要块。

一些解释是说对旧版的支持。

引用传递ByRef:

过程在Excel中可以通过菜单、工具栏、按钮、快捷键等方式直接调用,函数可以在工作表的公式中如同内置函数一样调用。

过程和函数在模块内可以直接调用,也可以使用OnTimeOnKey方法间接调用

对许多内建函数、语句和方法,Visual Basic 提供了命名参数方法来快捷传递参数值。对命名参数,通过给命名参数赋值,就可按任意次序提供任意多参数。为此,键入命名参数,其后为冒号、等号和值 (MyArgument := \”SomeValue\”) ,可以按任意次序安排这些赋值,它们之间用逗号分开

在调过程或方法调用时,参数是否使用括号?视是否使用其参数而定:

更多细节参照:

On Error 语句启动一个错误处理程序并指定该子程序在一个过程中的位置,也可用来禁止一个错误处理程序。该语句共有以下3 种语法格式。

On Error GoTo line:启动错误处理程序,且该例程从必要的line 参数中指定的line开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到line,激活错误处理程序。指定的line 必须在一个过程中,这个过程与On Error语句相同,否则会发生编译时间错误。

On Error Resume Next:说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用OnError GoTo。

On Error GoTo 0:禁止当前过程中任何已启动的错误处理程序。

7.1 Collection

Collection相当于其它语言的set:

7.2 Dictionary

Dictionary相当于其它语言的map。

以下代码将延时10 秒:

以上代码首先保存系统的一个时间,再通过循环反复检测当前时间是否超过预调的时间,如果未超过,则一直执行该循环,直到超过为止,这样就达到了延时的目的。

在以上代码的循环体中包含了DoEvents 函数,该函数用来转让控制权,以便让操作系统处理其他的事件。

如果以上代码不包含DoEvents 函数,则计算机在执行这段延时程序时,将不允许在Excel 中进行其他操作,直到延时循环执行结束。

DoEvents 函数

转让控制权,以便让操作系统处理其它的事件。

VBA supports legacy-style (e.g. QBASIC) line numbers. The Erl hidden property can be used to identify the line number that raised the last error. If you\’re not using line numbers, Erl will only ever return 0.

标准模块只包含过程、类型以及数据的声明和定义。在Visual Basic 的早期版本中,将标准模块看作代码模块。

Excel VBA是基于对象的编程语言。其本身有丰富的层次对象模型,也可以引入外部应用的对象模型:

这些外部对象库当然包括自己的全家桶。

微软公司提供的自动化技术可以将某一个应用程序的功能当作一系列的对象提供给其他的外部应用程序,这个外部应用程序就可以使用这些对象,这个过程被称为自动化(Automation)。自动化就是通过一个应用程序来控制另外一个应用程序的处理过程。

绝大多数支持自动化的应用程序都提供一个对象库。该对象库为控制器应用程序提供了服务器应用程序中可以使用的对象的有关信息。如使用自动化技术来控制Word,就是用Word 作为服务器应用程序,因而需要在Excel 中引用Word对象。

在VBA 程序中,可使用Range(\”A1:C3\”)样式引用单元格区域。如果需要动态选择单元格区域,其A1 引用样式不方便随程序动态变化,这时可对Range 对象的Range 属性用以下格式进行处理:

式中,Cell1 和Cell2 可分别用行列索引号指定一个单元格,创建的Range 对象是以这两个单元格为对角所形成的区域。创建动态单元格区域可使用以下几种方式:

同时在“Sheet1”、“Sheet2”和“Sheet3”三个工作表中的“A1:E1”区域设置边框线。

返回R1C1 样式的引用:

引用方式A1和R1C1转换

ref

吴永佩,成丽君 《征服Excel VBA:让你工作效率倍增的239 个实用技巧 》

-End-

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。