動(dòng)態(tài)數組
1.動(dòng)態(tài)數組我是這樣理解的,它的空間結構大小不斷變化,或者說(shuō)我們開(kāi)始不能確定其空間大小,因此我們用一對空括號里來(lái)聲明
如下面的
A.第一種'由于剛開(kāi)始不能確定數組空間大小,要根據工作表里數據區域大小來(lái)確定
Option Explicit
Sub 動(dòng)態(tài)數組() '你可以在C列后面不斷添加數據,
'動(dòng)態(tài)數arr2的列數也不會(huì )自動(dòng)不斷的增加
Dim arr2(), arr1 '定義相關(guān)變量,數組arr2為動(dòng)態(tài)數組
Sheets("動(dòng)態(tài)數組1").Activate '把工作表""設置為活動(dòng)工作表
arr1 = Range("A1").CurrentRegion '把數據裝入到數組arr1
ReDim arr2(1 To 10000, 1 To UBound(arr1, 2)) '重新定義數組arr2的空間結構大小
End Sub
B.第二種從一個(gè)數組中把滿(mǎn)足條件裝入到另一個(gè)數組中,這時(shí)需要不斷地擴大數組空間最后維度的大小,當然不能擴展中間維度大小,這個(gè)前面我們已經(jīng)說(shuō)過(guò)了,打個(gè)比方,當然一維數組不存在這種問(wèn)題,而二維,二維以上就要注意了,
如下面的,你只能這樣
Sub test1()
Dim arr1(), x%
For x = 1 To 5
ReDim arr1(1 To 3, 1 To x)
Next x
End Sub
而不能在數組的行上改變,也就是說(shuō)數組arr1的一維不能放變量x,而只能在數組arr1的二維上放變量x
下面就是錯誤的
Sub test1()
Dim arr1(), x%
For x = 1 To 5
ReDim arr1(1 To x, 1 To 3)
Next x
End Sub
另大家也要注意一點(diǎn),因為不斷的修改數組的空間大小,修改一次都會(huì )清空原有值,如果你想保留必須加Preserve
如下面的代碼
Sub test1()
Dim arr1(), x%
For x = 1 To 5
ReDim Preserve arr1(1 To 3, 1 To x)
Next x
End Sub
下面我們通過(guò)一個(gè)實(shí)例來(lái)講解,把成績(jì)小于60分的提取出來(lái)
第一種解法,利用工作表函數Countif來(lái)判斷不及格的人數
Sub 提取二()
Dim arr1, arr2(), y%, x%, z%, k%
Sheets(1).Activate
arr1 = Range("A1").CurrentRegion '把數據裝到數組arr1里
y = Application.WorksheetFunction.CountIf(Range("B2:B" & UBound(arr1, 1)), "<60")
'調用工作表函數countif統計出B列小于60分個(gè)數
ReDim arr2(1 To y, 1 To UBound(arr1, 2)) '重新定義數組arr2的空間大小
For x = 1 To UBound(arr1, 1) '循環(huán)數組arr1的行
If arr1(x, 2) < 60 Then '判斷arr1(x,2)如果小于60,那么
k = k + 1 '累加k
For z = 1 To UBound(arr1, 2) '把滿(mǎn)足條件從數組arr1裝到數組arr2里
arr2(k, z) = arr1(x, z) '把arr1的第x行z列裝到arr2里第k行z列里
Next z
End If
Next x
Sheets(2).Cells = "" '讀出來(lái)之前,把第二個(gè)工作表數據清空
With Sheets(2)
.[A1].Resize(1, UBound(arr1, 2)) = arr1 ' 把表頭讀到第一行
.[A2].Resize(k, UBound(arr1, 2)) = arr2 '把數組arr2讀到單元格里
End With
Sheets(2).Select
End Sub
第二種解法利用Preserve保留原有值,不斷的把滿(mǎn)足要求裝入數組,不過(guò)這只能是不斷擴大其二維大小,所以我們最后還要通過(guò)轉置函數Transpose一下
Option Explicit
Sub test() '用動(dòng)態(tài)數組的解法()
Dim arr1, arr2(), x&, k& '把數組定義動(dòng)態(tài)數組
Sheets(1).Activate
arr1 = Range("A1").CurrentRegion '把數據裝到數組arr1里
For x = 1 To UBound(arr1, 1) '循環(huán)數組arr1的行
'ubound函數取得數組的最后索引號,UBound(arr1, 1)取得行索引號最大值
'UBound(arr1, 1)取得列索引號最大值,有的叫做下標
If arr1(x, 2) < 60 Then '如果分數小于60,那么
k = k + 1 '累加k
ReDim Preserve arr2(1 To 3, 1 To k)
'重新定義arr2的空間結構,且保留原有值
arr2(1, k) = arr1(x, 1) '把數組arr1的第x行第1列
'裝到arr2里的第1行第k列
arr2(2, k) = arr1(x, 2)
arr2(3, k) = arr1(x, 3)
End If
Next x
Sheets(2).Cells = "" '讀出來(lái)之前,把第二個(gè)工作表數據清空
With Sheets(2)
.[A1].Resize(1, UBound(arr1, 2)) = arr1 ' 把表頭讀到第一行
.[A2].Resize(k, UBound(arr1, 2)) = Application.Transpose(arr2)
'為什么還要轉置呢?
'因為數組2是不斷的擴展二維,也不是列
End With
Sheets(2).Select
End Sub
Sub 清空()
Sheets(2).Cells = "" '讀出來(lái)之前,把第二個(gè)工作表數據清空
End Sub
第三種解法,先定義一個(gè)足夠大的數組空間,用來(lái)裝小于60分的記錄
Sub 提取三()
Dim arr1, arr2(), y%, x%, z%, k%
Sheets(1).Activate
arr1 = Range("A1").CurrentRegion '把數據裝到數組arr1里
ReDim arr2(1 To 10000, 1 To UBound(arr1, 2)) '首先給數組arr2一個(gè)足夠大的空間用來(lái)存放數據
For x = 1 To UBound(arr1, 1) '循環(huán)數組arr1的行
If arr1(x, 2) < 60 Then '判斷arr1(x,2)如果小于60,那么
k = k + 1 '累加k
For z = 1 To UBound(arr1, 2) '把滿(mǎn)足條件從數組arr1裝到數組arr2里
arr2(k, z) = arr1(x, z) '把arr1的第x行z列裝到arr2里第k行z列里
Next z
End If
Next x
Sheets(2).Cells = "" '讀出來(lái)之前,把第二個(gè)工作表數據清空
With Sheets(2)
.[A1].Resize(1, UBound(arr1, 2)) = arr1 ' 把表頭讀到第一行
.[A2].Resize(k, UBound(arr1, 2)) = arr2 '把數組arr2讀到單元格里
End With
Sheets(2).Select
End Sub
篩選小于60學(xué)生信息入在第二個(gè)表.rar