陣列工具模組

多維陣列的排列方式
求取陣列第一個元素的指標
求取陣列內基本元素所佔位元組
求取陣列總佔記憶體位元組數
判斷陣列是否初始化
自訂陣列
求取陣列描述器指標
求取陣列維度
求取陣列元素總數
轉換任意維度陣列成為線性一維陣列
調整陣列宣告個數與下標
求取最大值、最小值函數

多維陣列的排列方式

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)

記憶體中的排列方式

tArray(1, 2, 11) -> tArray(2, 2, 11)

求取陣列描述器指標

GetArrayStructPtr(hVariant)

傳回陣列描述器在記憶體中的位址

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)
Debug.Print GetArrayStructPtr(tArray) ' 傳回陣列描述器在記憶體中的位址

求取陣列第一個元素的指標

GetArrayPtr(hVariant)

依陣列描述器傳回陣列中第一個元素在記憶體中的位址,若陣列宣告與 VarPtr 函數在同一函式中,則 VarPtr(hVariant(LBound)) 傳回與 GetArrayPtr 相同的值,若有跨越數個函式,則 VarPtr(hVariant(LBound)) 會傳回另一個 Variant 的位置,間接指向陣列,若需快速複製陣列,則此函數非常有用,唯陣列在傳遞過程中不可使用傳值呼叫,避免指向新的暫存陣列

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)
Debug.Print GetArrayPtr(tArray) ' 傳回陣列中第一個元素在記憶體中的位址

求取陣列維度

myArrayGetDim(hVariantArray) 、mySafeArrayGetDim(hVariant)

傳回陣列宣告時的維度,可配合發展專業的子模組,在子模組未知父程序宣告時的維度時,可透過本函數求得

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)
Debug.Print myArrayGetDim(tArray) ' 傳回 3 (3 維)

求取陣列內基本元素所佔位元組

myArrayGetElemSize(hVariantArray) 、mySafeArrayGetElemSize(hVariant)

傳回陣列宣告時的每個元素所佔的位元組,這個對可變長度字串陣列而言,每個元素的位元組僅佔 4 Bytes

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13) As Long
Debug.Print myArrayGetElemSize(tArray) ' 傳回 4 (4 Bytes)

求取陣列元素總數

ArrayGetElements(SourceArray)

傳回陣列內元素的總數,一維線性陣列大概用不著這個函數,在多維陣列中才用得著

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)
Debug.Print ArrayGetElements(tArray) ' 傳回陣列內元素的總數

求取陣列總佔記憶體位元組數

ArrayGetSize(SourceArray)

傳回陣列內所有元素所佔記憶體的總位元數,為求取陣列內基本元素所佔位元組求取陣列元素總數兩函數的結合,受求取陣列內基本元素所佔位元組的限制,對可變長度字串陣列而言,每個元素的位元組僅佔 4 Bytes

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13) As Double
Debug.Print ArrayGetSize(tArray) ' 傳回 216 (216 Bytes)

轉換任意維度陣列成為線性一維陣列

TransformArrayToOneDimension(SourceArray)

將任意維度陣列轉換為一維,本函數主要僅修改 Visual Basic 中的陣列描述器,可以最短的執行速度將多維陣列變更為一維陣列,算是高效率的方法

範例

ReDim tArray(1 To 3, 2 To 4, 11 To 13)
tArray = TransformArrayToOneDimension(tArray) ' 傳回一維陣列

註:本模組雖提供陣列描述器的自定型態,但沒把握時請勿修改其值,避免記憶體錯誤導致當機

判斷陣列是否初始化

IsArrayInit(SourceArray)

若使用動態陣列時,常會因陣列未初始化而導致錯誤事件,本函數利用陣列維度函數判斷陣列是否初始化,若陣列維度大於 0 ,表示目前有資料在陣列內,傳回值為真 (True),若傳入引數不是陣列,則傳回值為否 (False)

範例

Dim tArray()
Debug.Print IsArrayInit(tArray) ' 傳回否 (False)

ReDim tArray(1 To 3)
Debug.Print IsArrayInit(tArray) ' 傳回真 (True)

Erase tArray
Debug.Print IsArrayInit(tArray) ' 傳回否 (False)

調整陣列宣告個數與下標

mySafeArrayRedim(hVariant, [ArrayElements], [ArrayLowerBound])

參數 說明
hVariant Variant 變數陣列
ArrayElements 選擇性參數,最後一維陣列元素個數
ArrayLowerBound 選擇性參數,最後一維陣列下標

範例:

項目 程式碼 下標 上標
原始宣告 ReDim vArray(1 To 5) 1 5
變更上標 vArray=mySafeArrayRedim(vArray, 6) 1 6
變更下標 vArray=mySafeArrayRedim(vArray, , 0) 0 4
其它變更 vArray=mySafeArrayRedim(vArray, 6, 0) 0 5

 

項目 程式碼 下標 上標
原始宣告 vArray=Array(1, 2, 3, 4, 5) 0 4
變更上標 vArray=mySafeArrayRedim(vArray, 6) 0 5
變更下標 vArray=mySafeArrayRedim(vArray, , 1) 1 5
其它變更 vArray=mySafeArrayRedim(vArray, 6, 1) 1 6

在 Visual Basic 中若要調整陣列之個數,可用

ReDim Preserve varname(lb to ub)

但 Preserve 這個選擇性參數有兩項限制:

1. 只能改上標

項目 程式碼 是否正確
原始宣告 ReDim vArray(1 To 5)
變更上標 ReDim vArray(1 To 8)
變更下標 ReDim vArray(0 To 5)

2. Variant 變數陣列不能變更

項目 程式碼 是否正確
原始宣告 vArray=Array(1, 2, 3)
變更上標 ReDim vArray(0 To 1)
變更下標 ReDim vArray(1 To 2)

使用本函數可改善上述缺點!

附註:

本網站有許多傳回陣列之函數,其特性接近 Array 函數,必須靠本函數調整陣列上下標

自訂陣列

myArray(hVariant, ...,...)

參數 說明
hVariant Variant 變數,變數個數不限

範例:

項目 程式碼 下標 上標
原始宣告 vArray=myArray(3,4,5,6,7,8) 1 6

本函數為調整陣列宣告個數與下標之應用,一般慣用陣列基底為 1 ,然 VB 中所提供之 Array 函數陣列基底為 0 ,本函數考量經常採用之陣列為例,採以 1 為基底之函數提供撰寫參考,若有須以其他值為基底,可參閱本函數逕行修改!

求取最大值、最小值函數

函數名 引數 說明
MyMax 不定 從任意個數引數中傳回最大值,至多不限
MyMin 不定 從任意個數引數中傳回最小值,至多不限

更新為任意引數均可接受陣列,不限維度,不限陣列深度,若為二維以上的陣列,將自動轉換為一維陣列後判斷,若為多層次之深度陣列,則以遞迴方式自我呼叫處理,若無輸入任何有效引數,則傳回 Empty ,例:

Dim Test(1 to 2):Test(1)=1:Test(2)=2

函數範例 傳回值
MyMax(1, 1.7, 5, 2, 0.8) 5
MyMin(1, 1.7, 5, 2, 0.8) 0.8
MyMax(32767, 32768) 32768
MyMin(32767, 32768) 32767
MyMax(1) 1
MyMin(1) 1
MyMax(Array(1, 2, 4)) 4
MyMax(Array(1,2,4), 7, 6, 5, 3) 7
MyMin(Test) 1
MyMax(Test,-1) 2
MyMax(Array(1,2,4), Test(2)) 4
MyMax("A", Array("B", "a")) a
MyMin("A", Array("B", "a")) A
MyMax("A", Array("B", "a"), 1) a
MyMin("A", Array("B", "a"), 1) 1
MyMax(0, Array(1, Array(Array(2, 3), 4))) 4
MyMin(0, Array(1, Array(Array(2, 3), 4))) 0