|
部分 | 說明 |
---|---|
object | 集合對象表達式 |
item | 必需的。要添加到集合中的元素或項目 |
key | 可選的,。在一個集合中這個key必需是唯一的字符串,,不能出現重復,其作用是用于代替位置索引訪問集合中的元素或項目,,該key值不區(qū)分大小寫,,并且如果在key中已經使用某個字符串,,那么,item中也不能出現該字符串,。 |
before | 可選的,,介于1 和 集合的成員數量(collection.count)之間。如果該值取值是字符串表達式,,則為key值 |
after | 同上,, 注意after和before不能同時指定 |
示例
Sub Collection_Test()
'聲明并初始化一個Collection對象變量c
Dim c As New Collection
'最常規(guī)的Add方法的調用,可Add任意類型的對象
c.Add "One"
'有key參數的調用,這個字符串的key參數必須沒有被占用
c.Add "Two", "Second"
'下面這句會導致運行時錯誤457,,也即索引已經被占用
' c.Add "Hao", "Second"
'下面這句傳遞了before參數,,將"Zero"插入到原來的第二個元素之前,也即占用第二個元素的位置
c.Add "Zero", , 2
'下面這句傳遞了after參數,,將"Oh yeah"插入到原來的第二個元素之后,,也即現在的"Zero"之后,成為第三個元素
c.Add "Oh yeah", , , 2
'下面這句傳遞三個參數,,key參數只是給集合中的這個新增元素一個除原有的數值索引外的另一個字符串索引,,這個索引會更友好,更方便記憶
c.Add "Five", "Fifth", , 4
'下面是讀取"Five"這個元素,,可見字符串索引,,是不區(qū)分大小寫的
Debug.Print c("fifth"), c("Fifth"), c(5), c.Item(5), c.Item("Fifth"), c.Item("fifth")
'下面這一句會出錯,錯誤提示:索引已經被占用
' c.Add "Six", "fifth"
End Sub
以上示例來自于 :
VBA筆記——collection方法
示例2: 演示 結構體不能保存到collection中
' 在普通模塊中聲明一個結構體
Public Type Person
name As String
age As Integer
End Type
Sub test()
Dim mycollection As New Collection
Dim p As Person
p.name = "john"
p.age = 25
mycollection.Add p ' 此語句報錯
Debug.Print mycollection(1).name
End Sub
字典(Dictionary)對象是微軟Windows腳本語言中的一個很有用的對象(經過我的測試也是有序的),。字典對象相當于一種鍵值對的集合,,就是由具有唯一性的關鍵字(Key)和它的項(Item)組成。它等效于Perl語言的關聯數組,。
items保存在該關聯數組中,,可以保存任意類型的數據類型。每個item與唯一的key相關聯,。key用于獲得單獨的item,,key通常是一個整數或字符串,其實也可以是任何類型的數據,,除了數組和Tpye聲明的結構體不能作為key,。
由于字典不是Vba自帶的,如果想要在代碼編寫過程中有智能提示,,需要引用它,。具體是[工具]–>[引用]–>找到以下位置:
C:\Windows\System32\scrrun.dll (顯示為選中:Microsoft Scripting Runtime Library)
1. 方法:
方法 | 說明 |
---|---|
Add | 添加一新的key/item鍵值對到字典對象中 |
Exists | 返回一個布爾值,提示字典對象中是否存在指定的key |
Items | 返回字典對象中的所有item的一位數組 |
Keys | 返回字典對象中的所有key的一位數組 |
Remove | 從字典對象中刪除指定的鍵值對 |
RemoveAll | 從字典對象中刪除所有的鍵值對 |
2. 屬性:
屬性 | 說明 |
---|---|
CompareMode | 設置或返回字典對象中在比較key值時的比較模式,,區(qū)分大?。篵inaryCompare設置的話區(qū)分大小寫,,TextCompare不區(qū)分大小寫 |
Count | 返回字典對象中鍵值對的數量或個數 |
Item | 設置或返回字典對象中某個item的值 |
Key | 在字典對象中對一個已經存在的key設置新值 |
'后期綁定:方便代碼在其他電腦上運行,推薦,。
dim dic as object
Set dic = CreateObject("scripting.dictionary")
'前期綁定:可以直接聲明字典對象,,有對象屬性和方法的提示,但在其他沒有勾選引用的電腦上無法正常運行,。
'引用勾選:VBE窗體-工具-引用-勾選'Microsoft Scripting Runtime’
dim dic as New dictionary
'獲取字典的鍵、值,,字典計數,,刪除,判斷鍵是否存在于字典
with activesheet
'dic.count:字典計數,,字典中一共有多少條記錄,;
'dic.keys:字典的鍵,寫入單元格以行寫入,,如需以列寫入單元格,,調用工作表函數transpose轉置;
.cells(1,1).resize(dic.count,1) = application.worksheetfunction.transpose(dic.keys)
'清除工作表單元格內容
.cells.clearcontents
'dic.items:字典的值,;
.cells(1,1).resize(1,dic.count) = dic.items
'判斷某內容是否存在與字典的鍵中
if dic.exists("內容") then debug.print "字符串'內容’存在于字典的鍵中"
'清空字典,,有時候其他過程也需要使用字典,當前過程已經使用完了,,但我們又不想重新創(chuàng)建字典對象,,這時候我們可以public字典全局變量,再清空字典,,供新的過程使用該字典對象,。
dic.removeall
'清除單個字典鍵-值對,key是字典的某個需要刪除的鍵
dic.remove key
end with
'==========================去重========================
dim dic as object
dim arr
dim st
Set dic = CreateObject("scripting.dictionary")
arr = array("可樂","雪碧","雞翅",,"可樂","漢堡包","雞翅")
for each st in arr
'字典的鍵是不能重復的,重復導入字典只會存在一個,,可以利用字典這點特性去重,。
'這里不需要字典的值,設置為空字符串或其他數值都可以,。
dic(st) = ""
next
activesheet.range("a1").resize(dic.count,1) = application.worksheetfunction.transpose(d.keys)
' ==========================實現sumifs條件求和========================
Sub dic_sumif()
Application.ScreenUpdating = False
Dim dic As Object
Dim arr
Dim i As Byte
Set dic = CreateObject("scripting.dictionary")
With ActiveSheet
arr = .UsedRange
For i = 2 To UBound(arr)
' dic(arr(i,1))沒有值是默認是0,,通過下面方法對每一個水果的銷量進行累加。
dic(arr(i, 1)) = dic(arr(i, 1)) + arr(i, 2)
Next
'使用copy方法,,將表頭復制到e1,,f1單元格
.Range("a1:b1").Copy .Range("e1")
'字典鍵去重縱向寫入到單元格
.Cells(2, "e").Resize(dic.Count, 1) = Application.WorksheetFunction.Transpose(dic.keys)
For i = 2 To dic.Count + 1
'循環(huán)輸入字典鍵對應的值到f列
.Cells(i, "f").Value2 = dic(.Cells(i, "e").Value2)
Next
End With
set dic = Nothing
Application.ScreenUpdating = True
End Sub
' 一、定義字典
Set d = CreateObject("Scripting.Dictionary")
' 二,、呼之即來,,揮之即去
d("張三“)=1 '相當于給字典賦值,張三過來(沒有就生成)拿個1站一邊去
d("李四”)=2 '相當于給字典賦值,,李四過來(沒有就生成)拿個2站一邊去
d("李四”)=3 '相當于改變值,,字典中已經有李四了,李四跑過來,,丟下2換個3站一邊去
注:這時字典中有兩個人的存在,,張三=1 和 李四=3,相當于實現了去重復的功能
s=d("張三") 's=1 即叫了聲張三,,張三就告訴你他拿的是1
s=d("李四") 's=3 即叫了聲李四,,李四就告訴你他拿的是3
s=d("麻子") 's="" 沒有找到麻子怎么辦呢,字典里就自動生成一個麻子d("麻子") =“”,,告訴你他手上是空的
注:這時字典中有三個人的存在,,張三=1 ; 李四=3;麻子=“”
' 上文出處:http://club./thread-926188-1-1.html
以上示例出處:http://club./thread-926188-1-1.html
結論: 如果進行編程,推薦使用字典,,但是也不能不使用集合,,例如sheets(1)或者sheets(“明細”)就是一個集合的使用。
|