ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] VBA中用了七个字典,求改进

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-6-6 20:22 | 显示全部楼层 |阅读模式
本帖最后由 f8b1987 于 2012-6-6 20:42 编辑

菜鸟表示有压力,虽然能用字典法解决两表四列数据核查问题,但是连用7个字典进行判断,不知道如何改进。

复制代码
期待各位高手指点改进,如能把对比出不一致的数据,创建工作表,粘贴差异明细,并在后面备注是表几的最好了。


代码如下:

  1. Sub 字典()
  2. Dim i As Integer, j As Integer, arr(), brr()
  3. Dim d1 As Object, d2 As Object, d3 As Object
  4. Dim d4 As Object, d5 As Object, d6 As Object, d7 As Object
  5. Set d1 = CreateObject("scripting.dictionary")
  6. Set d2 = CreateObject("scripting.dictionary")
  7. Set d3 = CreateObject("scripting.dictionary")
  8. Set d4 = CreateObject("scripting.dictionary")
  9. Set d5 = CreateObject("scripting.dictionary")
  10. Set d6 = CreateObject("scripting.dictionary")
  11. Set d7 = CreateObject("scripting.dictionary")
  12. arr = Sheet1.Range("a1").CurrentRegion
  13. brr = Sheet2.Range("a1").CurrentRegion
  14. For i = 2 To UBound(brr)
  15. d1(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4)) = "正常"
  16. d2(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3)) = "金额差异"
  17. d3(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 4)) = "地区差异"
  18. d4(brr(i, 1) & "|" & brr(i, 2)) = "地区和金额"
  19. d5(brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4)) = "日期差异"
  20. d6(brr(i, 2) & "|" & brr(i, 4)) = "日期和地区"
  21. d7(brr(i, 2) & "|" & brr(i, 3)) = "日期和金额"
  22. Next i

  23. For j = 2 To UBound(arr)
  24. If d1(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4)) = "正常" Then
  25. arr(j, 5) = d1(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4))
  26. ElseIf d2(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3)) = "金额差异" Then
  27. arr(j, 5) = "金额差异"
  28. ElseIf d3(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 4)) = "地区差异" Then
  29. arr(j, 5) = "地区差异"
  30. ElseIf d4(arr(j, 1) & "|" & arr(j, 2)) = "地区和金额" Then
  31. arr(j, 5) = "地区和金额"
  32. ElseIf d5(arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4)) = "日期差异" Then
  33. arr(j, 5) = "日期差异"
  34. ElseIf d6(arr(j, 2) & "|" & arr(j, 4)) = "日期和地区" Then
  35. arr(j, 5) = "日期和地区"
  36. ElseIf d7(arr(j, 2) & "|" & arr(j, 3)) = "日期和金额" Then
  37. arr(j, 5) = "日期和金额"
  38. Else
  39. arr(j, 5) = "待查"
  40. End If
  41. Next j
  42. Sheet1.Range("a1").Resize(UBound(arr), 5) = arr
  43. Call 字典2
  44. End Sub
  45. Sub 字典2()
  46. Dim i As Integer, j As Integer, arr(), brr()
  47. Dim d1 As Object, d2 As Object, d3 As Object
  48. Dim d4 As Object, d5 As Object, d6 As Object, d7 As Object
  49. Set d1 = CreateObject("scripting.dictionary")
  50. Set d2 = CreateObject("scripting.dictionary")
  51. Set d3 = CreateObject("scripting.dictionary")
  52. Set d4 = CreateObject("scripting.dictionary")
  53. Set d5 = CreateObject("scripting.dictionary")
  54. Set d6 = CreateObject("scripting.dictionary")
  55. Set d7 = CreateObject("scripting.dictionary")
  56. trow = Sheet1.Range("d65536").End(xlUp).Row
  57. brr = Sheet1.Range("a1").CurrentRegion
  58. arr = Sheet2.Range("a1").CurrentRegion
  59. For i = 2 To UBound(brr)
  60. d1(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4)) = "正常"
  61. d2(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 3)) = "金额差异"
  62. d3(brr(i, 1) & "|" & brr(i, 2) & "|" & brr(i, 4)) = "地区差异"
  63. d4(brr(i, 1) & "|" & brr(i, 2)) = "地区和金额"
  64. d5(brr(i, 2) & "|" & brr(i, 3) & "|" & brr(i, 4)) = "日期差异"
  65. d6(brr(i, 2) & "|" & brr(i, 4)) = "日期和地区"
  66. d7(brr(i, 2) & "|" & brr(i, 3)) = "日期和金额"
  67. Next i

  68. For j = 2 To UBound(arr)
  69. If d1(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4)) = "正常" Then
  70. arr(j, 5) = d1(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4))
  71. ElseIf d2(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 3)) = "金额差异" Then
  72. arr(j, 5) = "金额差异"
  73. ElseIf d3(arr(j, 1) & "|" & arr(j, 2) & "|" & arr(j, 4)) = "地区差异" Then
  74. arr(j, 5) = "地区差异"
  75. ElseIf d4(arr(j, 1) & "|" & arr(j, 2)) = "地区和金额" Then
  76. arr(j, 5) = "地区和金额"
  77. ElseIf d5(arr(j, 2) & "|" & arr(j, 3) & "|" & arr(j, 4)) = "日期差异" Then
  78. arr(j, 5) = "日期差异"
  79. ElseIf d6(arr(j, 2) & "|" & arr(j, 4)) = "日期和地区" Then
  80. arr(j, 5) = "日期和地区"
  81. ElseIf d7(arr(j, 2) & "|" & arr(j, 3)) = "日期和金额" Then
  82. arr(j, 5) = "日期和金额"
  83. Else
  84. arr(j, 5) = "待查"
  85. End If
  86. Next j
  87. Sheet2.Range("a1").Resize(UBound(arr), 5) = arr
  88. End Sub


复制代码
VBA对比两表四列模表 - 副本.rar (98.86 KB, 下载次数: 273)

麻烦各位了,附件里有程序文件和参考差异的结果。


工作簿中有表一和表二
先在表一对表二核对,然后在表二对表一核对。

先在表一对表二数据查找判断:
如果A/B/C/D列中的数据完全一致,则F列显示正常
如果A/B/C一致,D不同,则F列显示金额差异
如果A/B/D一致,C不同,则F列显示地区差异
如果A/B相同,C/D均不同,则F列为“地区和金额”
如果B/C/D相同,A不同,则F列为“日期差异”
如果B/D相同,A/C不同,则F列为“日期和地区”
如果B/C相同,A/D不同,则F列为“日期和金额”
其他情况,F列返回“待查”

然后继续在表二对表一数据查找判断,判断方式如上

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-6-6 20:31 | 显示全部楼层
本帖最后由 小花鹿 于 2012-6-6 20:32 编辑

帖代码不如直接说要求好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-6 21:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2012-6-6 20:31
帖代码不如直接说要求好。

已补充说明

TA的精华主题

TA的得分主题

发表于 2012-6-6 22:32 | 显示全部楼层
f8b1987 发表于 2012-6-6 21:20
已补充说明

字典2可简化掉。
插在字典1中
'........
Sheet1.Range("a1").Resize(UBound(arr), 5) = arr
   
    '以下代码替代字典2
    d1.RemoveAll
    For i = 2 To UBound(arr)
       d1(arr(i, 2)) = arr(i, 5)
    Next
    For i = 2 To UBound(brr)
       If d1.exists(brr(i, 2)) Then
          brr(i, 5) = d1(brr(i, 2))
       Else
          brr(i, 5) = "待查"
       End If
    Next
    Sheet2.Range("a1").CurrentRegion = brr
    'Call 字典2
End Sub

TA的精华主题

TA的得分主题

发表于 2012-6-6 22:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参考附件。。。

VBA对比两表四列模表 - 副本.rar

89.16 KB, 下载次数: 268

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-7 00:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yaozong 发表于 2012-6-6 22:40
参考附件。。。

谢谢,代码简洁。另外分享别人的代码
Sub aa()
    Dim d As New Dictionary
    Dim arr1, arr2, arrj
    Dim i As Long, str As String
    Sheets("表一").Range("F2:F" & [F65536].End(xlUp).Row + 1).ClearContents
    arr1 = Sheets("表一").Range("A2:D" & [A65536].End(xlUp).Row)
    arr2 = Sheets("表二").Range("A2:D" & Sheets("表二").[A65536].End(xlUp).Row)
    ReDim arrj(1 To UBound(arr1), 1 To 1)
    For i = 1 To UBound(arr2)
        d(arr2(i, 2)) = Array(arr2(i, 1), arr2(i, 3), arr2(i, 4), i)
    Next i
    For i = 1 To UBound(arr1)
        If d.Exists(arr1(i, 2)) Then
            If arr1(i, 1) = d(arr1(i, 2))(0) And arr1(i, 3) = d(arr1(i, 2))(1) And arr1(i, 4) = d(arr1(i, 2))(2) Then
                arrj(i, 1) = "正常"
            Else
                str = "差异"
                If arr1(i, 1) <> d(arr1(i, 2))(0) Then
                    str = "时间" & str
                End If
                If arr1(i, 3) <> d(arr1(i, 2))(1) Then
                    str = "地区" & str
                End If
                If arr1(i, 4) <> d(arr1(i, 2))(2) Then
                    str = "金额" & str
                End If
                arrj(i, 1) = str
            End If
        Else
            arrj(i, 1) = "待查"
        End If
    Next i
    Sheets("表一").Range("F2").Resize(UBound(arr1), 1) = arrj
End Sub
Sub bb()
    Dim t1 As Double, t2 As Double
    t1 = Timer
    Call aa
    Call cc
    t2 = Timer
    MsgBox t2 - t1
End Sub
Sub cc()
    Dim d As New Dictionary
    Dim arr1, arr2, arrj
    Dim i As Long, str As String
    Sheets("表二").Range("F2:F" & [F65536].End(xlUp).Row + 1).ClearContents
    arr1 = Sheets("表二").Range("A2:D" & [A65536].End(xlUp).Row)
    arr2 = Sheets("表一").Range("A2:D" & Sheets("表一").[A65536].End(xlUp).Row)
    ReDim arrj(1 To UBound(arr1), 1 To 1)
    For i = 1 To UBound(arr2)
        d(arr2(i, 2)) = Array(arr2(i, 1), arr2(i, 3), arr2(i, 4), i)
    Next i
    For i = 1 To UBound(arr1)
        If d.Exists(arr1(i, 2)) Then
            If arr1(i, 1) = d(arr1(i, 2))(0) And arr1(i, 3) = d(arr1(i, 2))(1) And arr1(i, 4) = d(arr1(i, 2))(2) Then
                arrj(i, 1) = "正常"
            Else
                str = "差异"
                If arr1(i, 1) <> d(arr1(i, 2))(0) Then
                    str = "时间" & str
                End If
                If arr1(i, 3) <> d(arr1(i, 2))(1) Then
                    str = "地区" & str
                End If
                If arr1(i, 4) <> d(arr1(i, 2))(2) Then
                    str = "金额" & str
                End If
                arrj(i, 1) = str
            End If
        Else
            arrj(i, 1) = "待查"
        End If
    Next i
    Sheets("表二").Range("F2").Resize(UBound(arr1), 1) = arrj
End Sub

TA的精华主题

TA的得分主题

发表于 2012-6-7 07:04 | 显示全部楼层
f8b1987 发表于 2012-6-7 00:15
谢谢,代码简洁。另外分享别人的代码
Sub aa()
    Dim d As New Dictionary

也可改为这样。
Sub 字典()
Dim d1, arr(), brr(), ar(), br(), k, i, n
    Set d = CreateObject("scripting.dictionary")
    arr = Sheet1.Range("a1").CurrentRegion
    brr = Sheet2.Range("a1").CurrentRegion
    ar = Array("日期", "地区", "金额")
    For i = 2 To UBound(brr)
        d(brr(i, 2)) = Array(brr(i, 1), brr(i, 3), brr(i, 4))
    Next i
    For i = 2 To UBound(arr)
        If d.exists(arr(i, 2)) Then
           br = Array(arr(i, 1), arr(i, 3), arr(i, 4))
           For n = 0 To UBound(br)
              If br(n) <> d(arr(i, 2))(n) Then
                 arr(i, 5) = arr(i, 5) & ar(n)
              End If
           Next
        Else
           arr(i, 5) = "待查"
        End If
        If arr(i, 5) = "" Then
           arr(i, 5) = "OK"
        Else
           If arr(i, 5) = "待查" Then
              arr(i, 5) = arr(i, 5)
           Else
              arr(i, 5) = arr(i, 5) & "异常"
           End If
       End If
    Next
    Sheet1.Range("a1").Resize(UBound(arr), 5) = arr
    d.RemoveAll
    For i = 2 To UBound(arr)
       d(arr(i, 2)) = arr(i, 5)
    Next
    For i = 2 To UBound(brr)
       If d.exists(brr(i, 2)) Then
          brr(i, 5) = d(brr(i, 2))
       Else
          brr(i, 5) = "待查"
       End If
    Next
    Sheet2.Range("a1").CurrentRegion = brr
    Set d = Nothing
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-6-7 07:05 | 显示全部楼层
参考附件。。。

VBA对比两表四列模表 - 副本2.rar

107.37 KB, 下载次数: 317

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-6-7 07:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yaozong 发表于 2012-6-7 07:05
参考附件。。。

代码简洁了,但运行速度好像还是另外分享那位的代码快些,不过这点速度差异不影响效果,还是谢谢了

TA的精华主题

TA的得分主题

发表于 2012-6-7 08:11 | 显示全部楼层
f8b1987 发表于 2012-6-7 07:52
代码简洁了,但运行速度好像还是另外分享那位的代码快些,不过这点速度差异不影响效果,还是谢谢了

代码少了,不等于优化,多几个字典也无仿,运行顺畅就好。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-19 03:48 , Processed in 0.043801 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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