ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 求老师帮写个VBA代码从多表中选择相同及不同数据

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-18 14:04 | 显示全部楼层
lzxdy 发表于 2017-10-18 11:24
表的规律只是横向数量变化,可在代码中设参数如z1,z1代表起、止块,只需要改z1,z2值那可参不同列处理:
...

lzxdy老师您好,收到您的再次指教,特来拜谢,谢谢特别提醒,打扰多次,再次感谢lzxdy老师一次次帮助.Excelhomem因为有许多您们这样乐于助人的老师而倍加精彩兴盛!

TA的精华主题

TA的得分主题

发表于 2017-10-19 19:38 | 显示全部楼层
本帖最后由 weiyingde 于 2017-10-19 19:40 编辑

lzxdy友,向你讨教。
我的代码,如下,显然有问题,但我才疏学浅,不能看出问题的所在,烦请指教。
希望能在我的代码上修改,这样,我要接受和消化。
代码如下:
Sub 对比2()
On Error Resume Next
Dim rg As Range, crr(1 To 10, 1 To 9)
For i = 1 To 6
    Set rg = Sheet1.Range("A4:H13").Offset(0, (i - 1) * 9)
    arr = rg.Value
    Set rng = Sheet1.Range("A15:H24").Offset(0, (i - 1) * 9)
    brr = rng.Value
    Set d = CreateObject("scripting.dictionary")
      For Each rn1 In arr
        If rn1 <> "" Then
           For Each rn2 In brr
             If rn2 <> "" Then
                 If rn1 = rn2 Then
                    n = n + 1
                    m = IIf(n < 8, 1, Int(n / 8))
                    p = IIf(n Mod 8 = 0, 8, n Mod 8)
                   crr(m, p) = rn2
                    Set rng1 = Nothing
                    Set rng2 = Nothing
                 Else
                    d(rn1) = ""
                    d(rn2) = ""

                 End If
             End If
            Next
         End If
         
      Next
    Sheet1.Cells(45, (i - 1) * 9 + 1).Resize(10, 9) = crr
    k = d.keys
    t = d.Count
         For j = 0 To t
           r = Int(j / 8)
           y = j Mod 8
           Sheet1.Cells(55, 1).Offset(r, (i - 1) * 9 + y) = k(j)
         Next
     n = 0
    Set d = Nothing
    Set k = Nothing
Next
End Sub

问题是:
1、重复的数字,遗漏了
2、字典里居然包含了重复烦人内容。
问题应该不是IF ……else……end if 吧?
可是有时什么惹得祸呢?
附件如下:

从多表中选择相同及不同数据.rar

19.39 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2017-10-19 21:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2017-10-19 19:38
lzxdy友,向你讨教。
我的代码,如下,显然有问题,但我才疏学浅,不能看出问题的所在,烦请指教。
希 ...

生成的字典中包含了前面两张表中的所有数字,只需要去除掉表甲1中的数字即可,因此可在
    k = d.keys的前一行加上:
    For Each rn3 In crr
      d.Remove rn3
    Next
即可。
也可改变循环方式,发现重复的就去除掉,可作如下修改:
      For Each rn1 In arr
        If rn1 <> "" Then
           For Each rn2 In brr
             If rn2 <> "" Then
                 If rn1 = rn2 Then
                    n = n + 1
                    m = IIf(n < 8, 1, Int(n / 8))
                    p = IIf(n Mod 8 = 0, 8, n Mod 8)
                    crr(m, p) = rn2
                    Set rng1 = Nothing
                    Set rng2 = Nothing
                    
                 Else
                    d(rn1) = ""
                    d(rn2) = ""
                 End If
             End If
            Next
         End If
      Next
改为:
      For j = 1 To 10       '改循环方式
      For k = 1 To 8
        If arr(j, k) <> "" Then
           For x = 1 To 10      '改循环方式
           For y = 1 To 8
             If brr(x, y) <> "" Then
                 If arr(j, k) = brr(x, y) Then
                    n = n + 1
                    m = IIf(n < 8, 1, Int(n / 8))
                    p = IIf(n Mod 8 = 0, 8, n Mod 8)
                    crr(m, p) = brr(x, y)
                    Set rng1 = Nothing
                    Set rng2 = Nothing
                    d.Remove brr(x, y)   '去重
                    brr(x, y) = ""      '去重
                    Exit For
                 Else
                    d(arr(j, k)) = ""
                    d(brr(x, y)) = ""
                 End If
             End If
            Next
            Next
         End If
      Next
      Next
以上只是一种思路,提供参考。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-10-19 22:33 | 显示全部楼层
weiyingde 发表于 2017-10-19 19:38
lzxdy友,向你讨教。
我的代码,如下,显然有问题,但我才疏学浅,不能看出问题的所在,烦请指教。
希 ...

另外,上面中的d(rn2) = ""或d(brr(x, y)) = ""应该去掉,才符合原问题本义。

TA的精华主题

TA的得分主题

发表于 2017-10-20 06:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lzxdy 发表于 2017-10-19 21:58
生成的字典中包含了前面两张表中的所有数字,只需要去除掉表甲1中的数字即可,因此可在
    k = d.keys ...

谢谢你,我消化一下,有问题再请教你。

TA的精华主题

TA的得分主题

发表于 2017-10-20 09:39 | 显示全部楼层
lzxdy 发表于 2017-10-19 21:58
生成的字典中包含了前面两张表中的所有数字,只需要去除掉表甲1中的数字即可,因此可在
    k = d.keys ...

测试了一下,结果是,列出的重复数还是少了……

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-20 11:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyingde 发表于 2017-10-20 09:39
测试了一下,结果是,列出的重复数还是少了……

哈哈没想到weiyingde 友也对此感兴趣,我这里也要感谢你一下,你另写的代码及设置中有一点是让我  一直以来不知要怎么样做的,看了你的东东结果终于搞清了,哈也算是无心插柳之收获了,谢谢你. lzxdy老师 说生成的字典中包含了前面两张表中的所有数字,只需要去除掉表甲1中的数字即可,可是他可能没注意到你代码选择出来的表甲1中重复数据本来就没有选择完全,所以他修改的只需要去除掉表甲1中的数字  得到的结果肯定是不全的了!你最终结果肯定要包含得有重复数据

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-10-20 11:15 | 显示全部楼层
weiyingde 发表于 2017-10-20 09:39
测试了一下,结果是,列出的重复数还是少了……

weiyingde 友我希望你能继续跟进 并完成此代码,虽然你选择本意和我有所不同,我是只要表一余下不同,你是要常规下大家都要的表一和表1中所有不同,毕竟大多时候还是你那种选择需要多些,期判你成攻,需要时也好得以应用.

TA的精华主题

TA的得分主题

发表于 2017-10-20 12:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
efttr55dyf 发表于 2017-10-20 11:15
weiyingde 友我希望你能继续跟进 并完成此代码,虽然你选择本意和我有所不同,我是只要表一余下不同,你是要 ...

是的,很多时候,我也狂狂论坛,对一些能够解决的问题,试一试身手,当然,由于学艺不精,会遇到一些障碍,好在会有很多朋友的指点和帮助,总会有结果的。
希望,大家一同进步。
谢谢关注。

TA的精华主题

TA的得分主题

发表于 2017-10-20 16:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
lzxdy 发表于 2017-10-19 22:33
另外,上面中的d(rn2) = ""或d(brr(x, y)) = ""应该去掉,才符合原问题本义。

再次测试,发现字典统计的数字也不对,比实际数要多出几个,请测试并指点。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-22 08:28 , Processed in 0.044217 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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