【原创】VBA学习笔记(13)VBA的字典 dictionary

1字典 dictionary (key-item形式)

 

1.1字典的前期绑定

前期绑定的方法1

  • Dim dict3 As dictionary
  • Set dict3 = New dictionary
     

前期绑定方法2

  • Dim dict2 As New dictionary

 

1.2 字典的后期绑定

  • Set dict1 = CreateObject("scripting.dictionary")

 

1.3 两种方法的比较

1.3.1 前期绑定好处

  • 前期绑定好用(提示多,引用方式也灵活)
  • 坏处是,如果VBA代码发给其他人运行,其他人也需要配置一遍环境
  • 前期绑定,可以随便用 
  • dict1.keys(i)  
  • dict1.items(i)  

 

1.3.2 后期绑定好处

  • 后期绑定实用(不会因为使用者未引用相应项目而出错,相对来讲更适于代码传播)
  • 没有  dict的方法/属性 提示,因为没有加载对应的库文件
  • 后期绑定最大的不方便,还在于不能随便用
  • dict1.keys(i)   或  dict1.items(i)  
  • 但是用数组倒手一下就可以了
  •  arr2=dict1.keys(i)   或 arr2= dict1.items(i)  

 

  • 但是可以直接用这个整体
  • dict1.keys()    或  dict1.items()  

 

1.4 字典的特点:

  • key是唯一的,不会重复 (但是item可以重复)
  • 数组为了去重复,经常会利用dict的这个特点。

 

 

2 字典的基础方法和属性

这个图是参考的别人的

 

2 字典的方法和属性

2.1 测试代码

  • 有奇效的  dict1(333)
  • 如果没有这个key 会自动加一对key item : key "" 
Sub test_dict()

Dim dict1 As Object
Set dict1 = CreateObject("scripting.dictionary")
'后期绑定


Dim dict2 As New dictionary
'前期绑定


Dim dict3 As dictionary
Set dict3 = New dictionary
'前期绑定



'添加key-item 需要成对添加
dict1.Add 1, "10"
dict1.Add 2, "11"
dict1.Add 3, "12"
'dict1.Add 3, "12"  '重复add会报错
'dict1.Add (10, "100")   '错误写法



'改变item / 给item改变赋值
Debug.Print "dict1(1)=" & dict1(1)
dict1(1) = "abc"
dict1.Item(3) = "def"
Debug.Print "dict1(1)=" & dict1(1)
Debug.Print "dict1(3)=" & dict1(3)
Debug.Print


'改变key
'key可以改变
'key但并不好直接显示出来
Debug.Print "dict1.Key(2)=" & dict1.Item(2)
dict1.Key(2) = 222
Debug.Print "dict1.Key(222)=" & dict1(222)


'只能判断key是否存在?不能判断item? 因为key唯一?
Debug.Print dict1.exists(222)
Debug.Print dict1.exists("222")
dict1.Add "222", "这个key222不是那个222"
Debug.Print dict1.Item("222")
Debug.Print

'dict.exists(key) 没有也不会添加新值
'dict(key)  如果没有会添加新key-""
Debug.Print "dict1.Count=" & dict1.Count
Debug.Print dict1.exists(333)
Debug.Print "exists后,dict1.Count=" & dict1.Count
Debug.Print dict1(333)
Debug.Print "dict1(key)之后,如果没有,dict1.Count=" & dict1.Count
Debug.Print


'dict的count,是数的一对key-item的数量
'dict的remove removeall
Debug.Print "dict1.Count=" & dict1.Count
Debug.Print dict1.Remove(222)
Debug.Print "remove后 dict1.Count=" & dict1.Count
Debug.Print



'dict的2个默认数组
Debug.Print "dict1.keys()=";
For Each I In dict1.keys()
    Debug.Print I & "|";
Next
Debug.Print

Debug.Print "dict1.items()=";
For Each J In dict1.items()
    Debug.Print J & "|";
Next
Debug.Print



Debug.Print dict1.Item(1)
Debug.Print "dict1()前 dict1.Count=" & dict1.Count
Debug.Print dict1("1")
Debug.Print dict1.Item("1")
Debug.Print "dict1()后 dict1.Count=" & dict1.Count
Debug.Print


End Sub

 

2.2 字典的方法

和python的不同

  • python的字典,使用的是 key value ,而items表示一对数据(key value)
  • VBA里只有 key  item

 

  • 添加 key,item
  • dict_A.add   key, item  ' item如果不是变量,是字符串应该 '' 括起来
  • dict_A.add   (key, item)   '错误写法

 

  • dict_A.exists  (key)   
  • dict_A.exist (key)    语法警告,exist() 是错误的,带s  

 

  • dict_A.remove (key) 
  • 实测发现,remove之后,这个key仍在,只是item值为空了,仍然是 exist的!
  • dict_A.removeall  用法和效果同remove,也是key对应的item虽然空,但仍然exist
Sub t5()

Rem  Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")


dict_A.Add 1, "python"
dict_A.Add 2, "VBA"



dict_A.EXISTS (1)
dict_A.Remove (2)

Debug.Print (dict_A(1))
Debug.Print (dict_A(2))

Debug.Print (dict_A.EXISTS(1))
Debug.Print (dict_A.EXISTS(2))
Debug.Print (dict_A.EXISTS(3))

End Sub

 

Sub t5()



Rem  Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")


dict_A.Add 1, "python"
dict_A.Add 2, "VBA"


Rem Debug.Print dict_keys(0) 直接写就报错。??

keys_A = dict_A.keys
Debug.Print keys_A(0)

items_A = dict_A.items
Debug.Print items_A(1)



End Sub


 

3 字典的属性

  • dict_A.count
  • dict_A.key(key)  =xx        '改变key
  • dict_A.item(key) =xx       '改变item,赋值
  • dict_A(key)=xxx
Sub t5()



Rem  Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")


dict_A.Add 1, "python"
dict_A.Add 2, "VBA"

Debug.Print (dict_A.Count)

dict_A.Key(1) = 999
Debug.Print dict_A(999)

dict_A.Item(2) = "bat"
Debug.Print dict_A(2)



End Sub

 

4 dictionary 的 comparemode

  • 指定dictionary 后面操作方法和属性时,基于的模式
  • 比如如果选择 vbtextCompare 那么就按文本比较,不区分大小写

comparemode的几种值

  • VbUseCompareOption(-1): 使用Option Compare语句的设置值进行比较;
  • vbBinaryCompare(0): 进行二进制比较;
  • vbTextCompare(1): 进行文字比较;
  • vbDatabaseCompare  2 仅用于 Microsoft Access。进行基于您自己数据库中信息的比较。
Sub t5()



Rem  Dim dict_A As New dictionary
Dim dict_A As Object
Set dict_A = CreateObject("scripting.dictionary")
dict_A.comparemode = 1


dict_A.Add "a", "python"
dict_A.Add "b", "VBA"

dict_A.Add "B", "bat"  '报错,告诉你,该关键字已经关联到一个元素上了
                       '因为 b 和 B 被认为是同一个关键字了




End Sub

 

 

参考

http://www.cnblogs.com/wuzhiblog/p/vba_two.html

https://www.jianshu.com/p/d36a0b907883

 

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
非常好的问题!让我来回答你的问题。 首先,关于VBA学习笔记(一):自动添加代码,你可以使用VBA的宏来自动添加代码。具体步骤如下: 1. 打开你要添加代码的Excel文件,并按下Alt + F11进入VBA编辑器界面。 2. 在左侧的“项目资源管理器”窗格中,展开你的Workbook,并双击“这台电脑”(或“Microsoft Excel 对象”),打开相应的代码窗口。 3. 在代码窗口的顶部,选择“工具” > “宏” > “录制新宏”。 4. 在弹出的“新建宏”对话框中,为新宏命名,并选择一个快捷键,以便日后调用。 5. 点击“确定”后,VBA会自动开始录制你的操作。 6. 在代码窗口中,添加你需要自动执行的代码。 7. 完成代码添加后,点击“停止录制”按钮,保存你的新宏。 接下来,关于VBA修改注册表,你可以使用VBA的“WshShell”对象来实现。具体步骤如下: 1. 在VBA编辑器中,打开你要修改注册表的代码窗口。 2. 在代码窗口的顶部,添加以下代码: ``` Dim WshShell As Object Set WshShell = CreateObject("WScript.Shell") ``` 这将创建一个名为“WshShell”的对象,用于执行后续的注册表修改操作。 3. 接下来,你可以使用该对象的“RegWrite”方法来修改注册表。例如,以下代码将修改Windows启动时自动运行的程序列表: ``` WshShell.RegWrite "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\MyApp", "C:\MyApp.exe", "REG_SZ" ``` 该代码将在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”键下添加一个名为“MyApp”的值,其值为“C:\MyApp.exe”,类型为“REG_SZ”。 4. 完成代码添加后,保存并执行你的代码。 希望这些步骤对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值