Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 14506|回复: 24

[已解决]加急!求助字典exists方法的使用,谢谢大虾

[复制链接]
发表于 2014-2-20 14:07 | 显示全部楼层 |阅读模式
本人菜鸟一枚,写了一段很菜的代码

现在遇到问题:我创建了两个字典,然后分别取了两个表中符合条件的值,然后比较两个字典的重复值,在第一个字典中删除重复值。但始终无法成功。

先贴代码,具体内容见附件:
  1. ' 建立两个字典获取不同的数据,删除dicA中和dicB重复的值
  2. Sub 测试()
  3.       
  4.         Sheets(3).Cells.Clear
  5.         Workbooks("求助字典exists方法的使用.xlsm").Worksheets("经纪人提成明细").Activate
  6.       
  7.         If ActiveSheet.Name Like "*经纪人提成明细*" Then
  8.                 Set dicA = CreateObject("Scripting.Dictionary")
  9.                 Set dicB = CreateObject("Scripting.Dictionary")
  10.                 '获取【经纪人明细表】公共列表
  11.                 For i = 3 To [L65536].End(3).Row
  12.                     zh = Cells(i, "K").Value
  13.                     If Not dicA.exists(zh) And zh Like "*公共*" And zh <> "" Then
  14.                         dicA.Add zh, ""
  15.                     End If
  16.                 Next
  17.                 '获取【营业部提成表】公共列表
  18.                 For j = 8 To 2564
  19.                     Set cel2 = Worksheets("营业部提成表").Cells(j, "H")
  20.                     If Not dicB.exists(cel2) And cel2 Like "*公共*" And cel2 <> "" Then
  21.                         dicB.Add cel2, ""
  22.                     End If
  23.                 Next
  24.                
  25.                 arr1 = dicA.keys
  26.                
  27.                 For b = 0 To dicA.Count - 1
  28.                    If dicB.exists(arr1(b)) Then
  29.                        dicA.Remove (arr1(b))
  30.                        Debug.Print "删除: " & arr1(b)
  31.                    End If
  32.                 Next
  33.                
  34.                 '将删除值后的dicA的值赋给sheet3的a1单元格
  35.                 arr1 = Application.Transpose(dicA.keys)
  36.                 Sheets(3).[A1].Resize(UBound(arr1), 1) = arr1
  37.                 '释放字典
  38.                 Set dicA = Nothing
  39.                 Set dicB = Nothing
  40.                
  41.                 Sheets(3).Select
  42.         Else
  43.       
  44.             MsgBox "请在经纪人提成明细操作"
  45.         End If
  46. End Sub
复制代码
拜托版主帮我解决问题啊  谢谢了




最佳答案
2014-2-21 08:59
  1. Sub 提取不重复值()
  2.     Dim Dic As Object, i%, Arr, Brr, Crr
  3.     Set Dic = CreateObject("scripting.dictionary")
  4.     With Sheets("经纪人提成明细")       '把数据读入数组,加快操作速度
  5.         Arr = .Range("l3", .Cells(Rows.Count, "l").End(3)).Value
  6.     End With
  7.     For i = 1 To UBound(Arr)
  8.         If Arr(i, 1) Like "*公共*" Then  '实际数据源中没有空单元格,不用判断是否为空
  9.             Dic(Arr(i, 1)) = ""          '自动覆盖重复记录
  10.         End If
  11.     Next
  12.     With Sheets("营业部提成表")
  13.         Brr = .Range("h8", .Cells(Rows.Count, "h").End(3)).Value
  14.     End With
  15.     For i = 1 To UBound(Brr)
  16.         If Dic.exists(Brr(i, 1)) Then
  17.             Dic.Remove (Brr(i, 1))
  18.         End If
  19.     Next
  20.     Crr = Dic.keys
  21.     Sheets("sheet3").Range("a1").Resize(UBound(Crr) + 1) = WorksheetFunction.Transpose(Crr)
  22.             
  23. End Sub
复制代码

求助字典exists方法的使用.rar

310.21 KB, 下载次数: 73

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2014-2-20 14:21 | 显示全部楼层
新人真心不容易啊,求带教,求顶贴
回复

使用道具 举报

 楼主| 发表于 2014-2-20 14:36 | 显示全部楼层
兰版,其他高手们,帮我看看吧。人气太低了,只有自己来顶了!
回复

使用道具 举报

发表于 2014-2-20 14:57 | 显示全部楼层
  • If dicB.exists(arr1(b)) Then
  •                        dicA.Remove (arr1(b))   这句有问题?

回复

使用道具 举报

 楼主| 发表于 2014-2-20 15:09 | 显示全部楼层
苗凱 发表于 2014-2-20 14:57
  • If dicB.exists(arr1(b)) Then
  •                        dicA.Remove (arr1(b))   这句有问题?
    ...

  • 问题在哪儿呢?我就是没有找出来问题所在。感谢回答,好的开端!
    回复

    使用道具 举报

     楼主| 发表于 2014-2-20 15:17 | 显示全部楼层
    我是把dicA的值赋给arr1,然后判断是否在dicB中存在,若存在,就在dicA中进行删除。
    回复

    使用道具 举报

    发表于 2014-2-20 15:26 | 显示全部楼层
    Set d = CreateObject("Scripting.Dictionary")
    With Sheets("sheet1")
    ashrow = .Range("A" & Rows.Count).End(xlUp).Row
    bshrow = .Range("B" & Rows.Count).End(xlUp).Row
    arra = .Range("A2:A" & ashrow)
    arrb = .Range("b2:b" & bshrow)
    For i = 1 To UBound(arra)
         d(arra(i, 1)) = ""
         n = n + 1
         ReDim Preserve arra1(1 To 1, 1 To n)
         arra1(1, n) = arra(i, 1)
    Next i
    For i = 1 To UBound(arrb)
         If d.exists(arrb(i, 1)) = False Then
            n = n + 1
            ReDim Preserve arra1(1 To 1, 1 To n)
            arra1(1, n) = arrb(i, 1)
        Else
            m = m + 1
            ReDim Preserve arrb1(1 To 1, 1 To m)
            arrb1(1, m) = arrb(i, 1)
         End If
    Next i
    .Range("D2").Resize(n) = Application.Transpose(arra1)
    .Range("E2").Resize(m) = Application.Transpose(arrb1)
    End With
    End Sub
    回复

    使用道具 举报

     楼主| 发表于 2014-2-20 15:36 | 显示全部楼层
    苗凱 发表于 2014-2-20 15:26
    Set d = CreateObject("Scripting.Dictionary")
    With Sheets("sheet1")
    ashrow = .Range("A" & Rows.Coun ...

    怎么看起来有点吃力啊。和我之前写的差别太大,能帮我解析下我的代码有什么问题吗?


    回复

    使用道具 举报

     楼主| 发表于 2014-2-20 16:04 | 显示全部楼层
    求解析,求帮助啊!
    回复

    使用道具 举报

     楼主| 发表于 2014-2-20 16:09 | 显示全部楼层
    求解析,求帮助啊!
    回复

    使用道具 举报

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

    本版积分规则

    小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

    GMT+8, 2024-5-31 12:37 , Processed in 1.940730 second(s), 11 queries , Gzip On, Yac On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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