友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
飞读中文网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

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

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



过程和函数。过程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   
              lucky(t) = Int((maxNum–minNum+1) * Rnd)+ minNum) i = 0   
       End If   
     Next i   
     MsgBox 〃Lucky number is 〃 & t & lucky(t)   
     myNumbers = myNumbers & 〃 –〃 & lucky(t)   
  Next t   
  MsgBox 〃Lucky numbers are 〃 & myNumbers   
End Sub   
Randomize语句将随机数字发生器初始化。指令Int((maxNum…minNum+1) * Rnd + minNum)使用函数 
Rnd来产生一个在minNum和maxNum之间的随机数值。函数Int将随机数转变为一个整数。除了给 
minNum和maxNum赋予常量之外,你也可以使用函数InputBox从用户那里获得数据。  
内部For…Next循环确保每个选出的数字是唯一的——它不能是之前选出的任何一个数字。如果你 
忽略了内部循环并且多次运行该过程,你很可能看到重复的号码。  

6。使用二维数组  

既然你已经知道了如何有规划地产生一个清单(一维数组),是时候仔细看一下如何使用数据表了。 
下面的过程产生一个二维数组,储存国家名称,货币名称和交换汇率。  
Sub Exchange()   
  Dim t As String   
  Dim r As String   
  Dim Ex(3; 3) As Variant   
     t = Chr(9) 'tab   
     r = Chr(13) 'Enter   
     Ex(1; 1) = 〃Japan〃   
     Ex(1; 2) = 〃Yen〃   
     Ex(1; 3) = 128。2   
     Ex(2; 1) = 〃Mexico〃   
     Ex(2; 2) = 〃Peso〃  
     Ex(2; 3) = 9。423   
     Ex(3; 1) = 〃Canada〃   
     Ex(3; 2) = 〃Dollar〃   
     Ex(3; 3) = 1。567   
     MsgBox 〃Country 〃 & t & t & 〃Currency〃 & t & 〃per US〃 _   
       & r & r _   
       & Ex(1; 1) & t & t & Ex(1; 2) & t & Ex(1; 3) & r _   
       & Ex(2; 1) & t & t & Ex(2; 2) & t & Ex(2; 3) & r _   
       & Ex(3; 1) & t & t & Ex(3; 2) & t & Ex(3; 3); ; _   
       〃Exchange〃   
End Sub   

                                          127 

… 页面 144…

当你运行过程Exchange时,你将看到一个信息框,显示三列信息(见图7…2)  

                                 
图7…2 显示在信息框上的文本是可以自定义格式的。  

7。静态和动态数组  

到目前为止,本章介绍的都是静态数组。静态数组是具有确定大小的数组。当你事先知道数组的大 
小时使用静态数组。静态数组的大小是在数组的声明语句里确定的,例如,语句Dim Fruits(10) As  
String声明了一个由10个成员组成的叫做Fruits的静态数组。  
但是,万一你不肯定你的数组会包含多少个成员呢?如果你的过程由用户输入决定,每次程序执行 
时,用户提供的成员数可能会变化的。你如果确保你声明的数组不会浪费内存呢?  
回想你声明了一个数组后,VBA会留出足够的内存来储存数组。如果你声明一个比你需要的更多成 
员的数组的话,你将浪费计算机资源。这个问题的解决方法是让你的数组变为动态的。动态数组是 
大小可以改变的数组。如果数组的大小每次都由程序运行而决定的话,就使用动态数组。  
技巧7…6 固定大小的数组  
静态数组包含固定成员个数。静态数组的成员个数在它被声明后就再也不能改变了。  
要声明动态数组,那么不要在数组名称后面的括号里放置数字:  
Dim Fruits( ) As String   
动态数组通过在数组名称后面附带空括号来声明。在你使用动态数组于过程里之前,你必须使用 
ReDim语句来动态地设置数组的上界和下界。ReDim语句随着程序代码的执行重新设定数组大小, 
ReDim语句通知VB数组的新大小,这个语句可以在同一个过程里多次使用。现在,我们来看看如何 
使用动态数组。  
1。  在当前工程里插入一个新模块并且重新命名为DynamicArrays  
2。  输入下列过程DynArray:  
Sub DynArray( )   
  Dim counter As Integer   
  'declare a dynamic array   
  Dim myArray( ) As Integer   
  'specify the initial size of the array   
  Redim myArray(5)   
  Workbooks。Add   
  'populate myArray with values   
  For counter = 1 to 5   
     myArray(counter) = counter +1   
     ActiveCell。Offset(counter…1; 0)。Value = myArray(counter)   
  Next   
  'change the size of myArray to hold 10 elements   
  Redim Preserve myArray(10)  
  'add new values to myArray   
  For counter = 6 To 10   
     myArray(counter) = counter * counter   
     With ActiveCell。Offset(counter…1; 0)   
       。Value = myArray(counter)   
       。Font。Bold = True   

                                          128 

… 页面 145…

     End with   
  Next counter   
End Sub   
3。  将你的Excel窗口和VB编辑器窗口并排显示  
4。  逐步运行过程DynArray。你可以将鼠标置于代码中间,并且按下F8来执行逐条语句。程序 
    DynArray的结果如下图所示。  

                                                                                          
图7…3 显示10个数据的数组  
在过程DynArray里,Dim myArray() As Integer语句声明了一个叫做myArray的动态数组。尽管该 
语句声明了数组,但是,没有分配任何内存给该数组。第一条ReDim语句明确了myArray的开始大小 
并且占据了10个字节的内存让它储存5个成员,正如你所知,每个整型数据需要两个字节的内存。 
语句Workbooks。Add打开一新工作簿,然后For…Next循环用数据填充数组myArray并且将数组的成 
员写入工作表。在循环开始之前,变量counter等于1。循环里的第一条语句:  
myArray(counter) = counter + 1   
分配数值2给myArray的第一个成员。第二条语句:  
ActiveCell。Offset(counter…1; 0)。Value = myArray(counter)   
将myArray成员的值输入到当前单元格里。当前单元格为A1。因为变量counter等于1,所以上面的 
语句就等于:  
ActiveCell。Offset(1…1; 0)。Value = myArray(1)   
或者  
ActiveCell。Offset(0;0)。Value = myArray(1)   
上面的语句在单元格A1里输入数据。循环里面的语句被执行5次。VB在合适的工作表单元格里马输 
入数据并且进行到下一语句:  
ReDim Preserve myArray(10)   
通常,当你改变一个数组的大小时,你将失去该数组原来的所有数据。语句ReDim将数组重新初始 
化。  
然而,你可以将新成员加入到现存的数组里去,通过在语句ReDim后面带上
返回目录 上一页 下一页 回到顶部 1 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!