您的位置:首页 > 其它

浅谈DICTIONARY(字典)对象

2013-11-15 16:37 239 查看
浅谈DICTIONARY(字典)对象

由ExcelHome论坛 northwolves(“狼行天下”)版主 于 2007-1-5
发表

(“狼行天下”)的“博客”地址——http://blog.csdn.net/northwolves

1.  Dictionary
物件(字典)

描述:
物件(字典),用于储存資料关键字和項目对。

语法: 
Scripting.Dictionary

请注意

Dictionary 物件(字典)与 PERL
相关阵列全等。可以是任何型式的資料的项目被储存在阵列中。每个项目都与一个唯一的关键字相关。該关鍵字用来取出单个项目,通常是整数或字串,可以是除阵列外的任何型态。

下面的程序码举例說明了如何建立一个 Dictionary
物件(字典):

Dim
d     
'建立一个变数

Set d =
CreateObject(Scripting.Dictionary)

d.Add "a",
"Athens"    
'加入一些关键字和项目

d.Add "b", "Belgrade"d.Add "c",
"Cairo"

2.  Key
属性        

描述:  在一个
Dictionary 物件中设定一个 key。

语法: 
object.Key(key) = newkeyKey

属性具有下列单元:

单元
                描  


object
        必要引数。始終是一个
Dictionary 物件(字典)的名字。

key
          必要引数。被更改的
Key。

newkey
      必要引数。取代指定
key 的新。

请注意 如果在更改某个 key 时,沒有找到
key,则会出现执行阶段错误。

3.  Item
属性      
  

描述:  对
Dictionary 物件中指定的Key,设定或传回一个Item
。对于集合來說,基于指定的Key,传回一个Item。读取/写入属性。

语法: 
object.Item(key) [= newitem]

Item 属性具有下列单元:

单  元
描     

object
必要引数。始終是一个集合或 Dictionary
物件(字典)的名称。

key
必要引数。与被取出或加入的项目相关的 Key


newitem
选择性引数。仅用于 Dictionary
物件;沒有用于集合的应用程序。如果提供的話,newitem 是与指定的 Key 相关的新值。

请注意 如果在改变某个 item 时,沒有找到
key,则用指定的newitem建立一个新的 key。如果在试图传回某个已存在项目时,沒有找到 key,则建立一个新
key,且其相对的项目为无。

4.  Count
属性 

描述:传回集合或 Dictionary
物件(字典)中的项目数。只读。

语法:object
.Count    object
始终是「适用于」清单中某一项目的名称。

请注意 
下面的程式码举例说明了 Count 属性的使用方法:

Dim a, d,
i    
'建立一些变数

Set d =
CreateObject("Scripting.Dictionary")

d.Add "a",
"Athens"    
'加入一些关键字和项目。

d.Add "b",
"Belgrade"

d.Add "c", "Cairo"

a =
d.Keys   '获得关键字

For i = 0 To d.Count -1
 '遍及阵列

   
Print a(i)   '列印关键字

Next

...

5. 
CompareMode
属性        

描述:  设定或传回
Dictionary 物件(字典)中的比较字串关键字的比较模式。

语法: 
object.CompareMode[ = compare]

CompareMode
属性具有下列单元:

单  元
描   

object
必要引数。始终是一个 Dictionary
物件(字典)的名称。

compare
选择性引数。如果提供的话,compare
是一个代表比较模式的,该比较模式用于象 StrComp 这样的函数。

设定 compare
引数可以具有下列值:

常   

 
描   

VbUseCompareOption
-1
使用 Option
Compare 陈述式的设定进行比较。
vbBinaryCompare
 0
进行二进位比较。
vbTextCompare
 1
进行文字比较。
vbDatabaseCompare
 2
仅用于 Microsoft
Access。进行基于您自己资料库中资讯的比较。
请注意 
如果试图对已经包含资料的 Dictionary 物件(字典)的比较模式进行更改的话,就会出错。

CompareMode 属性所用的引数与 StrComp
函数所用的 compare 引数相同。可以用大于 2 的表示使用指定的 Locale IDs (LCID)
的比较。

dictionary方法:

1、Add 方法 (目录)

描述:加入一对相对应的关键字和項目到 Dictionary
物件(字典)。

语法:object.Add key,
item

Add方法的语法有如下几个单元:

單元
描述
Object
必要引数。一个
Dictionary 物件(字典)的名字。
Key
必要引数。
f33f
与所加入的项目相关的关键字。
Item
必要引数。与所加入的关键字相关的项目。
请注意 
如果关键字已经存在,則产生一个错误。

2、Exists 方法

描述:  如果在
Dictionary 物件(字典)中指定字存在,传回 True,若不存在,传回 False。

语法: 
object.Exists(key)     
Exists 方法语法有如下几个单元:

單元
描述
Object
必要引数。始终是一个
Dictionary 物件(字典)的名字。
Key
必要引数。在
Dictionary 物件(字典)中搜寻的 Key 值。
3、Keys 方法

描述:传回一个阵列,該阵列包含一个 Dictionary
物件(字典)中的全部既存的的关键字。

语法:object.Keys

object始终是一个 Dictionary
物件(字典)的名字。

请注意 
下面的程式码举例說明了 Keys 方法的使用。

Dim a, d,
i  
 '建立一些变数

Set d =
CreateObject("Scripting.Dictionary")

d.Add "a",
"Athens"    
'加入一些关键字和项目。

d.Add "b",
"Belgrade"

d.Add "c", "Cairo"

a = d.keys 
 '取得关键字

For i = 0 To d.Count -1
 '重复阵列

   
Print a(i)   '列印关键字

Next

...

4、Items 方法

描述:传回一个包含 Dictionary
物件(字典)中所有项目的阵列。

语法:object.Items

object始终是一个 Dictionary
物件(字典)的名字。

请注意  
下面的程式码举例说明了 Items 方法的使用。:

Dim a, d,
i   
'建立一些变数

Set d =
CreateObject("Scripting.Dictionary")

d.Add "a",
"Athens"   
 '加入一些关键字和项目。

d.Add "b",
"Belgrade"

d.Add "c", "Cairo"

a =
d.Items   '取得项目

For i = 0 To d.Count -1
 '重复阵列

   
Print a(i)   '列印项目

Next

5、Remove 方法

描述:从一个 Dictionary
物件(字典)中移除一个关键字和项目对。

语法:object.Remove(key)

Remove 方法语法有如下几个单元:

單元
描述
Object
必要引数。始终是一个
Dictionary 物件(字典)的名字。
Key
必要引数。Key 与要从
Dictionary 物件(字典)中移除的关键字和项目对相关。
请注意 
如果指定的关键字和项目对不存在,则发生一个错误。

下面的程式码举例說明了 Remove
方法的使用

Dim a, d,
i   '建立一些变数

Set d =
CreateObject("Scripting.Dictionary")

d.Add "a",
"Athens"    
'加入一些关键字和项目

d.Add "b",
"Belgrade"

d.Add "c", "Cairo"

...

a = d.Remove()

6、RemoveAll 方法

描述:RemoveAll 方法从 Dictionary
物件(字典)中移除所有关键字和项目对。

语法:object.RemoveAllobject始终是一个
Dictionary 物件(字典)的名字。

请注意 
下面的程式码举例说明了 RemoveAll 方法的用法:

Dim a, d,
i   '建立一些变数

Set d =
CreateObject("Scripting.Dictionary")

d.Add "a",
"Athens"    
'加入一些关键字和项目

d.Add "b",
"Belgrade"

d.Add "c", "Cairo"

...

a = d.RemoveAll

 

Dictinary.keys返回一维数组,因而应用比较广泛

应用实例1(顺序显示1-100):

Sub usage()

Dim dic As Object, i As
Long

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 100

dic.Add i, ""

Next

MsgBox Join(dic.keys,
",")

 

Set dic=Nothing

End Sub

 

应用实例2(显示1-100中含3的整数):

Sub usage2()

Dim dic As Object, i As
Long

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 100

dic.Add i, ""

Next

MsgBox Join(Filter(dic.keys,
"3"), vbCrLf)

Set dic=Nothing

End Sub

 

应用实例3(WORKSHEET中A列显示1-10000):

Sub usage3()

Dim dic As Object, i As Long,
arr

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 10000

dic.Add i, ""

Next

arr =
WorksheetFunction.Transpose(dic.keys)

[a1].Resize(UBound(arr), 1) =
arr

Set dic = Nothing

End Sub

应用实例4 (WORKSHEET中A列显示1 -
10000,B列逆序显示):

Sub usage4()

Dim dic As Object, i As Long,
arr

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 10000

dic.Add i, 10001 - i

Next

arr =
WorksheetFunction.Transpose(dic.keys)

[a1].Resize(UBound(arr), 1) =
arr

 

arr =
WorksheetFunction.Transpose(dic.items)

[b1].Resize(UBound(arr), 1) =
arr

 

Set dic = Nothing

End Sub

 

应用实例5 (WORKSHEET中A列显示1 -
100000中被6除余1和5 的数字):

Sub usage5()

Dim dic As Object, i As Long,
arr

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 100000

dic.Add i &
IIf(Abs(i Mod 6 - 3) = 2, "@", ""), ""

Next

arr =
WorksheetFunction.Transpose(Filter(dic.keys, "@"))

[a1].Resize(UBound(arr), 1) =
arr

[a:a].Replace "@",
""

Set dic = Nothing

End Sub

 

应用实例6 (跨表不重复值提取):

 

Sub Usage6()

Application.ScreenUpdating =
False  ’停止屏幕刷新(也能提高程序运行速度)

Dim r As Range, arr

Worksheets("All").Select

With
CreateObject("scripting.dictionary")

For Each r In Range("D3:D"
& Range("A65536").End(xlUp).Row)

If Not .exists(r.Value) Then
.Add r.Value, Nothing

Next

Worksheets("temp").Select

Cells.Clear

Range("a2").Resize(.Count, 1) =
WorksheetFunction.Transpose(.keys)

End With

Application.ScreenUpdating =
True  ’重启屏幕刷新

End Sub

 

 

应用实例7 (COMBOBOX赋值):

Private Sub
UserForm_Initialize()

Dim dic As Object, i As Long,
arr

Set dic =
CreateObject("Scripting.Dictionary")

For i = 1 To 1000

dic.Add i, ""

Next

UserForm1.ComboBox1.List =
dic.keys

Set dic = Nothing

End Sub

 

应用实例8 
本例统计某字符串中各字符出现的频率并显示在WORKSHEET的前两行

Sub Usage8_2()

Const s As String =
"在VBA中有一个数据字典即dictionary功能很好,运行速度比较快,掌握以后可以替代一些其他查找功能,现向老师请教数据字典即dictionary的基本原理是怎样的,它适合于哪些情况之下可以运用,在运用过程中应当注意哪些问题。"

Dim i As Long, temp As String,
dic As Object

Set dic =
CreateObject("scripting.dictionary")

For i = 1 To Len(s)

temp = Mid(s, i, 1)

If Not dic.exists(temp)
Then

dic.Add temp, 1

Else

dic(temp) = dic(temp) +
1

End If

Next

[a1:a2] =
WorksheetFunction.Transpose(Array("字符", "出现次数"))

[b1].Resize(1, dic.Count) =
dic.keys

[b2].Resize(1, dic.Count) =
dic.items

Set dic = Nothing

End Sub

应用实例9
 列出一个工作簿中所有已使用的自定义函数(需要添加对VB项目的信任)

Sub
UDFSOFACTIVEWORKBOOK()

Dim sh As Worksheet, r As
Range, dic As Object, i As Long, temp As String, VBcomp, s() As
String, UDF As String

For i = 1 To
ActiveWorkbook.VBProject.VBComponents.Count

Set VBcomp =
ActiveWorkbook.VBProject.VBComponents(i)

If VBcomp.Type = 1 Then temp =
temp & VBCrLf &
VBcomp.CodeModule.Lines(1, 65536)

Next

s = Split(temp,
VBCrLf)

temp = ""

For i = 0 To
UBound(s)

If s(i) Like "Function * As *"
Then temp = temp & "@" & "="
& Trim(Split(Split(s(i), "(")(0), "Function")(1))
& "(" '--->All functions with or
without parameters

Next

Set dic =
CreateObject("scripting.dictionary")

For Each sh In
Sheets

For Each r In
sh.UsedRange

If r.HasFormula Then

If InStr(temp, "@"
& Split(r.Formula, "(")(0)) > 0
Then

UDF = r.Formula
& "udf"

Else

UDF = ""

End If

If Not dic.exists(r.Formula)
Then dic.Add r.Formula, UDF

End If

Next

Next

Debug.Print "All functions used
in activesheet" & VBCrLf &
String(50, "-") & VBCrLf &
Join(dic.keys, VBCrLf) & VBCrLf &
VBCrLf  '列出一个工作簿中所有函数

Debug.Print "All user define
functions used in activesheet" & VBCrLf
& String(50, "-") & VBCrLf
& Replace(Join(Filter(dic.items, "udf"), VBCrLf),
"udf", "")  '列出一个工作簿中所有已使用的自定义函数

Set dic = Nothing

End Sub

应用实例10
列出Word 文档中所用的全部字体集合(在WORD VBA中使用)
Sub
Usage10()
Dim myRange As
Range, str_Result As String, str_Temp
With
CreateObject("scripting.dictionary")
On Error Resume
Next
For Each str_Temp
In Application.FontNames
   Set
myRange = ActiveDocument.Content
 
 With myRange.Find
     
.ClearFormatting
     
.Font.NameFarEast = str_Temp
     
If .Font.NameFarEast <> ""
Then
        
If .Execute(findtext:="*", MatchWildcards:=True, Wrap:=wdFindStop,
Format:=True) Then
        
.AddComment str_Temp, ""
     
   End
If
      
End If
   
End With
 Next
MsgBox Join(.keys,
vbCrLf)
End
With
End Sub
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: