Excel精英培训网

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

求助一个对比并操作的代码

[复制链接]
发表于 2019-6-24 14:29 | 显示全部楼层 |阅读模式
2学分
BY:CJ, CK:CV, CW4:DH, DI:DT, DU:EF 这五个区域,对应B:G
从第4行开始,如果哪个区域和B4:G4相同的值 大于1个,就把那个区域整列删除.
比如:CW4:DH4,对应B4:G4,相同的有5个,那么就把CW:DH都删除;
BY4:CJ4,对应B4:G4,相同的有2个,BY:CJ也删除;
DI4:DT4,对应B4:G4,相同的有3个,DI:DT也删除;
B:G我还会继续往下加入第5.6.7....行的内容,就始终只针对B:G为空的上一行的内容进行对比后删除
请老师看看这个代码怎么写?

求助.zip

70.94 KB, 下载次数: 4

最佳答案

发表于 2019-6-24 14:29 | 显示全部楼层
求助3.rar (99.02 KB, 下载次数: 4)
回复

使用道具 举报

发表于 2019-6-25 08:34 | 显示全部楼层
也不知道对不对,我就把数据写在下面了,没有去删除你原有多余的数据,万一删错了更麻烦。
Application.ScreenUpdating = False
hs = 25
Rows(hs & ":" & [b10000].End(3).Row).ClearContents
For i = 4 To 5
    ls = 77
    For k = 1 To 5
        s1 = Cells(i, k)
        js = 0
        For j = 2 To 7
            For l = 1 To 12
                If Trim(Cells(i, j)) = Trim(Cells(i, 76 + l + (k - 1) * 12)) Then
                   js = js + 1
                End If
            Next l
        Next j
        For ss = 2 To 7
            Cells(hs, ss) = Cells(i, ss)
        Next ss
        If js <= 1 Then
           For l = 1 To 12
               Cells(hs, ls) = Cells(i, 76 + l + (k - 1) * 12)
               ls = ls + 1
           Next l
        End If
    Next k
    hs = hs + 1
Next i
Application.ScreenUpdating = True

上面开头有个参数 hs,就是写入比较结果的行数,你可以自定义这个参数,我暂定为25行。
回复

使用道具 举报

 楼主| 发表于 2019-6-25 13:26 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-25 08:34
也不知道对不对,我就把数据写在下面了,没有去删除你原有多余的数据,万一删错了更麻烦。
Application.Sc ...

首先,谢谢老师,
这个进行对比的5个区域,是分开的,有的区域如果是在条件范围内,就不删除.
还有这个hs的行数选择,能不能设定为 B列为空的,上一列进行?
回复

使用道具 举报

发表于 2019-6-25 14:32 | 显示全部楼层
ryoryo66 发表于 2019-6-25 13:26
首先,谢谢老师,
这个进行对比的5个区域,是分开的,有的区域如果是在条件范围内,就不删除.
还有这个hs的 ...

1、我知道是独立分开的,每12个为一组,你用了带颜色的边框线分隔。作为代码判断,做内容判断比较容易,做格式定义比较困难,如果你喜欢你上面的颜色及格式定义,可以用格式刷刷一下即可。如果要用代码来做到同样的效果,代码会很长很长,根本就不值得。或者你干脆就把后面所有的空行全部都预先刷好格式,不管有没有内容;
2、hs随便你自定义,虽然也可以用代码判断在空行的下一行写数据,但我还是觉得你自己改个数字更好,因为一个空行不太明显,很容易会把它与原有的内容混为一体。作为美观,大致上需要4-5个空行才比较合适。另外也不知道你的数据到底有多少,如果是上百行这种,不管留多少空行都不合适,需要另外存一个新表;
3、虽然代码里修改行数定义也容易,但真正的自动化不是要每次都去改代码的。为了便于定义行数,对于你这个例子,先把b1和c1单元格合并为一个单元格(一个单元格太小,数字显示不出来),可以在a1单元格输入“行数”,再在b1:c1合并单元格里输入数字 25 。然后去代码里把 hs=25 修改成 hs=cells(1,2),这个cells(1,2)是指第一行第二列,就是b1单元格,以后你要修改行数直接改这个数就行了,不用再去改代码了;

回复

使用道具 举报

 楼主| 发表于 2019-6-25 14:44 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-25 14:32
1、我知道是独立分开的,每12个为一组,你用了带颜色的边框线分隔。作为代码判断,做内容判断比较容易, ...

老师,可能是我没表达清楚,这个代码一运行,全都清除了.

麻烦您再看一看.


12.zip

70.94 KB, 下载次数: 3

回复

使用道具 举报

发表于 2019-6-25 15:01 | 显示全部楼层
ryoryo66 发表于 2019-6-25 14:44
老师,可能是我没表达清楚,这个代码一运行,全都清除了.

麻烦您再看一看.

1、你现在附加的文件没有代码,我只看到一个未设计完的窗体以及好几个没有代码的空模块,我也不知道你是如何测试的;
2、我再次测试的结果是没有问题的,不存在清空这一说。你可以再去上面把代码复制过来测试。关于行数 hs 定义,我上面提了建议;

回复

使用道具 举报

 楼主| 发表于 2019-6-25 15:17 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-25 15:01
1、你现在附加的文件没有代码,我只看到一个未设计完的窗体以及好几个没有代码的空模块,我也不知道你是 ...

不好意思老师,我刚才发之前忘记保存了.
现在这个,我改成了第5行的行数.
运行后,应该清空的区域是 BY5:CJ5, CW5:DH5, DI5:DT5,
但实际上好像不太一样.



12.zip

75.8 KB, 下载次数: 1

回复

使用道具 举报

发表于 2019-6-25 15:30 | 显示全部楼层
ryoryo66 发表于 2019-6-25 15:17
不好意思老师,我刚才发之前忘记保存了.
现在这个,我改成了第5行的行数.
运行后,应该清空的区域是 BY5:C ...

行数的定义至少需要是第6行,第5行是有源数据的,不能把结果写在这里,会覆盖源数据。行数是指行的顺序号,不是你A列定义的序号。
把hs改成6或者更大的数,你再试下。
回复

使用道具 举报

 楼主| 发表于 2019-6-25 15:37 | 显示全部楼层
hfwufanhf2006 发表于 2019-6-25 15:30
行数的定义至少需要是第6行,第5行是有源数据的,不能把结果写在这里,会覆盖源数据。行数是指行的顺序号 ...

我明白了,那么能不能直接在数据源上面进行清除,写在下面有点不太方便?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 20:12 , Processed in 0.372568 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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