




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
字典用法的补充index函数很多前辈都谈过字典的用法,而我这里要说的是关于在字典中取key和item的值的方法。这个是我在回答/viewth . &extra=page%3D1这个帖子时想到的。 引用:12345123取上面数据其中出现只有一次的数据放到sheet2中。我首先想到的就是用字典,于是就有了下面的部分代码: 代码:Sub cc() Dim i&, arr, d As Object arr = Range(a1, a65536.End(3) Set d = CreateObject(Scripting.Dictionary) For i = 1 To UBound(arr) d(arr(i, 1) = d(arr(i, 1) + 1 Next至此,字典完成,在keys中,分别是1、2、3、4、5,在items中分别是2、2、2、1、1。现在要把item为1的key提取出来,以往我的想法是: 代码: s = d.keys ss = d.items For i = 0 To UBound(ss) If ss(i) = 1 Then brr(j) = s(i) End If Next即:分别把keys和items赋给s和ss,然后对比,将item中等于1的key传递到另一个数组中。这时,我突然记起,取数组arr的第n行赋值到某行区域的代码:a6:c6=Application.Index(arr,n)于是想到,用index函数可以取字典中的值吗?接着,我开始修改代码,便有了下面: 代码:For i = 1 To d.CountIf Application.WorksheetFunction.Index(d.items, i) 1 Thend.Remove Application.WorksheetFunction.Index(d.keys, i)End IfNext我用Sheet2.a1.Resize(d.Count) = WorksheetFunction.Transpose(d.keys)一试,结果却多了一个2,成了2、4、5。此时才醒悟,在删除时,一般都是逆向的,以免下面的数据取代了已删除数据的位置,于是就有了最终的代码。 代码:Sub cc() Dim i&, arr, s, d As Object On Error Resume Next arr = Range(a1, a65536.End(3) Set d = CreateObject(Scripting.Dictionary) For i = 1 To UBound(arr) d(arr(i, 1) = d(arr(i, 1) + 1 Next For i = d.Count To 1 Step -1 If Application.WorksheetFunction.Index(d.items, i) 1 Then d.Remove Application.WorksheetFunction.Index(d.keys, i) End If Next Sheet2.a1.Resize(d.Count) = WorksheetFunction.Transpose(d.keys)End Sub这样,省去了很多代码,少走了弯路,也提高了速度。总结:Application.WorksheetFunction.Index(d.items, i)这个方法有很多的应用之处,以前很少看到别人用,现在发现了它的好处,便拿来与大家分享。以上个人见解,有不当之处,请各位达人指教。ivan9025 于 2010-1-2 02:11如果单考虑执行效率,用不着套用函数index呀(楼主是不是走远了.),例如:Sub cc() Dim i&, arr, s, d As Object On Error Resume Next arr = Range(a1, a65536.End(3) Set d = CreateObject(Scripting.Dictionary) For i = 1 To UBound(arr) d(arr(i, 1) = d(arr(i, 1) + 1 Next For i = d.Count To 1 Step -1 If d(d.keys(i) 1 Then d.Remove d.keys(i) 按你的愿意(这样,省去了很多代码,少走了弯路,也提高了速度。),甚至可以是If d.Items(i) 1 Then d.Remove d.keys(i),因为d(d.keys(i)d.Items(i) Next Sheet2.a1.Resize(d.Count) =application.Transpose(d.keys)End Subd可以看成一个二维数组,d.keys和d.items分别是存在对应关系的一维数组.换而言之:既有d.count的属性,就会有d.keys(i)和d.Items(i)的方法,提供序号就可访问他们原始数据字典加工后12345123字典序号01234Keys1 d.Keys(0)2 d.Keys(1)3 d.Keys(2)4 d.Keys(3)5 d.Keys(4)Items2 d.Items(0) d(d.keys(0)2 d.Items(1) d(d.keys(1)2 d.Items(2) d(d.keys(2)1 d.Items(3) d(d.keys(3)1 d.Items(4) d(d.keys(4)Transpose后:原始数据字典加工后字典序号KeysItems重复1次及以上重复0次101 d.Keys(0)2 d.Items(0) d(d.keys(0)14212 d.Keys(1)2 d.Items(1) d(d.keys(1)25323 d.Keys(2)2 d.Items(2) d(d.keys(2)3434 d.Keys(3)1 d.Items(3) d(d.keys(3)545 d.Keys(4)1 d.Items(4) d(d.keys(4)123我相信ivan9025一定没有测试你的代码。像你这样的写法,我以前都曾经试过的,这样是通不过的。你的确可以把它看成一个数组,毕竟它的一些特点和数组很类似,但是却不可以用诸如d.keys(i)、d.items(i)的方法取得字典中的数据,否则之前我也不会用s=d.keys这样的办法。Lipdon:新年快乐字典可以按位置取值的Sub test()Dim d As New DictionaryDim i As Integerd.Add a, a1d.Add b, b1d.Add c, c1按位置循环取值For i = 0 To d.Count - 1 Debug.Print d.Keys(i) Debug.Print d.Items(i)Next iEnd SubSub test1()Dim d As New DictionaryDim i As Integerd.Add a, a1d.Add b, b1d.Add c, c1按位置移除值For i = d.Count - 1 To 0 Step -1 If d.Items(i) = b1 Then d.Remove d.Keys(i) End If Next iEnd Subccwan :lipdon老师的帖子让我受益匪浅。多谢指教。也祝您新年快乐我想请教,就以1楼的例子,代码应该怎样写呢?下面的代码通不过。Sub cc() Dim i&, arr, s, d As Object On Error Resume Next arr = Range(a1, a65536.End(3) Set d = CreateObject(Scripting.Dictionary) For i = 1 To UBound(arr) d(arr(i, 1) = d(arr(i, 1) + 1 Next Stop For i = d.Count - 1 To 0 Step -1 If d.Items(i) 1 Then d.Remove d.Keys(i) End If Next Sheet2.a1.Resize(d.Count) = WorksheetFunction.Transpose(d.Keys)End SubLipdon:请测试,引用字典后可以用,原因不明,请各位老师出手指点迷津Sub cc() Dim i&, arr, s Dim d As New Dictionary On Error Resume Next arr = Sheet1.Range(a1, a65536.End(3) For i = 1 To UBound(arr) d(arr(i, 1) = d(arr(i, 1) + 1 Next Stop For i = d.Count - 1 To 0 Step -1 If d.Items(i) 1 Then d.Remove d.Keys(i) End If Next Sheet2.a1.Resize(d.Count) = WorksheetFunction.Transpose(d.Keys)End SubSub bbb() Dim dic1 As New Dictionary For i = 1 To 10 dic1(i) = 11 - i Next MsgBox dic1.Keys(0) & vbCrLf & dic1.Items(0) & _ vbCrLf & dic1.Item(1)End Sub贴出我测试的代码,以示歉意(为了代码的书写方便,更为了提高执行效率,本人很少用后期绑定,以致忽略了后期绑定的错误提示).但就字典本身而言,它的确是数组,否则不会有d.count的属性ivan9025:Sub test() Dim dic As New Dictionary Dim LastRow%, i%, k% With Sheet2 LastRow = .Range(a65536).End(xlUp).Row For i = 2 To LastRow dic(.Cells(i, 1) & ) = dic(.Cells(i, 1) & ) + 1 Next For i = 0 To dic.Count - 1 If dic(dic.Keys(i) 1 Then .Cells(i + 2, 2) = dic.Keys(i) Else .Cells(k + 2, 3) = dic.Keys(i) k = k + 1 End If Next .Range(c2).Resize(dic.Count) = Application.Transpose(dic.Keys) End WithEnd SubCcwan:多谢ivan9025兄让我开了眼界,以前真是不知这样的用法。不过ivan9025兄,如果不是在工作表循环,而是使用数组,速度会快10倍以上哦。多谢ivan9025老师指教。如我在22楼所说,应该是定义Dictionary和Object的区别。Option ExplicitSub cc() Dim i%, aa As Double, arr, dic As New Dictionary aa = Timer arr = Sheet1.Range(Sheet1.a3, Sheet1.d65536.End(3) For i = 1 To UBound(arr) Set dic(arr(i, 2) = arr(i, 3) & # & arr(i, 4) Next With Sheet4 Application.ScreenUpdating = False .b3:d1000.ClearContents .b3.Resize(dic.Count) = WorksheetFunction.Transpose(dic.Keys) .c3.Resize(dic.Count, 2) = WorksheetFunction.Transpose(dic.Items) .c:c.Replace #*, : .d:d.Replace *#, End With MsgBox Timer - aa Application.ScreenUpdating = TrueEnd Sub回复 29楼 ccwan 的帖子呵呵,不知楼主十倍的效率从何说起?是否认真测试过两段代码?不可妄而言之.如果你细细比较哈.,因为你的填充没有带格式,这是你觉得数组效率高的原因,麻烦你带下格式填充(框线)再论效率.数组和字典都是基本原理,效率得看需要的效果./viewth . p;extra=&page=1你先看看这贴,一目了然Sub cc() Dim i As Long Dim D As Object Dim s, arr ar
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业员工劳动合同解除与终止证明文件编写规范
- 上海高中学籍管理办法
- 职业学院后勤服务设施改造与物业托管协议
- 零陵区砂石管理办法
- 资助+资金管理办法
- 行政卫生收纳管理办法
- 项目经费卡管理办法
- 西安储备肉管理办法
- 街道清洁工管理办法
- 设计院现金管理办法
- 2025年高考全国二卷数学真题(原卷版)
- 培训行业的业务合同范本
- 汽车销售日常知识培训课件
- 2025广东广州市天河区人民武装部招聘民兵教练员5人备考题库及答案解析
- 科学版(2024)一年级全一册体育与健康全册教案
- 学前教育机构师资队伍薪酬激励与职业发展研究报告
- (正式版)DB15∕T 2351-2021 《燕麦米加工技术规程》
- 小学朗读教学课件
- 2024德州市庆云县渤海路街道社区工作者招聘考试试题
- 皮肤干细胞研究与应用
- 玄麦甘桔颗粒讲解
评论
0/150
提交评论