tft每日頭條

 > 生活

 > VBA數組入門

VBA數組入門

生活 更新时间:2025-01-02 02:45:24

VBA數組入門

一、初識數組

1、數組就是一個列表或一組數據表。我們學習數組的目的,就是為了加速我們代碼的效率。

2、我們如何運用數組呢?

首先,必須聲明數組。

其次,給數組賦值,可以是經過一系列的運算後再賦值給數組。

最後,将數組返回到工作表區域中。最終的目的是在工作表中顯示我們想要的結果。

3、調試數組的手段:本地窗口

我們可以通過設置Stop語句,或F8逐步執行代碼,在本地窗口中觀測數組的變化。

Sub test()

Dim arrSheetName(5) As String

Stop

End Sub

VBA數組入門(VBA數組入門)1

4、數組的優勢與不足

數組的速度優勢是明顯的,但不足也很明顯,因為,數組處理的都是數據,因此,它不能給EXCEL數據添加顔色,删除行列,插入行列等等動作。

5、VBA數組沒有内存數組和一般數組之分。我們在聲明數組時,就已經将數組寫入内存裡。

二、聲明數組

1、聲明一個數組變量,也是用Dim語句來聲明。當聲明了一個數組,便決定了這個數組用于存儲數據所用的内存空間。

Dim arrCnt(10) As Integer

Dim arrSheetName(5) As String

Dim arr(7) As Variant

1)、這裡我們看到,與一般定義不同的是多了個帶括号的數字。這個數字,就是這個數組所能存儲的最大元素數。

2)、數組可以根據我們的需要存儲不同類型的數據,這與我們平常變量定義的類型一樣,可以是Integer,Long,String,Variant 等等。

2、注意,上面定義數組的例子是靜态數組,所以,我們在聲明數組時,就決定了數組用于存儲數據所用的内存空間大小。後面我們會講到動态數組。

三、數組的上界和下界

1、VBA中,數組默認的下界是0,也就是Option Base 0

如果,我們習慣了用1作為我們的下界,可以強制聲明:Option Base 1

注:Option Base 0(1)必須放在所有模塊之前。

2、當然,我們也可以忽略這個強制聲明,那我們就需要在聲明數組時,指明數組的上界和下界,如:

Dim arrSheetName(1 to 3) as String

表明這個數組的上下界分别是1和3。

四、靜态數組和動态數組

我們之前所定義的數組,都是靜态數組。靜态數組的特點是具有大小的數組。當我們事先知道數組的大小,那麼,我們可以直接聲明為靜态數組。

如果我們不知道數組大小,那麼我們應定義成動态數組。

1、動态數組是可以改變大小的數組,通過在數組名稱後附帶空括号來聲明,如:

Dim arrSheetName() as String

2、在定義動态數組之後,必須使用ReDim來設置動态數組的上界和下界,為數組重新分配存儲空間。

3、我們可以使用ReDim語句反複地改變數組的元素已經維數。

Sub arr1()

Dim arr() As Long

Dim i As Long

ReDim arr(1 To 3)

For i = 1 To 3

arr(i) = i

Next

Sheet1.[a1].Resize(1, 3) = arr

Stop

ReDim arr(1 To 10)

For i = 1 To 10

arr(i) = i

Next

Sheet1.[a1].Resize(1, 10) = arr

End Sub

4、ReDim Preserve語句

Preserve 英文的意思是保留,保存。顧名思義,就是重新定義數組時,将數組元素保留在數組中。

與ReDim不同的是,使用了ReDim Preserve,隻能通過改變上界,即最末維的大小,來改變數組的大小,且不能改變數組維數。如果改變了下界,就會出現錯誤信息。

例子,見後面的過程Join2。

五、一維數組和多維數組

我們前面所舉的例子都是一維數組,數組可以定義多達60維。

但我們很少看到多過2維的代碼。這也是因為對于Excel的工作表來說,行和列,就是表示2維,我們處理的數據區域很多都是圍繞行和列進行處理。因此,我們隻要掌握的二維數組,就掌握了對Excel的數據處理。

下面通過2幅圖來理解二維數組:

VBA數組入門(VBA數組入門)2

VBA數組入門(VBA數組入門)3

1、定義一個二維數組

Dim arrSource(1 to 100, 1 to 10) As Long

2、定義一個三維數組

Dim arrSource(1 To 10, 1 To 6, -1 To 5) As Long

注:我們可以通過節點的多少來判斷數組維數。

六、數組函數

1、Array 函數

返回一個包含數組的 Variant。

Array函數在運行代碼執行期間創建數組,而不必事先知道數組的大小。

Sub Array1()

Dim arr As Variant

arr = Array(1, 2, 3)

MsgBox arr(0)

End Sub

2、Lbound、UBound函數

LBound 函數:

返回一個 Long 型數據,其值為指定的數組維可用的最小下标。

UBound 函數:

返回一個 Long 型數據,其值為指定的數組維可用的最大下标。

Sub ULbound1()

Dim arr As Variant

arr = Array(1, 2, 3)

MsgBox UBound(arr)

MsgBox LBound(arr)

End Sub

Sub ULbound2()

Dim arr(1 To 100, 1 To 10, -1 To 3) As Integer

MsgBox UBound(arr, 1)

MsgBox UBound(arr, 2)

MsgBox LBound(arr, 3)

End Sub

3、Split函數

返回一個下标從零開始的一維數組,它包含指定數目的子字符串。

語法:Split(expression[, delimiter[, limit[, compare]]])

expression

必需的。包含子字符串和分隔符的字符串表達式 。如果expression是一個長度為零的字符串(""),Split則返回一個空數組,即沒有元素和數據的數組。

delimiter

可選的。用于标識子字符串邊界的字符串字符。如果忽略,則使用空格字符(" ")作為分隔符。如果delimiter是一個長度為零的字符串,則返回的數組僅包含一個元素,即完整的 expression字符串。

limit

可選的。要返回的子字符串數,–1表示返回所有的子字符串。

compare

可選的。數字值,表示判别子字符串時使用的比較方式。關于其值,請參閱“設置值”部分。

Sub Split1()

Dim strJoin As String

Dim arrSplit As variant

strJoin = "a,b,c"

arrSplit = Split(strJoin, ",")

Sheet1.[a1].Resize(1, 3) = arrSplit

End Sub

4、Join函數

返回一個字符串,該字符串是通過連接某個數組中的多個子字符串而創建的。

語法:Join(sourcearray[, delimiter])

sourcearray

必需的。包含被連接子字符串的一維數組。

delimiter

可選的。在返回字符串中用于分隔子字符串的字符。如果忽略該項,則使用空格(" ")來分隔子字符串。如果delimiter是零長度字符串(""),則列表中的所有項目都連接在一起,中間沒有分隔符。

Sub Join1()

Dim strJoin As String

strJoin = Join(Array("a", "b", "c"), ",")

MsgBox strJoin

End Sub

5、Filter函數

返回一個下标從零開始的數組,該數組包含基于指定篩選條件的一個字符串數組的子集。

語法:Filter(sourcesrray, match[, include[, compare]])

sourcearray

必需的。要執行搜索的一維字符串數組。

match

必需的。要搜索的字符串。

include

可選的。Boolean值,表示返回子串包含還是不包含match字符串。如果includeTrueFilter返回的是包含match子字符串的數組子集。如果includeFalseFilter返回的是不包含match子字符串的數組子集。

compare

可選的。數字值,表示所使用的字符串比較類型。有關其設置,請參閱下面的“設置值”部分。

‘查找2數組的差集

Sub Filter1()

Dim varArr1 As Variant

Dim varArr2 As Variant

Dim i As Integer

varArr2 = Array(1021, 1023, 1025)

varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)

For i = 0 To UBound(varArr2)

varArr1 = VBA.Filter(varArr1, varArr2(i), False)

Next i

MsgBox Join(varArr1)

End Sub

注意,filter函數在此是模糊查找,下面代碼将無法返回我們想要的值

Sub Filter1()

Dim varArr1 As Variant

Dim varArr2 As Variant

Dim i As Integer

varArr2 = Array(10, 1023, 1025)

varArr1 = Array(1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028)

For i = 0 To UBound(varArr2)

varArr1 = VBA.Filter(varArr1, varArr2(i), False)

Next i

MsgBox Join(varArr1)

End Sub

七、釋放數組

在某些情況下,我們根據需要來釋放數組來重新定義數組,或避免數據堆棧。

Erase語句

重新初始化大小固定的數組元素,以及釋放動态數組的存儲空間。即,Erase可以删除靜态數組和動态數組裡的數據元素。

Sub Erase1()

Dim arr(1 To 100) As Integer

arr(1) = 1

MsgBox arr(1)

MsgBox UBound(arr)

Erase arr

MsgBox arr(1)

MsgBox UBound(arr)

End Sub

從上面的代碼中,我們可以看到,Erase語句用于清除數組元素,對靜态數組維數和上标是沒有改變的。

而對于動态數組,Erase 語句在釋放動态數組所使用的内存後。在下次引用該動态數組之前,程序必須使用 ReDim 語句來重新定義該數組變量的維數。

Sub Erase2()

Dim arr() As Integer

ReDim arr(1 To 100)

arr(1) = 1

MsgBox arr(1)

MsgBox UBound(arr)

Erase arr

'ReDim arr(1 To 10)

MsgBox arr(1)

MsgBox UBound(arr)

End Sub

八、數組與單元格區域

通過上面的幾個概念,我們明白了數組的定義、賦值。我們最終的目的是通過數組來操作工作表區域中的數據,下面我們通過幾個例子來進一步理解數組。

1、将單元格區域賦值給數組

見過程RangeArray1,RangeArray2,RangeArray3

2、拆分合并特定單元格數據

見過程 Split2,Join2,Split3

3、維數轉置

見過程RangeArray4

九、數組實例

1、提取不重複數據。見UniqueData過程

2、轉置數據區域。 見TransposeData過程

上面就是我們入門數組需要學習和理解的内容,謝謝大家!

HOmT398 2007.8.31于北京

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved