- 動態(tài)的數(shù)組事先是沒有設(shè)置大小的。
- 定義動態(tài)的數(shù)組首先要聲明,Dim arr(),然后用Redim命令來設(shè)置數(shù)組的大小。
Sub vv()
Dim arr(), i As Long
ReDim arr(1 To 10)'設(shè)置數(shù)組大小,一維數(shù)組,10個元素。
For i = 1 To 10
arr(i) = i
Next
Range("a1").Resize(UBound(arr), 1) = Application.Transpose(arr)
End Sub
Sub vv()
Dim arr(), i As Long
ReDim arr(1 To 10, 1 To 2) '設(shè)定數(shù)組大小
For i = 1 To 10
arr(i, 1) = i
arr(i, 2) = i * 100
Next
Range("a1").Resize(UBound(arr), 2) = arr
End Sub
- 數(shù)組的擴展
- Redim Preserve
Sub vv()
Dim arr(), i As Long
For i = 1 To 10
ReDim Preserve arr(1 To i)
arr(i) = i
Next
Range("a1").Resize(UBound(arr), 1) = Application.Transpose(arr)
End Sub
- 當i=1,arr(1 to 1),arr(1)=1
- 當i=2,arr(1 to 2),arr(1)=1,arr(2)=2
......如此類推
Paste_Image.png
- ReDim Preserve每次擴展數(shù)組的時候,都會保留前面的數(shù)據(jù),如i=2時,并不會刪除arr(1)這個元素的數(shù)據(jù),類似滾雪球,越滾越大。
- Redim和ReDim Preserve的區(qū)別是:Redim是清空數(shù)組,再設(shè)置數(shù)組大小,并不保留原有的數(shù)據(jù),ReDim Preserve是保留原有數(shù)據(jù),擴張‘地盤‘。
Sub cc()
Dim arr(), i As Long
For i = 1 To 10
ReDim arr(1 To i)
arr(i) = i
Next
Range("a1").Resize(UBound(arr), 1) = Application.Transpose(arr)
End Sub
- 二維數(shù)組的擴展只能擴展其第二維,要將上的代碼cc改為二維數(shù)組,如下
Sub kk()
Dim arr(), i As Long
For i = 1 To 10
ReDim Preserve arr(1 To 1, 1 To i)
arr(1, i) = i
Next
Range("a1").Resize(UBound(arr, 2), 1) = Application.Transpose(arr)
End Sub
- 先將二維數(shù)組設(shè)定為【1行 i 列】的數(shù)組,然后轉(zhuǎn)置為 【 i 行1列 】的數(shù)值輸出到單元格。
- Application.Transpose的局限
- 當數(shù)據(jù)量比較少的時候,Application.Transpose能將數(shù)據(jù)都轉(zhuǎn)置。
- 當數(shù)據(jù)量超過65536行,或254列時,會超出Application.Transpose的極限,出問題。
- Application.Transpose效率較低。
- 如下面代碼及其運行結(jié)果(圖片)
Sub kk()
Dim arr(), i As Long
ReDim arr(1 To 65537)
For i = 1 To UBound(arr)
arr(i) = i
Next
Range("a1").Resize(UBound(arr), 1) = Application.Transpose(arr)
End Sub
出錯了
- 處理方法:
- 1、聲明一個足夠大的空數(shù)組,往里面填裝數(shù)據(jù)。比如,預(yù)計數(shù)據(jù)條數(shù)有1000條(不確定),那么就聲明一個10000行N列的二維數(shù)組,然后用計數(shù)器計算條數(shù),假如有K條,則將數(shù)組在K行這個地方一刀切開兩端,將有數(shù)據(jù)的一端輸出到工作表。
- 2、這種方法往往比redim preserve更方便和容易理解,也更有效率。
- 3、當然,實際情況下,可靈活結(jié)合使用。
【練習】提取銷售額大于等于500的部門。
提取數(shù)據(jù)
- 1 Redim Presever寫法
Dim arr, brr()
arr = Range("a1").CurrentRegion
For i = 2 To UBound(arr)
If arr(i, 2) >= 500 Then
k = k + 1
ReDim Preserve brr(1 To 2, 1 To k) '2行K列的數(shù)組
brr(1, k) = arr(i, 1) '提取符合條件的數(shù)據(jù),這是部門
brr(2, k) = arr(i, 2) '銷售額
End If
Next
Range("g1").Resize(2, k) = brr '未轉(zhuǎn)置前的數(shù)據(jù)(數(shù)組brr原來的樣子)
Range("d2").Resize(k, 2) = Application.Transpose(brr) '轉(zhuǎn)置后的數(shù)據(jù)
End Sub
Paste_Image.png
-
range("g1:o2")區(qū)域轉(zhuǎn)置后的樣子,可以手工操作: 復(fù)制--轉(zhuǎn)置
Paste_Image.png 2 聲明一個足夠大的數(shù)組寫法
Sub ff1()
Dim arr, brr()
arr = Range("a1").CurrentRegion
'設(shè)置brr和arr一樣大小,因為是提取數(shù)據(jù)操作,數(shù)據(jù)條數(shù)不可能超過arr的條數(shù)
ReDim brr(1 To UBound(arr), 1 To 2)
For i = 2 To UBound(arr)
If arr(i, 2) >= 500 Then
k = k + 1
'提取符合條件的數(shù)據(jù)放到數(shù)組brr
brr(k, 1) = arr(i, 1) '提取符合條件的數(shù)據(jù),這是部門
brr(k, 2) = arr(i, 2) '銷售額
End If
Next
Range("d2").Resize(k, 2) = brr '直接輸出數(shù)據(jù)
End Sub
Paste_Image.png
- 數(shù)組arr和brr一樣大小,從arr中提取符合條件的數(shù)據(jù),遍歷的時候,發(fā)現(xiàn)1條就計數(shù)1條,第1條數(shù)據(jù)放在brr第一行,第2條數(shù)據(jù)放在brr第2行,第3條數(shù)據(jù)放在brr第3行.....依次操作,直到完畢。
- 然后用計數(shù)的變量K值來截取brr的條目數(shù),放到工作表中。見代碼中的 Resize(k, 2)。
- 這種方式比ReDim Preserve省事有效。