VBA研究 如何將單元格資料賦給陣列

2021-07-03 19:31:19 字數 2639 閱讀 8712

將工作表中的資料賦給陣列或者將陣列的資料賦給工作表,一般有兩種,一種是迴圈的方法,乙個乙個的傳,這種方法一般用於需要對每個資料特別處理的場合,另一種是一次性用賦值語句傳,就速度來說,第二種方法要快得多。看下面例程:

sub tt()

dim arr1(240000, 4)

dim arr2()

lineno = [a1048576].end(xlup).row      '行數

'迴圈給陣列賦值,陣列myarr必須先定義大小

t1 = now()

for i = 3 to lineno

k = i - 2

arr1(k, 1) = cells(i, 1)

arr1(k, 2) = cells(i, 2)

arr1(k, 3) = cells(i, 3)

arr1(k, 4) = cells(i, 4)

next i

t2 = now()

cells(2, 5) = timevalue(t2) - timevalue(t1)

'一次性給陣列賦值,陣列arr不能定義大小和型別

t1 = now()

arr2 = range("a3:d" & lineno)

t2 = now()

cells(2, 6) = timevalue(t2) - timevalue(t1)

msgbox arr1(20000, 2) & "=" & arr2(20000, 2)

end sub

不過要注意的是,迴圈賦值的方法陣列必須先定義維數和大小,然後才能使用,而一次性賦值的正好相反,不能定義維數和大小,否則會報錯。此外注意,資料一次性讀入陣列arr2後,arr2成為乙個二維陣列,即使是讀取一列資料,也是二維陣列,陣列下標都是從1開始,即arr2(1,1),arr2(2,1),arr2(3,1),arr2(4,1),

。。。

還有一點要注意,當讀取的工作表非當前工作表時,range物件後面需要加上value關鍵字,否則會報錯,例如:

'方法一:直接讀取

dailino = sheets("**點").[b65536].end(xlup).row '行數

dailiname = sheets("**點").range("b2:b" & dailino).value

'方法二:啟用工作表後讀取

worksheets("**點").select

dailino = [b65536].end(xlup).row '行數

dailiname = range("b2:b" & dailino)

dailino = dailino - 1 '資料從第2行開始,所以總數量要減一

如果賦值範圍用行列號表示,則用下列語句(pos_fst, pos_ems是兩個引數,分別是資料起始行和資料所在列):

maxrow = cells(65536, pos_ems).end(xlup).row

mail = range(cells(pos_fst, pos_ems), cells(maxrow, pos_ems))

用上面的例程測試發現,即使20多萬條資料,第一種方法用時很少(4.62963e-05),而第二種方法卻幾乎不用時間(0)。

注意:range(cells(pos_fst, pos_ems), cells(maxrow, pos_ems))這種表示方法只適合當前工作表,如果非當前工作表,在前面加上sheets的限定後,就會報錯,但sheets(1).range("a1:a10")這種表示方法沒有問題。

下面給乙個根據安徽區縣和所有省區縣兩張表形成乙個安徽出口到各省區縣的點到點矩陣表例程:

sub set_matrix()

' dim sarr1(), sarr2()

dim mrow1, mrow2, i, j, k as integer

'從第3行開始讀

mrow1 = sheets("安徽").[a65536].end(xlup).row

sarr1 = sheets("安徽").range("b3:d" & mrow1).value

mrow2 = sheets("全國").[a65536].end(xlup).row

sarr2 = sheets("全國").range("b3:d" & mrow2).value

'從第4行開始填

kk = 4

for i = 1 to mrow1 - 2

for j = 1 to mrow2 - 2

cells(kk, 1) = kk - 3

cells(kk, 2) = sarr1(i, 1)

cells(kk, 3) = sarr1(i, 2)

cells(kk, 4) = sarr1(i, 3)

cells(kk, 5) = sarr2(j, 1)

cells(kk, 6) = sarr2(j, 2)

cells(kk, 7) = sarr2(j, 3)

kk = kk + 1

next j

next i

msgbox "填寫完畢!"

end sub

VBA研究 如何檢測單元格內容改變

iamlaosong文 我們經常需要監督excel工作表中單元格的值是否變化,例如我們客服有乙個報表要通報,報表的內容來自很多地方,需要將這些資料複製到這個表中,由於資料較多,為了防止有遺漏,希望更新後的資料有個標誌,這樣沒有更新的就一目了然了。為此,很自然就會想起利用worksheet chang...

如何給合併單元格填充序號

填充方法 首先開啟需要進行操作的excel 選擇指定單元格 然後在單元格中輸入公式 counta 單元格或引用 按下鍵盤上的 ctrl enter 組合鍵即可實現給合併單元格填充序號。本教程操作環境 windows7系統 wps office2016版 dell g3電腦。進入乙個 如圖,經常會遇到...

VBA 錄入資料後單元格自動保護

在excel中 審閱 保護工作表 可以選擇對工作表進行保護,下面的 可以用於對輸入內容的單元格進行保護 private sub worksheet selectionchange byval target as range on error resume next 出錯誤之後向下執行 sheet1....