VBA數組完全教程


蘭色幻想VBA數組入門教程10集

1. 前言:不要把VBA數組想的太神秘,它其實就是一組數字而已。

2. 數組的維數:

Sub 數組示例()
  Dim x As Long, y As Long
  Dim arr(1 To 10, 1 To 3)  '創建一個可以容下10行3列的數組空間
  For x = 1 To 4
    For y = 1 To 3
       arr(x, y) = Cells(x, y)  '通過循環把單元格區域a1:c4的數據裝進數組中
    Next y
  Next x
 MsgBox arr(4, 3) '根據提供的行數和列數顯示數組
 arr(1, 2) = "我改一下試試" '你可以隨時修改數組內指定位置的數據
 MsgBox arr(1, 2)
End Sub

總結:二維是由行和列表示的數組,如ARR(3,2)表示數組中第3排第2列的元素。而一維數組只是由一個元素決定,如ARR(4)表示數組中第4個元素

3. 把單元格數據搬入內存:

一、聲明:

          Dim arr as Variant  '聲明一個變量,不能聲明其他數據類型

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

       或:dim arr()    這種聲明方式是聲明一個動態數組,也可以裝入單元格區域,構成一個VBA數組。

  二、裝入

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

  三、讀出

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

          Msgbox  arr(3,2)   '就可以取出搬過去的而構成的數組第3行第2列的內容

  四、示例

 Sub s3()

    Dim arr() '聲明一個動態數組(動態指不固定大小)
   Dim arr1  '聲明一個Variant類型的變量
   arr = Range("a1:c7")   '把單元格區域A1:C7的值裝入數組arr

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

4. 把單元格數據搬入內存:

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

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

5. 動態數組的聲明:

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

6. 動態數組的聲明:
    arr(-19 to 8)  這個數組的編號就是從-19開始的.那么它的最小編號就是-19,最大編號是8, 如果用語句返回就是:

   Sub t1()

     Dim arr(-19 To 8)

     MsgBox UBound(arr) '返回最大編號,結果為8

     MsgBox LBound(arr) '返回最小編號,結果為-19

  End Sub

如果是有行列組成的二維數組呢?二維數組返回行的下標和列的下標見下例

       Sub t2()
        Dim arr(-19 To 8, 2 To 5)

     MsgBox UBound(arr) '返回第1維(行的)最大編號,結果為8

     MsgBox LBound(arr) '返回第1維(行的)小編號,結果為-19
     MsgBox UBound(arr, 2) '返回第2維(列的)最大編號,結果為5
     MsgBox LBound(arr, 2) '返回第2維(列的)最小編號,結果為2
       End Sub

 Sub t3()
        Dim arr
       arr = Sheets(1).UsedRange 'Usedrange的行數和列數是未知的
       MsgBox UBound(arr, 1) '可以計算這個區域有多少行
       MsgBox UBound(arr, 2) '可以計算出這個區域有多少列
End Sub

7. 使用Array函數創建常量數組:

使用Array函數創建數組

        1維常量數組:Array("A",1,"C")

        2維常量數組: Array(Array("a", 10), Array("b", 20), Array("c", 30))

 也可以調用excel工作表內存數組:

        1維數量:  [{"A",1,"C"}]

         2維數量: [{"a",10;"b",20;"c",30}]

內存常量數組有什么作用呢?

       1、簡化賦值

              比如:我需要給數組arr分別賦值10 ,20,30,40 ,一般就需要分別賦值,即:

                     arr(1)=10

                     arr(2)=20

                     arr(3)=30

                     arr(4)=40

                 而使用常量數量,只一句話:

                    arr=array(10,20,30,40)

        2、調用工作表函數時使用:

             Sub mylook()
                Dim arr
                arr = [{"a",10;"b",20;"c",30}]
            MsgBox Application.VLookup("b", arr, 2, 0)  '調用vlookup時可以作為第二個參數
             End Sub 

8. 數組的合並和字符串拆分(Join & Split):

多個字符的合並和字符串按規律的拆分是經常遇到的,如:

            A-REW-E-RWC-2-RWC 按分隔符-拆分成6個字符放在一個數組中

           有一組數array(23,45,7,1,76)想用分隔符-連接成一個字符串

   上面兩種情況VBA提供了一對函數,即:

              split(字符串,"分隔符") 拆分字符串

              join(數組,"分隔符")   用分隔連接數組的每個元成一個字符串

     Sub t1()
      Dim arr, myst As String
       myst = "A-REW-E-RWC-2-RWC"
     arr = Split(myst, "-")  '按-分隔成一組數裝入數組中
     'MsgBox arr(0) '顯示數組的第一個數(分隔后的數組最小下標為0,不是1),顯示結果為A
               MsgBox Join(arr, ",") '再用","把數組的每個值連接成一個字符串,結果為"A,REW,E,RWC,2,RWC"
           End Sub

    值得注意的是:split和join只能對一維數組進行操作,如果是單元格或二維數組怎么辦?只有一條途徑,想辦法轉換為一維數組:

            Sub t2()
                 Dim ARR
                 ARR = Application.Transpose(Range("a1:a3")) ‘用轉置的方法,把單元格一列數據轉換成一維數組
                 MsgBox Join(ARR, "-")
            End Sub

9. Filter函數實現數組篩選:

  數組的篩選就是根據一定的條件,從數組中篩選符合條件的值,組成一個新的數組,實現數組篩選的VBA函數是:

         Filter函數

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

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

遺憾的是函數只能進行模糊篩選,不能精確匹配。

10. VBA數組入門教程之10(大結局):他山之石):
他山之石,可以攻玉,VBA中除可以利用的VBA函數外,還可以調用眾多的Excel工作表函數對數組進行分解、查詢和分析等,調用工作表函數可以省去循環判斷的麻煩,進而提高運行效率。

        一、數組的最值

             1、Max和Min 

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

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

             2、large和small

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

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

           二、數組的統計與求和

                 1、Sum

                      Sum函數可以在工作表中求,同樣也可以對VBA數組求和,如:

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

                2、Count和Counta

                     Count和Counta可以統計數組中數字的個數和數字+文本的個數。

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

          三、數組的查詢和拆分

               1、Mach查詢數組

                 Match函數可以查詢一個指定值在一組數中的位置,它也可以用於VBA數組的查詢。如:

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

             2、Index拆分數組

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

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

        四、數組維數的轉換

            Transpose轉置數組在工作表中可以把行列轉換。在VBA中同樣也可以做到轉換的效果。

            1、一維轉二維。

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

            2、二維數組轉一維。

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

               注:在轉置時只有1列N行的數組才能直接轉置成一維數組

               思考題:我要把a1:c1中的內容用“-”連接起來,下面代碼中為什么用了兩次transpose

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM