Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: 2379495266

如何清楚单元格时让同行内容随之清除

[复制链接]
 楼主| 发表于 2019-9-2 14:54 | 显示全部楼层
爱疯 发表于 2019-9-2 14:45
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r, c
    r = Target.Row

你用Dim 这段 效果感觉不如之前那个,

你这次写的这个 选中多个连续的B列单元格 清空后,只会清除 选中区域的第一个单元格那行

之前写的 把IF Len(Target) Then 改成 IF Len(Target) = 0 Then 后,可以选择 多个 不连续的单元格 按delete 清除对应行的内容, 唯一不行的就是 不能选中多个连续的单元格 按delete清除 对应的连续几行
回复

使用道具 举报

 楼主| 发表于 2019-9-2 14:56 | 显示全部楼层
爱疯 发表于 2019-9-2 14:54
可以选择多个并清除啊?

你这个多列删除,实际上同行被删除的单元格清空 是因为我写了公式, 你可以看 没写公式的C列 E列 J列 就没有被清空
回复

使用道具 举报

发表于 2019-9-2 15:47 | 显示全部楼层
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Target.Count = 1 Then
            If Target = "" Then
                Call qc(Target)
            End If
        Else
            Call qc(Selection)
        End If
    End If
End Sub

'清除
Sub qc(x)
    With Application
        .EnableEvents = False
        .Union(x, .Intersect(x.EntireRow, Range("c:c,e:e,k:k,m:m,o:o,q:q,s:s,u:u,w:w"))) = ""
        .EnableEvents = True
    End With
End Sub


这样呢
回复

使用道具 举报

 楼主| 发表于 2019-9-2 15:59 | 显示全部楼层
爱疯 发表于 2019-9-2 15:47
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Targe ...

6啊你这个确实可以了。是我想的效果。

不过其实你之前6楼的 稍微改一下就几乎已经达成了,唯独删除连续单元格内容会出错Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Len(Target) = 0 Then
            With Application
                .EnableEvents = False
                .Union(Target, .Intersect(Target.EntireRow, Range("c:c,e:e,j:j"))).ClearContents
                .EnableEvents = True
            End With
        End If
    End If
End Sub


就是这段代码

效果是这样的
未标题-2.gif

感觉问题出现在: 判断B列 连续多个单元格为空 这个地方? 就相当于,选B2,B4,B6,B7,这样只要中间有不连续的单元格,那么清除的时候对应的同行内容被清除。一旦选了 B2:B7 这样全部连续的单元格.... 就不生效了。
难道只有你这楼回复的方法能达成吗?
IF Len(Target) = 0 Then 这个条件 怎么写才能让他判断 B列 连续的 单元格内容 都被清空了 ,然后正常的去删除连续单元格对应行的内容呢?




回复

使用道具 举报

 楼主| 发表于 2019-9-2 16:14 | 显示全部楼层
爱疯 发表于 2019-9-2 15:47
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Targe ...

感谢大神,你写的如果定义qc是不是拆开就是下面这样的?下面这个我自己试了一下 跟你写的效果一样。


Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Target.Count = 1 Then
            If Target = "" Then
                With Application
                    .EnableEvents = False
                    .Union(Target, .Intersect(Target.EntireRow, Range("c:c,d:d,f:f,k:k"))).ClearContents
                    .EnableEvents = True
                End With
            End If
        Else
            With Application
                .EnableEvents = False
                .Union(Selection, .Intersect(Selection.EntireRow, Range("c:c,d:d,f:f,k:k"))).ClearContents
                .EnableEvents = True
            End With
        End If
    End If
End Sub




回复

使用道具 举报

 楼主| 发表于 2019-9-2 16:16 | 显示全部楼层
爱疯 发表于 2019-9-2 15:47
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Targe ...

所以感觉 是不是问题就在于 selection和target?
能讲讲区别吗?一个是选取区域?一个是目标单元格?target as Range, range难道不能是连续的单元格吗?小白东看西看的资料零零散散,不是很懂。。求大神指点一下
回复

使用道具 举报

发表于 2019-9-2 16:23 | 显示全部楼层
2379495266 发表于 2019-9-2 16:14
感谢大神,你写的如果定义qc是不是拆开就是下面这样的?下面这个我自己试了一下 跟你写的效果一样。


...

是,不建议写成15楼那样,重复的代码能抽取,尽量抽出来。否则,等里面的代码真的很多或者时间久了,就算是有效代码,你也会看不下去的。


回复

使用道具 举报

发表于 2019-9-2 16:36 | 显示全部楼层
本帖最后由 爱疯 于 2019-9-10 10:23 编辑
2379495266 发表于 2019-9-2 16:16
所以感觉 是不是问题就在于 selection和target?
能讲讲区别吗?一个是选取区域?一个是目标单元格?tar ...
对于len()函数,参数要么文本,要么变量len(range("b17")),参数是一个文本,所以一个单元格可以;
len(range("b15:b17")),参数不是一个文本或变量,所以多个单元格不可以。


查帮助:在VBA编辑器的右上方"键入需要帮助的问题"里输入要找的内容,在弹出的帮助的左上方的搜索的下拉里,选择 开发人员参考。


回复

使用道具 举报

 楼主| 发表于 2019-9-2 19:16 | 显示全部楼层
爱疯 发表于 2019-9-2 16:36
Range.EntireRow 属性
返回一个 Range 对象,该对象表示包含指定区域的整行(或多行)。只读。

学到了学到了!跪谢大神!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 05:11 , Processed in 0.324633 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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