乔山办公网我们一直在努力
您的位置:乔山办公网 > excel表格制作 > EXCEL VBA与数据统计 第五章 数组和结构体-excel上下标

EXCEL VBA与数据统计 第五章 数组和结构体-excel上下标

作者:乔山办公网日期:

返回目录:excel表格制作

第五章 数组和结构体

第一节 数组

5.1.1 什么是数组

在之前的章节中,我们已经学习到了如何去定义一个变量,那么假设现在我们需要100个整形变量,如何来声明这100个整形变量呢?这100个变量又如何给命名呢?

当然,可以通过写100个变量的名称来申明这100个变量,如果有时间的话,当然可以用例如a1、a2、a3……a100来一个一个命名。

但是,即使这样命名了,如何能够把这100个变量从第1个到第100个“重新阅读”一遍?或者如何让这100个整数分别等于1到100呢?是不是还需要写a1=1、a2=2……a100=100?

在许多计算机编程语言中,我们可以把像这样的一组变量类型相同的变量定义成一个“数组”所谓数组就是在计算机中连续储存的,相同类型的变量。在VBA中,当然也可以这样做了,即我们现在可以用一个“数组”来储存这100个变量,并且通过数组下标的方式来对数组的每一个元素实现一一遍历。

在VBA中,数组有两种形式,即定长数组和可变数组。

5.1.2 定长数组

(1) 声明数组的通常做法

所谓定长数组,就是数组元素个数确定的数组,在VBA中,声明一个定长数组最常用的命令是: Dim 数组名(N) As 类型。这里需要注意的是,在默认情况下,VBA中的数组是从0号元素开始的,所以数组的元素个数等于N+1。对于数组中的元素,可以用数组名(i)的形式访问,i表示数组的第i号元素,即数组的第i+1个元素。

例如: Dim Ary(6) As Integer,声明了一个整形数组,这个整形数组中有Ary(0),Ary(1),Ary(2)、Ary(3)、Ary(4)、Ary(5) 、Ary(6),共7个元素构成。例如,下面语句,声明了一个数组,并且把0到100共计100个数保存在是这个数组中。

Dim Ary(100) As Integer, i As Integer

For i =0 to 100

Ary(i)=i

Next i

(2)指定下标范围法:

在声明定长数组的时候,也可以指定数组的下标范围。例如,Dim B(2 to 6) As Integer。这个语句中的数组B的元素为 B(2)、B(3) 、B(4) 、B(5) 、B(6),共计5个元素。

5.1.3 指定下标从1开始

VBA中也可以强制指定所有的数组下标的起始数字,使用Option Base 1语句即可以指定数组的下标从1开始。下面语句中定义了一个从A(1) 到A(100) 的100个元素的数组。

Optional Base 1

Dim A(100) As Integer

5.1.4 下标溢出

在VBA中,下表超过数组范围时,会引发”下标溢出”的错误,例如,Dim A(10) As Integer,定义了数组A,下标范围从0到10,如果现在语句中同时出现了A(11)这样的用法,则会发生数组下标溢出的错误。

但是有时候确实也不是我们自己想这样做的,可能完全忘记了自己之前的操作或者操作后发生了问题,例如,一个一个地判断这个数组A中的数字是否大于零,若大于0则放入另外一个数组B,最后输出B的最后一个元素。如果这个程序写成下面这样:

Sub GT0()

Dim A(10) As Integer,B(10) As Integer, i as Integer

for i =0 to 10

A(i)=Inputbox(“输入第” & i & “次”)

If A(i)>0 Then B(i)=A(i)

Next i

Msgbox(B(i))

End Sub

这一段看上去似乎没啥问题,确实“聪明”的我们也会说,是啊,我这个i不是变化的么?这个i应该始终是最后一个元素的序号啊。但是,事实情况并不是这样!这是因为这个循环语句的时候,是先把i的数字加上1,然后再判断i是否大于等于10的,所以,循环后的i不是最后一个元素的序号,而是最后最后一个元素的序号加上1!

5.1.5 可变数组

除了定长数组,VBA还可以支持变成数组,定义一个可变数组的方法是:Dim 数组名() As 类型。

可变数组并不可以直接拿过来就用了,在使用之前,需要重新声明一下可变宿主的长度,重新声明的方法为:

Redim [Preserve] 数组名 (N)

若使用Preserve,则表明保留之前的数组中的数,若不使用Preserve则原数组丢失。

例如:让用户随机输入若干数字,输入完毕后,计算用户输入的数字的平均数。

Sub Ave()

Dim Ary() As String, N As Integer, i As Integer, S As Double

N = 1

Do

ReDim Preserve Ary(N)

Ary(N) = InputBox("输入数字,#结束")

If Ary(N) = "#" Then Exit Do

N = N + 1

Loop

For i = 1 To N – 1

S = S + Ary(i)

Next i

MsgBox (S / (N - 1))

End Sub

这一段中,同样要注意数组长度的问题,在循环后,数组长度并不等于N,而是等于N-1.

通常用一个可变宿主接受一个字符串分割后的结果,(字符串分割后结果为一个字符串数组例)如下面一个问题,在Excel表格中的A列输入的内容为用逗号分隔开的省市,例如“安徽省,合肥市”,如何将这些省市分成两列表示。

Sub S()

Dim RngA As Range, RngB As Range, RngC As Range, i As Integer, Ch() As String

i=1

Set RngA=Range(“A:A”)

Set RngB=Range(“B:B”)

Set RngC=Range(“C:C”)

While RngA(i)<>””

Ch=Split(RngA(i),”,”)

RngB(i)=Ch(0)

RngC(i)=Ch(1)

i=i+1

Wend

End Sub

这里要注意的是,单元格里面的那个逗号务必与VBA中的Split函数中的逗号保持统一,即要么都是英语状态的逗号,要么都是汉语状态的逗号。

5.4 Range数组

其实Range变量也是一个数组,就像上面所看见的那样,一个Range变量可以用下标i直接访问这个Range区域中的单元格。Range数组下标的规定是:Range变量的左上角单元格(区域最左边最上面的单元格)为1号元素(Range数组没有0号元素,这里提醒注意!)然后向右,为2号元素……一行结束后,下一行继续编号。例如Range(‘B2:E4”)每个单元格的序号如下:

图5.1 Range(“B2:E4”)中单元格的编号

第二节 多维数组

5.2.1 什么是多维数组

多维数组是数组的延伸,即二维或者高维上的一个数组。例如一个班级学生的座位号,可以看成一个二维数组,即通过行数和列数两个数定义一个确定的单元。例如三维空间的任何一个点,都可以用(x,y,z)这样的三个数字表示。

5.2.2 多维数组的声明和访问

与一维数组相同,声明一个多维数组的方法也是Dim 数组名(N,M,L……) As 类型,数组总的元素个数等于每一个“维度”上的元素个数的乘积。例如:

Dim A(2,4) As Integer

声明了一个二维数组,数组中的数为整形,数组元素为A(0,0),A(0,1),A(0,2),A(0,3),A(0,4)

,A(1,0),A(1,1),A(1,2),A(1,3),A(1,4),A(2,0),A(2,1),A(2,2),A(2,3),A(2,4),共计15个元素。

从这个例子也可以看到,对于二维数组中元素的访问,与一维宿主相似,二维数组需要用两个数组下标来对数组实现访问。

与一维数组不同,VBA中不可以直接定义可变多维数组。因VBA中自带了Range类型变量,可以借助Range变量来定义多维可变数组。

第三节 结构体

5.3.1 什么是结构体

通过上面的内容,我们讲述了如何通过数组定义类型一致的若干个变量,这里,我们讲述一下如何通过结构体定义有相互联系的变量。例如,我们平时用的最多的一种“结构体”就是通讯号码簿,对于每一个“联系人”均有一个“姓名“,一个”地址“,一个或者若干个联系电话等。然而这里我们可以定义一个特殊的“数据类型”:来储存这种特殊的结构,就把这种数据类型称为“结构体“。那么,我们首先要确定一下这种结构都有哪些具体的部分组成呢?

首先给这种”结构“取一个名字,叫做”通讯信息“通讯信息”包括下列组成部分

姓名 字符串型

性别 字符串型

年龄 整数型

职业 字符串型

地址 字符串型

电话号码 字符串型

明确了这些组成部分之后,我们就可以定义结构体了,这里,我们先说明一下两个术语,(1)结构体名,即这个结构体的名字,在上面的例子中,为“通讯信息”。(2)成员,结构体中的基本组成部分称为结构体的“成员”,上面例子中,“姓名”是“通讯信息”的一个成员。

在VBA中,结构体的定义是在Sub、Function以外的部分,整个模块开始的位置定义。定义结构体的命令是:

[Private | Public] Type Name

VarName1 As Type1

VarName2 As Type2

……

End Type

Private、Public,指明结构体是私有还是共有。Name:结构体的名字。VarName1:结构体中成员的名字。Type1:结构体中成员的类型。

例如上面的例子,用VBA声明结构体就是:

Type CommunInfo

Name As String

Gender As String

Age As Integer

Profession As String

Address As String

Tel As String

End Type

5.3.2 结构体赋值和成员访问

上面我们声明了一种“结构体”但是并没有声明这种结构体的一个变量,所谓声明结构体的一个变量就是声明一个变量,这个变量的类型为上述的这种“结构体”类型。声明一个结构体变量的方法同声明一个整形变量、字符串型变量一致。也就是说,一旦用户通过上面的语句定义了一种“结构体”类型后,这种由用户自己定义的类型就可以同系统中内置的类型一样使用了!

例如Dim A As CommunInfo 这样就定义了一个变量A,这个变量A为上面我们定义的CommunInfo类型。

对于这个结构体A的赋值,需要通过对其成员一一赋值来实现。

结构体的成员访问通过一个小点(即英文的句号)来实现,例如上面的例子中,A.Name实现对A结构体中Name这个成员的访问。

我们可以写成 A.Name=”LiLei” 这样就把A这个结构体变量的Name改为了“LiLei“。也可以另外定义一个这种”结构体”变量B,然后把A赋值给B,即B=A,这样就实现了把A中所有的成员赋值给B结构体了!

5.3.3 结构体数组

既然结构体也是一种类型,那么我们当然可以定义一个数组,这个数组的所有元素为“结构体”,定义这样一种“结构体数组”的方法就是Dim 数组名(N) As 结构体类型。可变数组时,不用N。

例如,我们可以通过一个“结构体数组”储存一下每天细胞培养的数据。

Type CellCult()

LCC As Single

Via As Single

Glu As Single

Lac As Single

End Type

Dim Cel1(14) As CellCult

这样就定义了一个数组Cel1,总共有15个元素,分别储存培养0到14天的数据,对于每一天的培养数据。用一个类型为“CellCult”的结构体来储存,这个结构体包括细胞密度LCC、细胞活率Via、葡萄糖浓度Glu以及乳酸浓度Lac四个成员。例如,对于培养第3天的葡萄糖浓度,表示为Cel1(3).Glu。

第四节 枚举类型

5.4.1 枚举

所谓的枚举就是一个一个地“举例”出来,例如“星期”可以枚举,不过从“星期日”到“星期六”。“月份”也可以枚举,即从“1月”到“12月”。

5.4.2 枚举类型

VBA中的枚举类型就是这样一种类型,即类型的数字范围已经确定的类型。枚举类型的好处:让用户只可以在枚举类型的范围内输入数据。在进行程序设计或者使用设计的程序的时候,往往不希望用户输入我们设想数值以外的数字,例如,在“星期”这样一个变量中,我们并不希望用户输入例如8、9这样的数字,也不希望用户输入例如2.3、5.4这样的数字。

VBA对于枚举类型的定义方法是:

Enum 枚举类型名

枚举名称1=常量1

枚举类型2=常量2

……

End Enum

这个定义方法与结构体的定义方法比较类似,声明一个枚举类型变量的方法也是Dim 变量名 As 枚举类型名。

例如,可以将一周的“周日”到“周六”列成枚举类型:

Enum Day

Sunday = 0

Monday = 1

Tuesday = 2

Wednesday = 3

Thursday = 4

Friday = 5

Saturday = 6

End Enum

这里可以观察到,在Sunday的后面有一个“=0“,Monday后面有一个”=1“……这里这个数字成为“枚举量“,即在一个枚举类型的变量a中,让a=Sunday和让a=0的效果是一样的。最后这个a的值均为0.

相关阅读

关键词不能为空
极力推荐
  • excel如何转换成pdf文件?-excel转pdf

  • excel转pdf,excel转pdf图12、选完要转换的类型后我们就点击下方的“添加文件”并找到我们要转换的文件位置,并将它添加到转换列表中。

ppt怎么做_excel表格制作_office365_word文档_365办公网