大家好,我是中藥黨。

上次我們對比學習了一下ExcelVBA中數組、集合和字典的概念和聲明語法,我個人覺得在聲明部分,三者的區別還是挺大的。下面我們一塊學習一下賦值方面的知識點,因為內容較多,我們今天就先學習一下給數組變數賦值的內容。

三、賦值

不管是數組、集合還是字典,都有向變數賦值的操作,賦值也是這幾個概念的核心和關鍵,操作也有很大不同。

1.向數組變數賦值

對數組來說,數組中的每個元素數據類型必須相同,從數組聲明就可以看出,這是數組與集合和字典的明顯不同。這就要求向數組變數賦值時的數據規範必須嚴格。

a.向數組中單個數組元素的賦值

當數組已經確定了長度,我們就可以對數組內的元素進行賦值。可以對數組中某一具體索引位置的數組元素進行寫入的,如下圖:

當數組長度還不確定,在代碼運行過程中發現有滿足條件的值時,才擴大數組長度,再將值賦給單個數組元素。這樣的需求該怎麼辦呢?

例如有個題目,求100以內自然數中,第7個數字2和數字3的公倍數。

有的小夥伴很快就想到了思路,首先定義一個動態數組arr,然後從1到100開始循環遍歷,當數字循環到2和3的公倍數時,ReDim該數組的長度為y,並把當前數字添加進數組,y自增加1,再循環到符合條件的數字時,再ReDim該數組的長度為y,再把當前數字添加進數組,依次循環到100,循環結束後,通過arr(索引)就得到了結果。我們按照這個思路寫下代碼,如下圖:

在逐行運行時,我們觀察一下本地窗口中,各個參數的值,如下圖:

我們發現,在循環到第一個滿足條件的數字6時,將6添加到數組中,這時是正常的,但是當循環到第二個滿足條件的數字12時,在運行Redim arr(y)這行代碼時,會將數組置空,之後才會將滿圖條件的數字放入到數組的第二個位置,像這樣循環到最後,數組中只會存著最後一個滿足條件的值,前邊的都會被置空。這種情況是我們不想要的,我們只想擴大一下數組,之前填充到數組中的內容是不想改變的。

於是,我們在循環中重定義數組的代碼中加上ReDim的參數Preserve,它的意思就是當arr是一個動態數組,用ReDim Preserve重定義arr修改長度時,不清空之前數組中的元素(Redim 不能重定義靜態數組的長度)。我們再試一下,如下圖:

如果在ReDim中使用了Preserve可選參數,只能調整數組最後維的大小,並且不能改變數組的維數。例如,如果數組只有一維,就可以修改該數組的大小,因為該維是最後的也是僅有的一維。但是,如果數組有兩個或者更多維,就只能改變末維的大小並保留數組內容。

ReDim Preserve重定義數組長度時,該數組在聲明時必須是動態數組,即Dim arr(),不能聲明成Variant類型(即不能Dim arr或者Dim arr as Variant),否則都會報錯。

b.向數組變數整體賦值

整體賦值的意思就是把一個數組直接賦值給數組變數,而不是通過對單個數組元素的賦值。整體賦值要求數組變數在聲明時必須聲明為動態數組或者Variant類型,不能向聲明為靜態數組的變數賦值,如果聲明成靜態數組的變數被整體賦值,即使數組長度一致,也會報錯。

整體賦值數組經常將以下幾種數組賦給數組變數的情況:

1)常量數組,就是常數組成的數組。

我們常用花括弧括起來的一組用逗號或分號隔開的值來表達常量數組,使用花括弧表達的常量數組進行整體賦值時,必須給花括弧兩邊加方括弧。將一維橫向數組賦給變數,如下圖:

一維縱向數組賦給數組變數arr,如下圖:

關於常量數組中逗號和分號的區別,其實很簡單,逗號隔開的是列數據,分號隔開的是行數據,如下圖:

2)區域數組,實際上是單元格區域,數據存儲在單元格中。使用Range表達的數組賦值給數組變數時,將是一個二維數組,如下圖:

即使Range是一行或者一列,賦值後也是一個二維數組,如下圖:

3)內存數組,實際上包含常量數組,但它主要指某個函數的計算結果是數組。

使用Array函數創建數組。使用Array函數一般只能寫入橫向的一維數組,如下圖:

細心的小夥伴已經發現了不同,在默認情況下, Array表達的一維橫向數組整體賦值時,數組的最小下標是從0開始的,而之前介紹其他的整體賦值,下標都是從1開始的,在使用時也要多加留意哦。關於下標開始,有興趣的小夥伴可以研究一下設置Option Base ,這裡就不多說了。

如果用Array表達的一維橫向數組變成縱向的數組,就不能在Array函數中用分號分隔元素了,就要用到Transpose函數,如下圖:

介紹一下Transpose函數

該函數為工作表函數,這類函數可以通過Application.Transpose、Application.WorksheetFunction.Transpose或者WorksheetFunction.Transpose三種方式調用,不同的是通過WorksheetFunction調用的,在VBE中可以看到工作表函數的代碼提示。

Transpose能返迴轉置後的數組,將數組的第一行作為新數組的第一列,將數組的第二行作為新數組的第二列,依此類推。上圖是將一維橫向數組轉置為一維縱向數組,下圖則是將一個二維數組進行轉置,如下圖:

有的小夥伴就要問了,Array能不能表達多維數組?答案當然是肯定的,利用Array函數嵌套就可以,例如Array(Array(1,2,3),Array(4,5,6),Array(7,8,9)),就是一個三行三列的二維數組,這裡我們就不再贅述了,有興趣的小夥伴可以研究下。

使用Split函數創建數組

Split函數我們已經在很多地方都使用到了,該函數就是通過分隔符將一個字元串分成若干個元素,返回一個由分隔出的元素組成的一維數組,如下圖:

這裡使用Split就有一個隱藏知識點,就是接收Split函數返回的數組變數,要麼是Variant類型的,要麼就是確定數據類型的動態數組。這個解釋太拗口了,以上圖為例,要麼聲明數組用Dim arr as Variant或Dim arr,要麼用Dim arr() as String,是不能用數據類型不確定的的動態數組(如Dim arr() 或者Dim arr() as Variant)接收Split返回值的,否則會報錯。

小結一下今天的知識點:

①數組元素中的數據類型必須一致,而集合和字典沒有強制要求。

②當數組已經確定了長度,我們就可以對數組內的單個數組元素進行賦值,從而完成對數組的賦值。

③可以使用ReDim的Preserve參數重新定義動態數組長度而不清空之前數組中內容。在需要擴大動態數組,而不修改原先數組內的元素時,就要用到Preserve關鍵字,用ReDim Preserve重定義數組長度時,該數組在聲明時必須是動態數組,即Dim arr(),不能聲明成Variant類型,(不能Dim arr或者Dim arr as Variant),否則都會報錯。

④數組的整體賦值時,數組變數必須是動態數組或者是Variant變數。可以用常量數組、區域數組和內存數組向變數整體賦值。

常量數組用花括弧表示「{ }」,在VBA中使用時還需給兩邊加方括弧「[ ]」,數組元素中逗號分隔列,分號分隔行。

區域數組用Range表示,將區域數組賦值給數組變數時,將會是一個二維數組,即使Range只有一行或者一列。

內存數組中,我們介紹了兩個常用的函數返回數組,一個是Array,一個是Split,這兩個函數都是返回一個一維橫向數組,默認返回數組下標都從0開始。Split函數返回的數組賦給變數時,變數必須是確定數據類型的動態數組或者Variant類型

⑤對數組轉置時,可以用WorksheetFunction.Transpose。

本來一開始這次是想把數組、集合和字典的賦值操作都寫完的,但是因為邊寫邊加,發現數組賦值的相關內容就有很多,知識點還是有點紛雜,篇幅的原因就先寫到這。希望小夥伴們也能對基礎數組知識進行查缺補漏,完善這塊學習內容。

猜您喜歡往期精選▼

1.【20180904】- VBA中數組、集合和字典(一)——概念和聲明語法

2.【20180831】- 工作簿太多怎麼辦,自動工作表目錄來幫忙

3.【20180828】- Excel VBA工作表引用方式,傻傻也分得清

4.【20180825】- 學Office,從安裝開始 - 11 Office 2019預覽版安裝演示

5.【20180824】- 學Office,從安裝開始 - 10 Office 365介紹和安裝

6. ……

想要學習更多內容,歡迎關注我們~Written by 中藥黨 in 20180907^_^

微信公眾號:SaveUTime

SUT學習交流羣:615356012,入羣費用:5元,非誠勿擾~

關注公眾號,提高效率,節約您的時間!

推薦閱讀:

相關文章