贝壳电子书 > 基础科学电子书 > excel_vba_编程教程(完整版) >

第44章

excel_vba_编程教程(完整版)-第44章

小说: excel_vba_编程教程(完整版) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



行和第一列里(1;1),而最后一个成员则位于第五行和第三列里的(5;3)。下面,我们来给该数组填 
充一些数据。下面显示的二维数组储存了国家名称,它的货币名称以及和美元的汇率。  
Japan         Japanese Yen       128。2  
(1;1)         (1;2)              (1;3)  
Mexico        Mexican Peso       9。423  
(2;1)         (2;2)              (2;3)  
Canada        Canadian Dollar    1。567  
(3;1)         (3;2)              (3;3)  
Norway        Norwegian Krone    8。351  
(4;1)         (4;2)              (4;3)  

                                          123 

… 页面 140…

Hungary       Hungarian Forint   266。7  
(5;1)         (5;2)              (5;3)  
尽管VBA数组最大可以拥有60维,但是,绝大多数人发现非常困难去想象超过三维的数组。三维的 
数组是一个具有相同行数和列数的表格的集合。在三维数组里的每个成员由下面三个数据决定:行 
号,列号和表格号。  
技巧7…1 数组变量是什么?  
数组是拥有共同名称的变量的集合。一个典型的变量只能储存一个数据,然而,一个数组变量却能 
够储存大量的变量。你可以使用变量名称和索引号来指向数组中某个确定的数据。  
技巧7…2 下标变量  
数组变量的括号里的数字成为下标,而每个单独的变量则称为下标变量或成员。例如,cities(6) 
是cities数组里的第六个下标变量(成员)。  

2。声明数组  

因为数组也是变量,所以,你必须用声明其它变量的类似方法声明数组——使用Dim语句。当你声 
明一个数组时,你便设定了该数组储存数据所需要的内存空间。  
我们来看看一个数组声明的例子:  
Dim cities(6) As String   
Dim daysOfWeek(7) As String   
Dim lotto(6) As Integer   
Dim exchange(5; 3) As Variant   
注意,变量名称后面带有括号以及括号里有数字。一维数组要求括号里带一个数字,这个数字决定 
了这个数组能够储存的最大成员数。二维数组后面总是带有两个数字——第一个数字是行索引号, 
而第二个数字是列索引号。在上面的例子里,数组exchange最多可以储存15个数据(5*3=15)。  
数组声明的最后一部份是定义数组将要储存数据的数据类型。数组可以储存下列任何一种数据类 
型:Integer; Long; Single; Double; Variant; Currency; String; Boolean; Byte; or Date。  
当你声明了一个数组,VB会自动占据足够的内存空间,分配的内存空间取决于该数组的大小和数据 
类型。当你声明一个名叫lotto的带有6个成员的一维数组时,VB将留出12个字节——数组的每个成 
员各占2个字节(回想整型数据类型为2个字节,因此2*6=12)。数组越大,储存数据需要的内存空 
间就越大。因为数组会吃掉很多内存,并因此影响你电脑的运行,因此,建议你仅仅根据你可能使 
用的成员数来声明数组。  

3。数组的上界和下界  

VBA默认将数组的第一个成员设置为0(译者:索引号),因此,数字1代表数组中的第二个成员,而 
数字2则代表第三个,等等。因为数字编号起始于0,所以,一维数组cities(6)包含从0到6的七个 
成员。如果你宁愿从1开始计数你数组里的成员,那么你可以使用Option Base 1语句来强制指定该 
数组的下界。该指令必须置于VBA模块任何Sub语句上面的声明部分。如果你不明确Option Base 1, 
那么VBA在使用数组是就会假定使用Option Base 0来从0开始编号你的数组成员。  
你也可以让数组从除0或1之外的数字开始编号,要达到该目的,你在声明数组变量时就必须明确该 
数组的边界。数组的边界是指它最小和最大的索引号。我们来看看下面的例子:  
Dim cities(3 To 6) As Integer   
上面的语句声明了一个带有四个成员的一维数组。数组名称后面括号里的数字明确了数组的下界 
 (3)和上界(6)。该数组的第一个成员编号为3,第二个为4,第三个为5,以及第四个为6。注意 
下界和上界之间的关键字To。  
技巧7…3 数组范围  
Dim语句明确的数组的下标区间就称为数组的范围,例如:Dim mktgCodes(5 To 15)  

4。在 VBA 过程里使用数组  

你声明了数组后,就必须给该数组的每个成员赋值,这也经常成为“填充数组”。我们来尝试使用 
一维数组有规划地显示六个美国城市的清单:  
1。  打开一个新工作簿,并保存为Chap07。xls  
2。  切换到VB编辑器窗口,并重新命名VBA工程为Tables  

                                          124 

… 页面 141…

3。  插入一新模块,重新命名为StaticArrays  
4。  输入下列过程FavoriteCities:  
' start indexing array elements at 1 从1开始给数组成员编号  
Option Base 1   
Sub FavoriteCities()   
'now declare the array   
Dim cities(6) As String   
'assign the values to array elements   
cities(1) = 〃Baltimore〃   
cities(2) = 〃Atlanta〃   
cities(3) = 〃Boston〃   
cities(4) = 〃Washington〃   
cities(5) = 〃New York〃   
cities(6) = 〃Trenton〃   
'display the list of cities   
MsgBox cities(1) & Chr(13) & cities(2) & Chr(13) _   
  & cities(3) & Chr(13) & cities(4) & Chr(13) _   
  & cities (5) & Chr(13) & cities(6)   
End Sub   
在FavoriteCities过程开始之前,缺省的索引编号方式改变了,注意,Option Base 1语句是位于 
模块窗口Sub语句之上的。该语句告诉VB给数组的第一个成员赋值数字1,而不是缺省的0。  
数组cities()声明为带六个成员的字符串类型变量。然后,给数组的每个成员都赋上了值。最后的 
语句使用Msgbox函数显示城市清单。当你运行该过程时,城市名称将会出现在分开的行上(参见图 
7…1)。你可以改变显示数据的顺序,改变索引号。  

                     
图7…1 你可以用Msgbox函数来显示一维数组的成员  
5。  运行FavoriteCities过程并且检查结果  
6。  修改FavoriteCities过程,让它逆序显示城市名称(从6到1)  
技巧7…4 数组成员的初始值  
在给数组成员赋值之前,该成员具有缺省值。数字变量的缺省值为0,而字符串变量的缺省值为空 
字符串。  

5。数组和循环语句  

现在要执行一些例如填充数组或显示数组成员的任务了,你在第六章里学过的好些个循环语句(参 
见For…Next和For Each …Next循环)就变得非常方便了。现在是时候将你所学到的技巧结合起来 
使用了。如何重新编写FavoriteCities过程,让每个城市名称在不同的信息框里显示出来?  
下面显示的过程FavoriteCities2将原来过程的最后部分取代为For Each…Next循环:  
Sub FavoriteCities2()   
  'now declare the array   
  Dim cities(6) As String   
  Dim city As Variant   
  'assign the values to array elements   

                                          125 

… 页面 142…

  cities(1) = 〃Baltimore〃   
  cities(2) = 〃Atlanta〃   
  cities(3) = 〃Boston〃   
  cities(4) = 〃Washington〃   
  cities(5) = 〃New York〃   
  cities(6) = 〃Trenton〃   
  'display the list of cities in separate messages   
  For Each city in cities   
       MsgBox city   
  Next   
End Sub  
注意For Each…Next循环使用的是Variant数据类型的变量city。回想在前面的章节里,For  
Each…Next让你在一个集合的所有对象间或者一个数组的所有的成员间循环,并且对每个对象或成 
员执行同样的操作。当你运行过程FavoriteCities2时,数组里有几个成员循环就会执行几次。  
我们来看一下过程FavoriteCities的另一种变化。在第四章里,你练习了将参数作为变量传递给子 
过程和函数。过程FavoriteCities3示范了如何将数组的成员传递给另一个过程。  
1。  在当前模块里,输入下述两个过程:  
Sub FavoriteCities3()   
  'now declare the array   
  Dim cities(6) As String   
  'assign the values to array elements   
  cities(1) = 〃Baltimore〃   
  cities(2) = 〃Atlanta〃   
  cities(3) = 〃Boston〃   
  cities(4) = 〃Washington〃   
  cities(5) = 〃New York〃   
  cities(6) = 〃Trenton〃   
  'call another procedure and pass the array as argument   
  Hallo cities()   
End Sub   
Sub Hallo (cities() As String)   
  Dim counter As Integer   
  For counter = 1 to 6   
       MsgBox 〃Hello 〃 & cities(counter)   
  Next   
End Sub   
过程Hallo的声明里有一个数组类型的参数——cities()。  
2。  运行过程FavoriteCities3。将一个子过程的数组成员传递给另一个子过程或者函数过程让你 
    可以在许多过程里使用相同的数组,而不需要重复的程序代码。  
技巧7…5 在过程之间传递数组  
当一个数组在一个过程里被声明时,它是局部的,并且是不为其他过程所知的。然而,你可以将局 
部数组传递给其它的过程,通过在声明语句里,写上数组名称,并且后面紧跟一对空括号。例如, 
语句Hallo cities() 调用一个名叫Hallo的过程,并且将数组cities()传递给它。  
这里有个例子,如何将你新学到的关于数组的知识和循环运用到现实生活中。如果你是个狂热的彩 
票玩家的话,当你厌倦了选择你的幸运号码,你可以让VB为你选择。下面的过程Lotto使用1到51 
的六个数字填充数组:  
Sub Lotto()   
  Const spins = 6   
  Const minNum = 1   
  Const maxNum = 51   

                                         126 

… 页面 143…

  Dim t As Integer ‘looping variable in outer loop 外部循环变量  
  Dim i As Integer ‘looping variable in inner loop 内部循环变量  
  Dim myNumbers As String ‘string to hold all picks 储存选号的字符串  
  Dim lucky(spins) As String ‘array to hold generated picks 储存产生的选号的数组  
  myNumbers = 〃〃   
  For t = 1 To spins   
     Randomize   
     lucky(t) = Int((maxNum…minNum+1) * Rnd )+ minNum)  
     'see if this number was picked before 检查本数字是否之前被选出来过  
     For i = 1 To (t…1)  
       If lucky(t)=lucky(i) Then   
              luck

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的