ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 48605|回复: 65

[求助]请教数据字典的基本原理如何?

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2007-1-5 19:35 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:数组集合和字典

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

谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-5 20:09 | 显示全部楼层
“基本原理”就改为“基本思路”吧,请看一下

TA的精华主题

TA的得分主题

发表于 2007-1-5 21:31 | 显示全部楼层

Methods: VBScript Dictionary Object

VBScript Dictionary Object Add Method

Adds a key, item pair.

VBScript Dictionary Object Exists Method

Indicates if a specified key exists.

VBScript Dictionary Object Items Method

Returns an array containing all items in a Dictionary object.

VBScript Dictionary Object Keys Method

Returns an array containing all keys in a Dictionary object.

VBScript Dictionary Object Remove Method

Removes a key, item pair.

VBScript Dictionary Object RemoveAll Method

Removes all key, item pairs.

Properties: VBScript Dictionary Object

VBScript Dictionary Object CompareMode Property

The comparison mode for string keys.

VBScript Dictionary Object Count Property

The number of items in a Dictionary object.

VBScript Dictionary Object Item Property

An item for a key.

VBScript Dictionary Object Key Property

A key

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2007-1-5 21:39 | 显示全部楼层
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) = newkey

Key 屬性具有下列單元:

單元描述
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) 的比較。

TA的精华主题

TA的得分主题

发表于 2007-1-5 21:42 | 显示全部楼层

dictionary方法:

1

Add 方法 (目錄)

         

描述

加入一對相對應的關鍵字和項目到 Dictionary 物件。

語法

object.Add key, item

Add方法的語法有如下幾個單元:

單元描述
Object必要引數。一個 Dictionary 物件的名字。
Key必要引數。與所加入的項目相關的關鍵字。
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.RemoveAll

object始終是一個 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
				

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-5 21:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太谢谢狼版主啦,真是无价之宝呀,我要好好学习一下,致敬!

TA的精华主题

TA的得分主题

发表于 2007-1-5 22:14 | 显示全部楼层

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

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-5 22:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-1-5 23:36 | 显示全部楼层
狼老师的经典杰作再顶一下,我认为加精1分不多,应该加5分

TA的精华主题

TA的得分主题

发表于 2007-1-6 00:10 | 显示全部楼层

'应用实例8 (字符频率统计):

'本例统计圆周率前500位中各数字出现的频率并显示在WORKSHEET的前两行
Sub Usage8()
Const pi As String = "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912"
Dim i As Long, temp As String, dic As Object
Set dic = CreateObject("scripting.dictionary")
For i = 3 To Len(pi)
temp = Mid(pi, 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("Number", "出现次数"))
[b1].Resize(1, dic.Count) = dic.keys
[b2].Resize(1, dic.Count) = dic.items
Set dic = Nothing
End Sub

'本例统计某字符串中各字符出现的频率并显示在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

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-22 12:04 , Processed in 0.040891 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表