VBA- 使用數組


從例子中了解什么是數組 :在vba里數組就是一組變量

Sub ss1()
Dim i, k
t = Timer '這個是從今天0點開始已經過了多少秒的時間
For i = 2 To 200000
    If Range("g" & i) = Range("n5") Then '每一次取值都要到range("n5")里取值,所以很耽誤時間
        k = k + Range("j" & i)
    End If
Next
Range("p5") = k
MsgBox Timer - t
End Sub

  優化1

Sub ss2()
Dim i, k
Dim str As String

t = Timer
str = Range("n5") '這樣就只取用一次
For i = 2 To 200000
    If Range("g" & i) = str Then '從變量里面取值
        k = k + Range("j" & i)
    End If
Next
Range("p5") = k
MsgBox Timer - t
End Sub

  優化2 這樣運算速度特別快

Sub ss3()
Dim i, k
Dim str As String
Dim arr() '數組

t = Timer
arr = Range("g1:j200000")   '是二維的 arr(行,列)
str = Range("n5") '這樣就只取用一次
For i = 2 To 200000
    If arr(i, 1) = str Then '從變量里面取值
        k = k + arr(i, 4)
    End If
Next
Range("p5") = k
MsgBox Timer - t
End Sub

數組的深入了解:靜態數組

Sub test()
Dim arr(1 To 4) '在這里定義數組范圍,這個是一維的,是橫着的
arr(1) = "張三"
arr(2) = "李四"
arr(3) = "趙五"
Range("b1") = arr(2)  '就是 “李四”
Range("a10:d14") = arr '輸出是橫着的
End Sub

  再舉個例子:動態數組

Sub test()
Dim arr()
arr = Range("a1:a5") '直接把放到數組里
Range("c1") = arr(2, 1)
End Sub

查找銷售冠軍:使用數組作為輔助列,作為存儲空間,數組可以直接用在函數里

 

 

 計算出該組的最高銷售額及產品

Sub test()
Dim arr(1 To 4)

For i = 1 To 4
    arr(i) = Range("b" & i + 1) * Range("c" & i + 1)
Next
Range("h3") = Application.WorksheetFunction.Max(arr)
Range("h2") = Range("a" & Application.WorksheetFunction.Match(Range("h3"), arr, 0) + 1)

End Sub

再深入一步:在這了解redim 以及ubound和lbound的作用

Sub test()
Dim arr() 'dim里面只能用常量
Dim j, i As Integer

j = Range("a65536").End(xlUp).Row - 1
ReDim arr(1 To j) '重定義

For i = 1 To j
    arr(i) = Range("b" & i + 1) * Range("c" & i + 1)
Next
Range("h3") = Application.WorksheetFunction.Max(arr)
Range("h2") = Range("a" & Application.WorksheetFunction.Match(Range("h3"), arr, 0) + 1)

MsgBox UBound(arr) '這里是針對arr 有兩個方法計算arr的上限和下限,ubound是上限 lbound是下限
'可以結合for循環使用

End Sub

排列組合計算匯款信息:這里用到了goto 方法來退出所有循環

Sub test()
Dim i, j, k, l As Integer
t = Timer
For i = 2 To 80
    For j = 2 To 80
        For k = 2 To 80
            For l = 2 To 80
                If Range("a" & i) + Range("a" & j) + Range("a" & k) + Range("a" & l) = 124704 Then
                    Range("f3") = Range("a" & i)
                    Range("g3") = Range("a" & j)
                    Range("h3") = Range("a" & k)
                    Range("i3") = Range("a" & l)
                    GoTo 100
                End If
            Next
        Next
    Next
Next
100
MsgBox Timer - t
End Sub

通過數組來優化

Sub test()
Dim i, j, k, l As Integer
t = Timer
arr = Range("a1:a80")
For i = 2 To 80
    For j = 2 To 80
        For k = 2 To 80
            For l = 2 To 80
                If arr(i, 1) + arr(j, 1) + arr(k, 1) + arr(l, 1) = 124704 Then
                    Range("f3") = arr(i, 1)
                    Range("g3") = arr(j, 1)
                    Range("h3") = arr(k, 1)
                    Range("i3") = arr(l, 1)
                    GoTo 100
                End If
            Next
        Next
    Next
Next
100
MsgBox Format(Timer - t, "0.00000")
End Sub

 


免責聲明!

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



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