一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

蘭版VBA數(shù)組入門(mén)10講

 神明的食糧圣地 2010-09-06
蘭版VBA數(shù)組入門(mén)10-1講
 

Sub 數(shù)組入門(mén)(1)
 
  Dim x As Integer
  Dim arr(1 To 10) '創(chuàng)建一個(gè)可以盛下10個(gè)數(shù)的箱子,第一個(gè)位置是arr(1),第二個(gè)位置用arr(2)..
 
  For x = 1 To 10   '通過(guò)循壞向這個(gè)箱子里1-10個(gè)位置放入10個(gè)數(shù)
 
     arr(x) = x  '箱子里依次放入數(shù)字1-10,即arr(1)=1,arr(2)=2....
    
  Next x
 
  '通過(guò)上面的循環(huán),數(shù)組里裝滿了10個(gè)數(shù)字,下面就可以用arr(序數(shù))得到相應(yīng)位置的數(shù)了
 
  MsgBox arr(5) '顯示數(shù)組內(nèi)第5個(gè)數(shù)字
End Sub
 

蘭版VBA數(shù)組入門(mén)10-3講

VBA數(shù)組儲(chǔ)存于內(nèi)存中,單元格的數(shù)據(jù),儲(chǔ)存于工作表的單元格區(qū)域里。

    從單元格中取出數(shù)據(jù)放在內(nèi)存。

          單元格是行列結(jié)構(gòu)的數(shù)據(jù)表,把它搬到內(nèi)存中也應(yīng)該是二維的數(shù)組。怎么搬呢?

         為了更好的搬運(yùn),內(nèi)存先批了一塊土地。內(nèi)存說(shuō)了,你有多少個(gè)單元格我不問(wèn),反正你有多少數(shù)據(jù)我提供多大的地方。

  一、聲明:

          Dim arr as Variant  '聲明一個(gè)變量,這個(gè)變量應(yīng)該是一個(gè)可以轉(zhuǎn)化成數(shù)組的Variant類型(可以省略),不能聲明其他數(shù)據(jù)類型

                             如: Dim arr as string   這種聲明就是錯(cuò)誤的,存放單元格的數(shù)據(jù)類型必須是 Variant(也可以省略) 

                                     Dim arr(1 to 10, 1  to  2 ) , 這種聲明也是錯(cuò)誤的,固定大小的VBA數(shù)組是不能一次性裝入單元格數(shù)據(jù)

       或:dim arr()    這種聲明方式是聲明一個(gè)動(dòng)態(tài)數(shù)組,也可以裝入單元格區(qū)域,構(gòu)成一個(gè)VBA數(shù)組。

  二、裝入

          arr =range("a9:c100")   '裝入很簡(jiǎn)單,變量 = 單元格區(qū)域

  三、讀出

          裝入數(shù)組后的單元格數(shù)值,可以按 數(shù)組名稱(行數(shù),列數(shù)) 直接讀取該位置的值,如下面的代碼。

          Msgbox  arr(3,2)   '就可以取出搬過(guò)去的而構(gòu)成的數(shù)組第3行第2列的內(nèi)容

四、示例

 Sub s3()

    Dim arr() '聲明一個(gè)動(dòng)態(tài)數(shù)組(動(dòng)態(tài)指不固定大?。?br>   Dim arr1  '聲明一個(gè)Variant類型的變量
   arr = Range("a1:c7")   '把單元格區(qū)域A1:C7的值裝入數(shù)組arr

   arr1 = Range("a1:c7")   '把單元格區(qū)域A1:C7的值裝入數(shù)組arr1
 
   MsgBox arr(1, 1)   '讀取arr數(shù)組中第1行第1列的數(shù)值
 
   MsgBox arr1(2, 3)  '讀取arr1數(shù)組的第2行第3列的數(shù)值
 
End Sub

下期預(yù)告:搬入內(nèi)存的目的是為了更快速的計(jì)算,計(jì)算結(jié)束后,怎么搬回到單元格中呢?且聽(tīng)下回分解。
 
 

轉(zhuǎn)蘭版VBA數(shù)組入門(mén)10-4講 附帶圖片

第3例我們學(xué)會(huì)了如何把單元格中的數(shù)據(jù)搬入內(nèi)存,變身為VBA數(shù)組。那么,VBA數(shù)組怎么輸回到單元格中呢?就象菜做好了,怎么更快的上桌呢?

1、二維數(shù)組的導(dǎo)入: 

VBA中常見(jiàn)的數(shù)組形式有一維數(shù)組和二維數(shù)組,相比一維數(shù)組,二維數(shù)組輸入則較為簡(jiǎn)單,直接放在一個(gè)單元格區(qū)域中就可以,即:

                Range(單元格區(qū)域)=arr   

         '這里arr是一個(gè)二維數(shù)組,值得注意的是如果單元格區(qū)域小于二維數(shù)組,則顯示二維數(shù)組的前面一部分?jǐn)?shù)據(jù),而如果單元格區(qū)域大于二維數(shù)組的數(shù)據(jù)儲(chǔ)存量,則會(huì)顯示錯(cuò)誤值。

 二維數(shù)組導(dǎo)入單元格示例:

如下圖所示,要求在D列計(jì)算金額

 
圖片點(diǎn)擊可在新窗口打開(kāi)查看此主題相關(guān)圖片如下:
圖片點(diǎn)擊可在新窗口打開(kāi)查看

代碼:

Sub test()
  Dim arr     '聲明一個(gè)變量用來(lái)盛放單元格數(shù)據(jù)
  Dim x As Integer
  arr = Range("a2:d5")     '把單元格數(shù)據(jù)搬入到arr里,它有4列4行 
  For x = 1 To 4     '通過(guò)循環(huán)在arr數(shù)組中循環(huán)
    arr(x, 4) = arr(x, 3) * arr(x, 2)      '數(shù)組的第4列(金額)=第3列*第2例 
  Next x
 Range("a2:d5") = arr     '把數(shù)組放回到單元格中
End Sub

2、一維數(shù)組的導(dǎo)入:

    一維數(shù)組只有一排數(shù)據(jù),而導(dǎo)入到單元格中卻有兩種選擇:導(dǎo)入到一行里 或 導(dǎo)入到一列中。

   1)導(dǎo)入成為一行數(shù)據(jù)。

         VBA 一維數(shù)組的排列方式 等同于 單元格中方向排列,所以可以直接導(dǎo)入工作表的一行單元格里。而如果要放在一列中,則需要調(diào)用工作表函數(shù)transpose轉(zhuǎn)置后再導(dǎo)入。例:

 Sub test1()
  Dim arr(1 To 5) '聲明一維數(shù)組
  For x = 1 To 5
    arr(x) = x * 2  '通過(guò)循環(huán)給每個(gè)位置賦值
  Next x
 Range("A1:E1") = arr  '把數(shù)組導(dǎo)入到excel中的a1:e1單元格中
 Range("A1:A5") = Application.Transpose(arr) '如果是放在一列中,就需要對(duì)數(shù)組進(jìn)行轉(zhuǎn)置后再存放
End Sub

轉(zhuǎn)蘭版VBA數(shù)組入門(mén)10-5講 附帶圖片

1、什么是動(dòng)態(tài)數(shù)組?

        動(dòng)態(tài)就是不固定的。

      dIm arr(1 to 20)  '聲明固定大小的數(shù)組空間

      Dir arr()   '聲明一個(gè)動(dòng)態(tài)數(shù)組,數(shù)組有幾維,有多少個(gè)元素,未知。

2、動(dòng)態(tài)數(shù)組的使用

      動(dòng)態(tài)數(shù)組聲明后,需要二次或多次聲明

     二次聲明:所謂二次聲明,就是這個(gè)動(dòng)態(tài)數(shù)組開(kāi)始不知道有多少行和多少列,后來(lái)經(jīng)過(guò)計(jì)算,確定了它的大小,這時(shí)候就可以用Redim 再次聲明它的大小了。例:把工作表A列的數(shù)據(jù)裝入數(shù)組ARR

分析:因?yàn)榻?jīng)過(guò)計(jì)算才知道有多少個(gè)大于10的數(shù)字,所以這個(gè)數(shù)組要聲明動(dòng)態(tài)的


圖片點(diǎn)擊可在新窗口打開(kāi)查看此主題相關(guān)圖片如下:
圖片點(diǎn)擊可在新窗口打開(kāi)查看

 Sub darr()
  Dim arr()  '聲明一個(gè)動(dòng)態(tài)的arr數(shù)組(不知道它能盛多少數(shù)據(jù))
  Dim k
  k = Application.WorksheetFunction.CountIf(Range("a2:a6"), ">10") '計(jì)算大于10的個(gè)數(shù)
  ReDim arr(1 To k)  '再次聲明arr的大小,正好盛下k數(shù)量的值
  For x = 2 To 6
    If Cells(x, 1) > 10 Then
      m = m + 1
      arr(m) = Cells(x, 1)  '通過(guò)循環(huán)把大于10的數(shù)字裝入數(shù)組
    End If
  Next x
  MsgBox arr(2)
End Sub
   

    如果數(shù)組需要隨一個(gè)變量不斷的擴(kuò)充,數(shù)組就需要多次聲明,每擴(kuò)充一次就聲明一次:Redim Preserve (1 to k) 

  如果數(shù)組是二維的,只能動(dòng)態(tài)聲明第二維的,有點(diǎn)麻煩,這里就不再詳述

 

蘭版VBA數(shù)組入門(mén)10-6講
 
 
有時(shí)候我們需要返回一個(gè)最組的最大和最小下標(biāo),這里出現(xiàn)了一個(gè)新名詞:下標(biāo)
    所謂下標(biāo)就是數(shù)組內(nèi)元素的編號(hào)。象在電影院看電影一樣,數(shù)組內(nèi)每一維數(shù)據(jù)有都獨(dú)有的編號(hào),比如arr(2)表示數(shù)組中編號(hào)為2數(shù)據(jù)。這里容易讓人糊涂的是,數(shù)組的編號(hào)不一定是從1開(kāi)始,而可以從負(fù)數(shù)開(kāi)始,如:
    arr(-19 to 8)  這個(gè)數(shù)組的編號(hào)就是從-19開(kāi)始的.那么它的最小編號(hào)就是-19,最大編號(hào)是8, 如果用語(yǔ)句返回就是:
   Sub t1()
     Dim arr(-19 To 8)
     MsgBox UBound(arr) '返回最大編號(hào),結(jié)果為8
     MsgBox LBound(arr) '返回最小編號(hào),結(jié)果為-19
  End Sub
如果是有行列組成的二維數(shù)組呢?二維數(shù)組返回行的下標(biāo)和列的下標(biāo)見(jiàn)下例
       Sub t2()
  
     Dim arr(-19 To 8, 2 To 5)
     MsgBox UBound(arr) '返回第1維(行的)最大編號(hào),結(jié)果為8
     MsgBox LBound(arr) '返回第1維(行的)小編號(hào),結(jié)果為-19
     MsgBox UBound(arr, 2) '返回第2維(列的)最大編號(hào),結(jié)果為5
     MsgBox LBound(arr, 2) '返回第2維(列的)最小編號(hào),結(jié)果為2
    
  End Sub
上面例子中在聲明時(shí)最大最小下標(biāo)都是已知的,為什么還要再用再計(jì)算呢?  如果arr是一個(gè)動(dòng)態(tài)數(shù)組,我們用得著計(jì)算最大和最小下標(biāo)了.例:
     Sub t3()
        Dim arr
       arr = Sheets(1).UsedRange 'Usedrange的行數(shù)和列數(shù)是未知的
       MsgBox UBound(arr, 1) '可以計(jì)算這個(gè)區(qū)域有多少行
       MsgBox UBound(arr, 2) '可以計(jì)算出這個(gè)區(qū)域有多少列
End Sub

蘭版VBA數(shù)組入門(mén)10-7講
 
 
在前面我們學(xué)習(xí)了創(chuàng)健一個(gè)固定大小的數(shù)組和動(dòng)態(tài)數(shù)組,這些數(shù)組在創(chuàng)建時(shí)只是創(chuàng)建了儲(chǔ)存空間還沒(méi)有賦值,而本講所說(shuō)有常量數(shù)組則時(shí)提供的由一組常所構(gòu)成的數(shù)組,如:
使用Array函數(shù)創(chuàng)建數(shù)組
        1維常量數(shù)組:Array("A",1,"C")
        2維常量數(shù)組: Array(Array("a", 10), Array("b", 20), Array("c", 30))
 也可以調(diào)用excel工作表內(nèi)存數(shù)組:
        1維數(shù)量:  [{"A",1,"C"}]
         2維數(shù)量: [{"a",10;"b",20;"c",30}]
內(nèi)存常量數(shù)組有什么作用呢?
       1、簡(jiǎn)化賦值
              比如:我需要給數(shù)組arr分別賦值10 ,20,30,40 ,一般就需要分別賦值,即:
                     arr(1)=10
                     arr(2)=20
                     arr(3)=30
                     arr(4)=40
                 而使用常量數(shù)量,只一句話:
                    arr=array(10,20,30,40)
        2、調(diào)用工作表函數(shù)時(shí)使用:
             Sub mylook()
                Dim arr
                arr =
[{"a",10;"b",20;"c",30}]
               MsgBox Application.VLookup("b", arr, 2, 0)  '調(diào)用vlookup時(shí)可以作為第二個(gè)參數(shù)
             End Sub 

蘭版VBA數(shù)組入門(mén)10-8講
 
 
多個(gè)字符的合并和字符串按規(guī)律的拆分是經(jīng)常遇到的,如:
            A-REW-E-RWC-2-RWC 按分隔符-拆分成6個(gè)字符放在一個(gè)數(shù)組中
           有一組數(shù)array(23,45,7,1,76)想用分隔符-連接成一個(gè)字符串
   上面兩種情況VBA提供了一對(duì)函數(shù),即:
              split(字符串,"分隔符") 拆分字符串
              join(數(shù)組,"分隔符")   用分隔連接數(shù)組的每個(gè)元成一個(gè)字符串
   例1:
           Sub t1()
               Dim arr, myst As String
               myst = "A-REW-E-RWC-2-RWC"
               arr = Split(myst, "-")
  '按-分隔成一組數(shù)裝入數(shù)組中
               'MsgBox arr(0) '顯示數(shù)組的第一個(gè)數(shù)(分隔后的數(shù)組最小下標(biāo)為0,不是1),顯示結(jié)果為A
               MsgBox Join(arr, ",") '再用","把數(shù)組的每個(gè)值連接成一個(gè)字符串,結(jié)果為"A,REW,E,RWC,2,RWC"
           End Sub
    值得注意的是:split和join只能對(duì)一維數(shù)組進(jìn)行操作,如果是單元格或二維數(shù)組怎么辦?只有一條途徑,想辦法轉(zhuǎn)換為一維數(shù)組:
            Sub t2()
                 Dim ARR
                 ARR = Application.Transpose(Range("a1:a3")) ‘用轉(zhuǎn)置的方法,把單元格一列數(shù)據(jù)轉(zhuǎn)換成一維數(shù)組
                 MsgBox Join(ARR, "-")
            End Sub

蘭版VBA數(shù)組入門(mén)10-9講
 

VBA數(shù)組教程第9例:Filter函數(shù)實(shí)現(xiàn)數(shù)組篩選

  數(shù)組的篩選就是根據(jù)一定的條件,從數(shù)組中篩選符合條件的值,組成一個(gè)新的數(shù)組,實(shí)現(xiàn)數(shù)組篩選的VBA函數(shù)是:

         Filter函數(shù)

  用法:Filter(數(shù)組, 篩選的字符,
  是否包含

 示例

Sub DD()
     arr = Array("ABC", "A", "D", "CA", "ER")
     arr1 = VBA.Filter(arr, "A", True) '篩選所有含A的數(shù)值組成一個(gè)新數(shù)組
     arr2 = VBA.Filter(arr, "A", False) '篩選所有不含A的數(shù)值組成一個(gè)新數(shù)組
     MsgBox Join(arr2, ",") '查看篩選的結(jié)果
End Sub

遺憾的是函數(shù)只能進(jìn)行模糊篩選,不能精確匹配。

蘭版VBA數(shù)組入門(mén)10-10講
 

前言: 時(shí)間過(guò)的真快,轉(zhuǎn)眼間VBA數(shù)組入門(mén)已到第10例,雖然數(shù)組還有更多的深層用法,但本系列只是“入門(mén)”教程,所以也只能在第10例后劃上句號(hào)了,希望本系列能給想學(xué)VBA數(shù)組的新手帶來(lái)幫助。蘭色如果有時(shí)間,會(huì)繼續(xù)推出VBA數(shù)組的進(jìn)階教程系列,包括數(shù)組排序等。

         他山之石,可以攻玉,VBA中除可以利用的VBA函數(shù)外,還可以調(diào)用眾多的Excel工作表函數(shù)對(duì)數(shù)組進(jìn)行分解、查詢和分析等,調(diào)用工作表函數(shù)可以省去循環(huán)判斷的麻煩,進(jìn)而提高運(yùn)行效率。

        一、數(shù)組的最值

             1、Max和Min 

                   工作表函數(shù)Max和Min是求最大值和最小值的函數(shù),同樣在VBA中也可以求數(shù)組的最大值和最小值。如:

                   Sub t()
                        arr = Array(1, 35, 4, 13)
                        MsgBox Application.Max(arr)  '最大值
                        MsgBox Application.Min(arr)   '最小值
                    End Sub

             2、large和small

                  工作表函數(shù)large和small 是返回一組數(shù)的第N大和第N小,對(duì)VBA數(shù)組同樣適用,如:

                     Sub t1()
                          arr = Array(1, 35, 4, 13)
                          MsgBox Application.Large(arr, 2) '第2大值
                          MsgBox Application.Small(arr, 2)  '第2小值
                      End Sub

           二、數(shù)組的統(tǒng)計(jì)與求和

                 1、Sum

                      Sum函數(shù)可以在工作表中求,同樣也可以對(duì)VBA數(shù)組求和,如:

                    
                      Sub t2()
                          arr = Array(1, 35, 4, 13)
                          MsgBox Application.Sum(arr)  '對(duì)數(shù)組進(jìn)行求和
                      End Sub

                2、Count和Counta

                     Count和Counta可以統(tǒng)計(jì)數(shù)組中數(shù)字的個(gè)數(shù)和數(shù)字+文本的個(gè)數(shù)。

                    Sub t3()
                         arr = Array(1, 35, "a", 4, 13, "b")
                         MsgBox Application.Count(arr)  '返回?cái)?shù)字的個(gè)數(shù)4
                         MsgBox Application.CountA(arr)  ‘返回?cái)?shù)組文本和數(shù)字的總個(gè)數(shù)
                    End Sub

          三、數(shù)組的查詢和拆分


以下內(nèi)容只有回復(fù)后才可以瀏覽

 

               1、Mach查詢數(shù)組

                 Match函數(shù)可以查詢一個(gè)指定值在一組數(shù)中的位置,它也可以用于VBA數(shù)組的查詢。如:

                 Sub t4()
                        arr = Array(1, 35, 4, 13)
                        MsgBox Application.Match(4, arr, 0)  '查詢數(shù)值4在數(shù)組Arr中的位置
                End Sub

             2、Index拆分?jǐn)?shù)組

                  數(shù)組的拆分在VBA中是一個(gè)難題,如果是按行拆分?jǐn)?shù)組,除了用循環(huán)外也只能借用API函數(shù)完成了。幸好我們可以借用工作表函數(shù)index達(dá)到按列拆分?jǐn)?shù)組,即多列構(gòu)成的數(shù)組,你可以任意拆分出一列構(gòu)成新的數(shù)組。方法是:Application.Index(數(shù)組, , 列數(shù)) ,例:

                     Sub t2()
                         arr2 = Range("A1:B4") ‘把單元格區(qū)域A1:B4的值裝入數(shù)組arr2
                         arr3 = Application.Index(arr2, , 2)  '把數(shù)組第2列拆分出來(lái)裝入新數(shù)組arr3中,新數(shù)組為二維數(shù)組
                         MsgBox arr3(2, 1)  '取出新數(shù)組第2行的值
                    End Sub


 

        四、數(shù)組維數(shù)的轉(zhuǎn)換

   


以下內(nèi)容只有回復(fù)后才可以瀏覽

 

 

            Transpose轉(zhuǎn)置數(shù)組在工作表中可以把行列轉(zhuǎn)換。在VBA中同樣也可以做到轉(zhuǎn)換的效果。

            1、一維轉(zhuǎn)二維。

                 Sub t9()
                      arr = Array(1, 35, "a", 4, 13, "b")
                      arr1 = Application.Transpose(arr)
                      MsgBox arr1(2, 1) ‘轉(zhuǎn)換后的數(shù)組是1列多行的二維數(shù)組
                 End Sub

            2、二維數(shù)組轉(zhuǎn)一維。

                  Sub t2()
                       arr2 = Range("A1:B4")
                       arr3 = Application.transpose(Application.Index(arr2, , 2)) '取得arr2第2列數(shù)據(jù)并轉(zhuǎn)置成1維數(shù)組
                      MsgBox arr3(2,)
                  End Sub     

               注:在轉(zhuǎn)置時(shí)只有1列N行的數(shù)組才能直接轉(zhuǎn)置成一維數(shù)組

   


 

            思考題:我要把a(bǔ)1:c1中的內(nèi)容用“-”連接起來(lái),下面代碼中為什么用了兩次transpose

          Sub t10()
              arr = Range("A1:C1")
              MsgBox Join(Application.Transpose(Application.Transpose(arr)), "-")
          End Sub

  編后話:用于VBA數(shù)組的工作表函數(shù)我只是列出了一部分,其實(shí)象vlookup,Lookup等等函數(shù)也可以用于處理VBA數(shù)組,大家有空了就去嘗試下吧。 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    99热九九热这里只有精品| 日本在线视频播放91| 好吊妞视频免费在线观看| 国产亚洲欧美自拍中文自拍| 欧美人与动牲交a精品| 久久99国产精品果冻传媒| 少妇激情在线免费观看| 精品香蕉国产一区二区三区| 国产激情国产精品久久源| 樱井知香黑人一区二区| 国产亚洲欧美日韩精品一区| 中文字幕人妻日本一区二区| 欧美不卡午夜中文字幕| 欧美亚洲三级视频在线观看| 中日韩美女黄色一级片| 日本欧美在线一区二区三区| 儿媳妇的诱惑中文字幕| 激情图日韩精品中文字幕| 亚洲综合一区二区三区在线 | 人妻少妇系列中文字幕| 中文字幕一区二区三区大片| 欧美有码黄片免费在线视频| 少妇毛片一区二区三区| 午夜福利国产精品不卡| 日韩成人动作片在线观看| 欧美日韩欧美国产另类| 欧美精品在线播放一区二区| 国产精品免费福利在线| 老外那个很粗大做起来很爽| 欧美日韩校园春色激情偷拍| 欧美成人欧美一级乱黄| 免费在线观看欧美喷水黄片| 亚洲欧美日本视频一区二区| 99久只有精品免费视频播放| 亚洲综合香蕉在线视频| 欧美日韩亚洲综合国产人| 亚洲第一区二区三区女厕偷拍| 日韩熟妇人妻一区二区三区| 国产精品香蕉一级免费| 日本欧美一区二区三区在线播 | 精品国产丝袜一区二区|