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