設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 2688|回復(fù): 4
打印 上一主題 下一主題

[其它] 數(shù)組的力量

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2013-6-26 16:40:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
一、數(shù)組概念
數(shù)組就是一個列表或者一組數(shù)據(jù)表。它是由連續(xù)可索引的具有相同內(nèi)在數(shù)據(jù)類型的元素所組成的集合,數(shù)組中每一個元素都具有唯一的索引號。更改其中一個元素并不會影響到其它元素。
數(shù)組存在內(nèi)存,可以利用索引號獲取該集合中每一個子集。
數(shù)組的兩個特點:
1、讀寫速度快
VBA讀取對象中的值永遠(yuǎn)慢于讀取內(nèi)存中的值?梢越柚鶹BA數(shù)組對程序提速。
2、無法永遠(yuǎn)保存
數(shù)據(jù)存于工作表區(qū)域內(nèi),可以永久保存。但存入內(nèi)存中的變量數(shù)組和常量數(shù)組卻受其作用域影響生命周期。
過程級別的私有數(shù)組變量或者常量數(shù)組在過程結(jié)束后會自動釋放,結(jié)束其生命周期;
而公有的變量數(shù)組和常量數(shù)組在excel應(yīng)用程序關(guān)閉后會自動釋放。也就是重新啟動excel后,以前任何數(shù)組都不存在。
3、數(shù)組分類
按照數(shù)組元素是否固定來分,可以分為靜態(tài)數(shù)組和動態(tài)數(shù)組;
按照數(shù)組維度來分,可以分為一維數(shù)組、二維數(shù)組等,最多只能為60維。
二、數(shù)組的維度
數(shù)組可以是一維、二維直到六十維。而對于excel工作表來說,excel的每一行或者每一列就可以轉(zhuǎn)換成一維數(shù)組,而多行多列就可以轉(zhuǎn)換成二維數(shù)組。
1、一維數(shù)組
在數(shù)組公式中,在A1:F1區(qū)域中輸入數(shù)組公式:={1,2,3,4,5,6},然后按Ctrl+Shift+Enter,就可以在A1:F1之間得到了橫向區(qū)域的值。
在A1:A6區(qū)域中輸入數(shù)組公式:={1;2;3;4;5;6},然后按Ctrl+Shift+Enter,就可以在A1:A6之間得到了縱向區(qū)域的值。
而VBA數(shù)組也可以得到同樣的效果:
2.1 VBA 代碼
Sub 橫向數(shù)組()
  [A1:F1] = [{1,2,3,4,5,6}]
End Sub
[{1,2,3,4,5,6}]代表是一維橫向數(shù)組。
2.2 VBA代碼
Sub 縱向數(shù)組()
  [A1:A6] = [{1;2;3;4;5;6}]
End Sub
[{1;2;3;4;5;6}]代表是一維縱向數(shù)組。
從上面兩個賦值過程來看,看到數(shù)組在VBA中的優(yōu)勢,不僅可以對單元格進行循環(huán)賦值,還可以把原本需要循環(huán)6次的操作集中一次完成。
2、二維數(shù)組
對于三行三列的數(shù)組,我們可以使用數(shù)組公式:={1,1,1;2,2,2;3,3,3}
在VBA中也可以用數(shù)組表示一個二維數(shù)組,如下面例子
Sub 二維數(shù)組()
[A1:C3] = [{1,1,1;2,2,2;3,3,3}]
End Sub

三、利用索引號獲取數(shù)組中的元素
類似Range可以使用索引號訪問區(qū)域中每一個單元格一樣,一維數(shù)組和二維數(shù)組也可以使用索引號獲取數(shù)組中每一個值。主要有兩種形式:
形式一:Arr(Item)
形式二:Arr(RowIndex,ColumnIndex)
這兩種形式看起來在形式上和Range的索引號完全一致,但在事實上存在很多差異。
請看差異在哪里,例子1:
Sub 索引號引用數(shù)組()
Dim arr1() '聲明數(shù)組變量
arr1 = Array("wise", "rose", "小花鳥", "小花鴨") '對數(shù)組賦值
MsgBox arr1(1) '正確的引用
MsgBox arr1(1, 1) '錯誤的引用
End Sub
在例子1中,對于一維數(shù)組的兩種索引方式只能前者可以正常執(zhí)行,后者會產(chǎn)生錯誤。
例子2:
Sub 索引號引用數(shù)組1()
Dim arr1() '聲明數(shù)組變量
arr1 = [{1,1,1,1;2,2,2,2;3,3,3,3;4,4,4,4}] '對數(shù)組賦值
MsgBox arr1(4, 2) '正確的引用
MsgBox arr1(4) '錯誤的引用
End Sub
對于二維數(shù)組,例子2中兩種方式只能使用第一種方式,而后者會產(chǎn)生錯誤。
當(dāng)使用索引號引用數(shù)組時候,值得注意是:第一個元素的默認(rèn)索引值。
在默認(rèn)狀態(tài)下,如果模塊中未指定第一個元素的索引號,那么默認(rèn)為0。即數(shù)組中arr中的第一個值用arr(0)來表示,最后一個元素的索引號則為數(shù)組元素個數(shù)減1來表示。
如下例子:
Sub 索引號引用數(shù)組()
Dim arr1() '聲明數(shù)組變量
arr1 = Array("wise", "rose", "小花鳥", "小花鴨") '對數(shù)組賦值
MsgBox arr1(1) '正確的引用
End Sub
該例子顯示的結(jié)果是rose而不是wise。
如果不習(xí)慣這種默認(rèn)的索引方式,可以利用option base語句。
option base 1:表示數(shù)組中第一個元素的索引號為1
option base 語句只能置于模塊的頂部,并且可選值只能為0或1。因為默認(rèn)狀態(tài)為0,那么option base 0可以忽略。

四、聲明數(shù)組與賦值
1、聲明數(shù)組變量
聲明數(shù)組和聲明其他變量一樣,可以使用dim 、static、private 或public等語句聲明。
一般來說,有兩種聲明方式,一種是靜態(tài)數(shù)組聲明,該種聲明方式在聲明數(shù)組變量時已經(jīng)指明了數(shù)組的大小。一種是動態(tài)數(shù)組聲明,它在程序運行后,數(shù)組大小可以被重置、改變。
數(shù)組聲明:
當(dāng)數(shù)組變量的參數(shù)是一個數(shù)值時,表示它是一維橫向數(shù)組,元素個數(shù)等于該值加1。
如:(1) dim arr(5):表示聲明一個具有6個元素一維橫向數(shù)組,其數(shù)據(jù)類型是變體變量variant;
(2)dim arr(4) as byte:表示聲明一個具有5個元素的橫向數(shù)組,其數(shù)據(jù)類型為byte
如果借助to關(guān)鍵字,可以指定數(shù)組第一個元素的索引值。如
(1)dim arr(1 to 3) as string:表示聲明一個具有3個元素的一維橫向數(shù)組,數(shù)據(jù)類型是string,其第一個元素索引號為1;
(2)如果需要聲明二維數(shù)組,可以使用逗號將參數(shù)分開,其形式為arr(一維,二維),如:
dim arr(3,2) as string:表示聲明一個四行三列的二維數(shù)組,默認(rèn)第一元素索引值為0;
dim arr(1 to 3,1 to 2) as string:表示聲明一個三行二列的二維數(shù)組

2、對數(shù)組變量賦值
數(shù)組賦值通常采用三種方式:利用循環(huán)逐個賦值、利用Array對一維數(shù)組變量賦值、直接將區(qū)域賦予數(shù)組。
循環(huán)賦值:
Sub 數(shù)組賦值()
  Dim arr(3) As String, Item As Integer
  '循環(huán)數(shù)組四個元素
  For Item = 0 To 3
  '逐個賦值,將A1:A4值賦予每個變量
  arr(Item) = Range("A" & Item + 1)
  Next
  MsgBox arr(1)
End Sub

Array 數(shù)組賦值:

Sub 數(shù)組賦值1()
Dim arr As Variant '必須使用變體變量
'一次性對數(shù)組賦值,橫向一維數(shù)組
arr = Array("wise", "Rose", "鳥", "鴨")
MsgBox arr(1)
End Sub
也可以對一維數(shù)組進行縱向賦值:

Sub 數(shù)組賦值2()
Dim arr As Variant '必須使用變體變量
'一次性對數(shù)組賦值,縱向一維數(shù)組
arr = WorksheetFunction.Transpose(Array("wise", "Rose", "鳥", "鴨"))
[D14] = arr
End Sub
區(qū)域賦值:

Sub 區(qū)域賦值()
Dim arr
arr = [A1:A6]
MsgBox arr(4, 1)
End Sub


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2013-6-26 18:20:00 | 只看該作者
{:soso_e113:}[{1,1,1;2,2,2;3,3,3}]寫法有點像json

點擊這里給我發(fā)消息

3#
發(fā)表于 2013-6-26 18:20:59 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

4#
發(fā)表于 2013-6-26 19:06:34 | 只看該作者
本帖最后由 mclly2000 于 2013-6-26 19:08 編輯

謝謝張老板
可能看看我的這個帖子http://ctxi.cn/thread-117145-1-1.html
謝謝
5#
發(fā)表于 2014-4-11 09:57:21 | 只看該作者
學(xué)習(xí)了,謝謝
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2024-10-23 08:31 , Processed in 0.087825 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表