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