從例子中了解什么是數組 :在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