靜態(tài)數組:長(cháng)度不變的數組
動(dòng)態(tài)數組:長(cháng)度不定的數組,需要redim
數組 arr() 必須先聲明后才可以使用!
(1)數組的index下標應該是從0開(kāi)始的,比如split生成的,還有未指定index下標的
如 dim arr1(5)
(2)但是數組的index下標也有從1開(kāi)始的情況,比如range 賦值的變量,默認下標從1開(kāi)始
如 arr2=range("b1:d5")
(3)數組的index下標受控制的情況
模塊最前面 option base -1
(4)數組index下標最好自己定義好
如 dim arr3(1 to 5)
Dim arr1(3)
Dim arr1( 1 to 3)
Option base 1 等等的意義
創(chuàng )建數組的方法
(1) array()
(2) split() (對應join)
(3) 挨個(gè)元素賦值,甚至循環(huán)
(4) 變量/對象 = range對象(值)
Sub test101()rem 測試創(chuàng )建數組的各種方法Dim arr1Dim arr2Dim arr3(0 To 3)arr1 = Array(1, 2, 3, 4, 5, 6, 7)arr2 = Split("a,b,c,d,e,f,g", ",")arr3(0) = 1arr3(1) = 2Debug.Print arr1(1)Debug.Print arr2(1)Debug.Print arr3(1)End Sub變量可以不事先定義,也可以不賦初值
數組必須實(shí)現聲明大小后才可以使用
rem 變量可以賦初值,就可以表達式運算,不同類(lèi)型的變量,默認初值不同
rem 數組必須聲明大小后才可以使用,包括運算,或者賦值
js 里 變量名 $a 字符串a(chǎn)
和其他語(yǔ)言不同的,其他語(yǔ)言標準 字符,字符串為 "", 變量名不用特殊標記
而js 標記了變量,本質(zhì)是一樣的
python里 變量 a 字符串" a” 函數 func() 數組 list=[]
函數和數組形式完全不同,沒(méi)有實(shí)現區分的必要性
VBA里 變量 a 字符串 “a” 函數 func() 數組 array()
數組和函數形式很像,所以需要實(shí)現定義清楚,否則不好區分
但是VB里,index用 () 而不是一般語(yǔ)言的 []
Sub t3()Dim arr3(3) As Integerarr4(1) = 1 '直接會(huì )報錯,arr4未定義??!End Sub
rem 變量可以賦初值,就可以表達式運算,不同的變量,默認初值不同
Sub t3()rem 變量可以賦初值,就可以表達式運算,不同的變量,默認初值不同a = a + 1Debug.Print a'arr4(1) = 1 '直接會(huì )報錯,arr4未定義??!End Sub
'selectionSub 刪除空格4()Dim arr1()ReDim arr1(11) '不redim呢j = 0 'j=1開(kāi)始就會(huì )越界For i = 1 To 11 Step 1 If Not IsEmpty(Cells(i, 1)) Then arr1(j) = Cells(i, 1) j = j + 1 End IfNext iFor j = 0 To UBound(arr1()) Cells(j + 1, 9) = arr1(j) '單元格得從1開(kāi)始,arr()得從0開(kāi)始Next jEnd Sub
直接聲明數組
數組名為變量
數組名為對象名
變量名代表變量
dim a
或者不聲明 a 直接使用也默認為變量
數組名 與數組
如果先聲明 dim arr1()
arr1 就代表 arr1() 否則arr1 一般就被認為是變量名
函數名 與函數
如果先聲明的 function func1()
func1 就代表 func1()
而數組不能被直接賦值
只有數組的元素可以被賦值
而變量,對象都是可以被直接賦值的
Sub test001()Rem VBA里的array是數組 Rem 數組不能被賦值,只能給數組的元素賦值Rem Excel里的range是對象,2維數組對象 <> 數組,range是對象不是數組! Rem 對象是可以被賦值的,賦值給了對象的 range.value屬性Dim arr1(3) '如果已經(jīng)聲明為數組名了,arr1就代表arr1(),以后就不能給數組賦值Dim arr2 As Variant '相當于dim arr2Dim arr3 As Object'arr1 = Range("a1:c1") '不能給數組賦值? 只能給數組里的元素賦值?arr1 = Range("a1:c1").value 也不行arr1(0) = Range("a1") '可以給數組的某個(gè)元素賦值arr2 = Range("a1:c1") '可以給變量賦值,賦予這個(gè)變量整個(gè)數組Set arr3 = Range("a1:c3") '可以把EXCEL的range 賦值給變量,或對象。然后默認都成為了2維數組。Range("b2:c2") = 9999Debug.Print "arr1(0)=" & arr1(0)Debug.Print "arr2(1,1)=" & arr2(1, 1)Debug.Print "arr3(1,1)=" & arr3(1, 1)End SubDim Array
Dim Array()
Dim array as object
無(wú)差別??--是不是有點(diǎn)太隨便了,反而不好學(xué)規律
聲明數組的時(shí)候
無(wú)論dim arr1 (as variant)
還是 dim arr1()
但是一旦 dim arr1 as object就有問(wèn)題,數組不是對象? 報錯 缺少數組
但是一旦 dim arr1() as object就有問(wèn)題,數組不是對象? 報錯缺少數組
總結:這2種沒(méi)差別
dim arr1 或 dim arr1() 都可以
arr1=range 或 arr1()=range 都可以
Sub 測試1()Dim arr1 As Variantarr1 = Range("a1:c4") '這里為什么不 set 為對象呢?Debug.Print arr1(3, 3)Debug.Print LBound(arr1)Debug.Print UBound(arr1)Debug.Print LBound(arr1, 2) '二維數組,第1維默認是行數,往下數!Debug.Print UBound(arr1, 2) '二維數組, array(row,column)Sub 測試2()Dim arr2()arr2 = Range("a1:c4")Debug.Print arr2(3, 3)Debug.Print LBound(arr2)Debug.Print UBound(arr2)Debug.Print LBound(arr2, 2)Debug.Print UBound(arr2, 2)End SubSub 測試3()Dim arr2()arr2() = Range("a1:c4")Debug.Print arr2(3, 3)Debug.Print LBound(arr2)Debug.Print UBound(arr2)Debug.Print LBound(arr2, 2)Debug.Print UBound(arr2, 2)End SubEnd SubSub 測試1()Dim arr1 '定義arr1() 其實(shí)arr1就代表了數組把 arr1()只是明晰了聲明了arr1是數組arr1 = Array(Range("a1:a4"), Range("b1:b4"), Range("c1:c4"))Rem array()轉的都是1維數組把, no 這里是三維數組Rem array 只是加一維,并非是轉成1維數組了Debug.Print arr1(0)(1)(1)For i = 1 To UBound(arr1)Debug.Print arr1(i)(2)(1) '寫(xiě)成arr(i)會(huì )報類(lèi)型不匹配,因為數組維數不對Next iEnd Subarray 使用前,必須先定義 dim array() 大小
無(wú)論是靜態(tài)的數組,或是靜態(tài)的大小 dim array(10) 或 redim array()
首先要記住,cells()等是excel對象,其pos是(row column)組成,所以下標必須從1開(kāi)始,不能從開(kāi)始
而array() 默認index都是從0開(kāi)始, 比如這么定義 dim arr1(4,3) 實(shí)際上是 arr1(0 to 4, 0 to 3)
但是array的index下標可以從1 或者2 等其他開(kāi)始
比如 dim array1(1 to 5) dim array2(2to7)
一般為了兩者匹配,所以定義數組維度時(shí)會(huì )這么定義
arr1(1 to 4, 1 to 3) 完全是為了方便和excel對象的數據匹配
所以下面兩種寫(xiě)法都可以,如果用array的index從0開(kāi)始則需要注意,對應匹配好excel對象的 下標+1 和ubound -1
Sub 測試2()Dim arr1(4, 3)For i = 0 To 3For j = 0 To 2arr1(i, j) = Cells(i + 1, j + 1)Debug.Print arr1(i, j)Next jNext iDebug.Print vbCrLf ‘測試腳手架,不是一直有Debug.Print arr1(0, 0)End Sub
下面這么嚴格和excel對應也是OK的,一般人會(huì )這么寫(xiě),
但要明白 array() 不嚴格聲明下標 1 to 4 默認都會(huì )是 0 to 4,要明白這個(gè)??!
但是因為沒(méi)有arr1(0,0) 所以Debug.Print arr1(0, 0) 會(huì )報錯!
Sub 測試3()Dim arr1(1 To 4, 1 To 3)For i = 1 To 4For j = 1 To 3arr1(i, j) = Cells(i, j)Debug.Print arr1(i, j)Next jNext iDebug.Print vbCrLfEnd Sub
但是如果含糊寫(xiě),又不對應,也沒(méi)問(wèn)題
只是要知道。Arr1(0,0) 這里實(shí)際是沒(méi)被賦值的,只是VBA這里沒(méi)事。
Debug.Print arr1(0, 0) 不會(huì )打印出東西 none 也不報錯
Sub 測試4()Dim arr1(4, 3)For i = 1 To 4For j = 1 To 3arr1(i, j) = Cells(i, j)Debug.Print arr1(i, j)Next jNext iEnd Sub
靜態(tài)數組定義的語(yǔ)法:
dim arr1(10) as string 資料說(shuō)是從1開(kāi)始,我測試是從0開(kāi)始
但是0~10都不越界,不是有11個(gè)數了? 就是0-11?
dim arr2(5 to 10) as string
另外,數組數據類(lèi)型也并不需要都是 as string, 測試 as integer同樣沒(méi)問(wèn)題
Sub t3()Dim arr(10) As StringFor i = 1 To 10 Step 1arr(i) = iDebug.Print (arr(i))Next iDebug.Print arr(5)Debug.Print arr(0) '不顯示下標越界Debug.Print arr(11) '會(huì )顯示下標越界End Sub
Sub t3()Dim arr(10) As IntegerFor i = 1 To 10 Step 1arr(i) = iDebug.Print (arr(i))Next iDebug.Print arr(5)Debug.Print arr(0) '不顯示下標越界End Sub
動(dòng)態(tài)數組定義
dim arr3() as string 或 dim arr3()
數組重定義:redim
只能重定義動(dòng)態(tài)數組! 也必須重定義大??! 不redim前無(wú)法使用
redim時(shí),下標可以是變量
Sub t3()Dim arr3() As Integer '如果定義dim arr3 as integer 會(huì )成為一個(gè)變量Dim arr4() As IntegerFor i = 1 To 5 Step 1ReDim arr3(1 To i) '使用數組的內容之前,必須先redim 否則會(huì )顯示下標越界ReDim arr4(1 To i)arr3(i) = iarr4(i) = iDebug.Print (arr3(i))Debug.Print (arr4(i))Next iEnd Sub
Sub t3()Dim arr5(1 To 5) As IntegerReDim arr5(1 To 10) As String '不能對靜態(tài)數組redim改變大小End Sub
指向excel對象,比如range() 的 默認為2維數組,因為EXCEL表本身就是二維數組!
二維數組的下標,需要用excel里的r1c1模式
因為是二維數組,不能這么使用,即使只是1行或者1列數,但仍然是二維數據結構!
arr1()=range("a1:e1") 雖然看起來(lái)只是a1 b1 c1 d1 e1 這5個(gè)數,但由于是在excel表里的對象,是二維的
Sub t3()Rem Dim arr6 As Integerarr6 = Range("a1:a5")Debug.Print arr6(1, 1)Debug.Print arr6(2, 1)Debug.Print arr6(3, 1)Debug.Print arr6(4, 1)Debug.Print arr6(5, 1)End Sub
定義方法
dim arr1(4,5) as string
dim arr1 (0 to 4,0 to 5) as integer
Sub t4()Dim arr1(0 To 4, 0 To 5) As Integerarr1(0, 0) = 999Debug.Print arr1(0, 0)End Sub
靜態(tài)數組就不要再redim
動(dòng)態(tài)數據就一定需要redim
Sub t4()Dim arr2()Rem Dim arr2(5, 6) '使用動(dòng)態(tài)數組 redim就不要和 靜態(tài)數組定義格式混用For i = 0 To 5 Step 1For j = 0 To 6 Step 1ReDim arr2(0 To i, 0 To j) '動(dòng)態(tài)數組,必須在使用前redimarr2(i, j) = i + jDebug.Print arr2(i, j)Next jNext i
Sub t4()Dim arr2(5, 6)For i = 0 To 5 Step 1For j = 0 To 6 Step 1Rem ReDim arr2(0 To i, 0 To j) '如果要用靜態(tài)數組也可以,但不要再redim了!arr2(i, j) = i + jDebug.Print arr2(i, j)Next jNext iEnd Sub
下標也是從0開(kāi)始的
Sub t4()Dim arr3(3, 4, 5)arr3(0, 0, 0) = 888Debug.Print arr3(0, 0, 0)End Sub
到底哪種指定維度的方法正確?
arr(1,2)
arr(1)(2)
現在實(shí)際測試的結果是
arr可以定位為變量,賦值為一個(gè)range 或 range.value,等價(jià)
但是沒(méi)有 array().value 這種用法
現在實(shí)際測試的結果是
2維數組,只能arr(1,2)
3維數組,有的arr(1,2,3) 有的arr(1)(2)(3)
三維數組的表示問(wèn)題,和之前的不同了Sub test_3d()Dim arr1(1 To 2)Dim arr2(1 To 2, 1 To 2)Dim arr3(1 To 2, 1 To 2, 1 To 2)Dim arr4arr1(1) = 1arr2(1, 1) = 10arr3(1, 1, 1) = 100'arr4(1)(1)(1) = 100 為啥現在這么寫(xiě)不行了?莫不是偏移3次?對比之前的Debug.Print arr1(1)Debug.Print arr2(1, 1)Debug.Print arr3(1, 1, 1)'Debug.Print arr4(1)(1)(1)End Sub
Sub test1()Dim arr1Dim arr2Dim arr3Dim arr4Dim arr5(3, 4, 5)arr1 = Range("b1:b3")Debug.Print arr1(3, 1)'Debug.Print arr1(3)(1)arr2 = Range("b1:b3").ValueDebug.Print arr2(3, 1)'Debug.Print arr2(3)(1)arr3 = Array(Range("a1:a3"), Range("b1:b3"))'Debug.Print arr3(0, 1, 1)Debug.Print arr3(1)(1)(3)'arr4 = Array(Range("a1:a3"), Range("b1:b3")).Value '報錯''Debug.Print arr4(0, 1, 1)'Debug.Print arr4(1)(1)(3)arr5(0, 0, 0) = 111Debug.Print arr5(0, 0, 0)'Debug.Print arr5(0)(0)(0)End Sub聯(lián)系客服