久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Excel VBA 中使用集合和字典對比總結

 郗peng 2021-07-12

Excel VBA 中使用集合和字典對比總結

Collection(集合)對象

VBA中有一個集合對象(Collection),,Collection 對象是有序保存數據的,我們把它理解為可以隨意增減容量的動態(tài)一維數組,,其保存的數據類型可以大部分類型,,并且同一個集合內可以保存不同類型的數據。
與數組相比,,集合有以下特點:

collection對象添加,、刪除元素的方法與數組不同及不能直接更新已經添加的元素。

備注: 集合的成員可以是大部分數據類型,,包括對象(object類型),,但是,通過 Tpye 定義的結構體的類型不能存儲,,在字典內也不能,。

Collection 成員

  1. object.count 屬性:long類型,返回collection對象中元素的個數
  2. object.add(item,key,before,after) 方法,,給集合對象中添加新值,,無返回值
部分說明
object集合對象表達式
item必需的。要添加到集合中的元素或項目
key可選的,。在一個集合中這個key必需是唯一的字符串,,不能出現重復,其作用是用于代替位置索引訪問集合中的元素或項目,,該key值不區(qū)分大小寫,,并且如果在key中已經使用某個字符串,,那么,item中也不能出現該字符串,。
before可選的,,介于1 和 集合的成員數量(collection.count)之間。如果該值取值是字符串表達式,,則為key值
after同上,, 注意after和before不能同時指定
  1. object.remove(index)方法,用于從集合中移除元素,,無返回值
  2. object.item(index) 或者 object(index) 方法,,返回index所指的集合元素

示例

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(字典) 對象

字典(Dictionary)對象是微軟Windows腳本語言中的一個很有用的對象(經過我的測試也是有序的),。字典對象相當于一種鍵值對的集合,,就是由具有唯一性的關鍵字(Key)和它的項(Item)組成。它等效于Perl語言的關聯數組,。
items保存在該關聯數組中,,可以保存任意類型的數據類型。每個item與唯一的key相關聯,。key用于獲得單獨的item,,key通常是一個整數或字符串,其實也可以是任何類型的數據,,除了數組和Tpye聲明的結構體不能作為key,。
由于字典不是Vba自帶的,如果想要在代碼編寫過程中有智能提示,,需要引用它,。具體是[工具]–>[引用]–>找到以下位置:

C:\Windows\System32\scrrun.dll  (顯示為選中:Microsoft Scripting Runtime Library)

Dictionary 成員

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

字典與集合對比

  1. 字典比集合速度要快,有人測試要快三倍,,字典應該采用hash值,,所以查找速度快。
  2. 由于字典中有 Exists(key)方法,,可以先進行判斷,,再操作,,甚至直接賦值,而集合沒有直接檢查key是否存在,。
  3. 如果想更新某個鍵值對,,在集合中是不能直接進行的(可以先刪除,然后再add),,而字典中可以直接賦值,,這點要方便多了。
  4. 對于字典中還沒有key值,,可以直接使用,,例如: dic(key) = dic(key) + 1 ,這時dic(key)默認是 0 ,。
  5. 字典中的keys() 和 items() 分別返回一位數組,,方便操作,而集合中沒有該類方法,。
  6. 特意提醒一下,,字典有忘記add()的方法,即“呼之即來,,揮之即去”,。示例如下:
' 一、定義字典
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(“明細”)就是一個集合的使用。

    本站是提供個人知識管理的網絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約