ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 在指定的一个或多个单元格区域内,把完全相同的单元格全部都清空,如果只保留一个

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-12-2 13:20 | 显示全部楼层
gaoch35 发表于 2014-12-2 10:34
如果我想指定两个或多个单元格区域,不是列,比如两个单元格区域为a3:b17和c5:e21,那代码怎么改

直接选任意区域
  1. Sub SC()
  2.     Dim rng() As String, cell As Range, rngtemp As Range
  3.     Application.ScreenUpdating = False
  4.     AD = Selection.Address(0, 0)
  5.     rng = Split(AD, ",")
  6.     For Each cell In Selection
  7.         s = 0
  8.         T = cell.Value
  9.         If T = "" Then
  10.             GoTo 1         '单元格值为空直接往下一单元格
  11.         ElseIf Trim(T) <> "" Then
  12.             For Each rn In rng
  13.                 s = s + Application.CountIf(Range(rn), T)
  14.             Next
  15.         Else
  16.             cell.Value = ""
  17.         End If
  18.         If s > 1 Then
  19.             Selection.Find(What:=T, After:=ActiveCell, LookIn _
  20.             :=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
  21.             xlNext, MatchCase:=False, SearchFormat:=False).Activate
  22.             Do
  23.                 Selection.FindNext(After:=ActiveCell).Delete Shift:=xlUp
  24.                 s = s - 1
  25.             Loop While s > 1
  26.         End If
  27. 1:  Next
  28.     Application.ScreenUpdating = True
  29. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-2 22:24 | 显示全部楼层
Vicel 发表于 2014-12-2 13:20
直接选任意区域

用第20楼的代码时会多删除一个没有重复的单元格,如果把第20楼的代码改成把全部完全相同的单元格都删除掉,会多删除两个没有重复的单元格

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-2 22:35 | 显示全部楼层
本帖最后由 gaoch35 于 2014-12-2 22:37 编辑
Vicel 发表于 2014-12-2 13:20
直接选任意区域

第21楼的单元格区域在哪?一个或多个单元格区域怎么填

TA的精华主题

TA的得分主题

发表于 2014-12-3 09:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
gaoch35 发表于 2014-12-2 22:35
第21楼的单元格区域在哪?一个或多个单元格区域怎么填

21 楼代码是你先选中需要操作的区域,再去执行代码就行

TA的精华主题

TA的得分主题

发表于 2014-12-3 09:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
gaoch35 发表于 2014-12-2 22:24
用第20楼的代码时会多删除一个没有重复的单元格,如果把第20楼的代码改成把全部完全相同的单元格都删除掉 ...

楼主不模拟结果给我看,我无法判断代码是否有问题。

非整列的区域选择,区间范围是固定不变的。当你删掉一个符合条件的单元格后,临近的单元格会填补进去,或许那个单元格刚好也符合条件,然后也被判断而删除掉。

如果想避免这种情况,最好是把符合条件的单元格清空,而不是直接删除

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 09:33 | 显示全部楼层
Vicel 发表于 2014-12-3 09:28
楼主不模拟结果给我看,我无法判断代码是否有问题。

非整列的区域选择,区间范围是固定不变的。当你删 ...

怎么清空,请编写一份吧,拜托了

TA的精华主题

TA的得分主题

发表于 2014-12-3 09:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
@gaoch35  我觉得你没有看懂Vicel的话,他是让你把你所有要求用1、2、3……的形式,一条一条的叙述清楚,并在excel表格里配上数据前、后的例子,这样他会知道具体怎么做,会把情况考虑周全。

@Vicel,佩服你,真有耐心,我都被楼主变来变去的要求弄混了,你却还依然“清晰”着,学习。

PS:如若我总结不错,楼主是希望这样一个功能:
编写一个VBA,最好带有窗体形式,用来填入单元格任意区域,形如a1:c5;d2:e9……用来删除指定的任意区域内单元格内容重复的内容,留下唯一。任意单元格区域包含一整列形式,还包含不连续的多个整列形式,也包含任意大小的单元格区域。

因为看到Vicel在删除重复内容方面的经验,这里可以延展一个问题,如果多个任意区域的选取或者是窗体输入,导致出现“交叉”区域怎么办?而恰恰交叉区域内也存在重复内容。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-12-3 12:04 | 显示全部楼层
Vicel 发表于 2014-12-3 09:18
21 楼代码是你先选中需要操作的区域,再去执行代码就行

麻烦一下,去看看1楼写的,编写出vba
拜托了,谢谢

TA的精华主题

TA的得分主题

发表于 2014-12-3 12:06 | 显示全部楼层
hacker85 发表于 2014-12-3 09:49
@gaoch35  我觉得你没有看懂Vicel的话,他是让你把你所有要求用1、2、3……的形式,一条一条的叙述清楚,并 ...

区域可自由更改,能处理交叉单元格问题,可选择清空或删除多余重复单元格
  1. Sub SC()
  2.    
  3.     Dim rng As Range, cell As Range, d As Object, dd As Object, s As Integer, n As Integer, Z As String, T As String
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set dd = CreateObject("scripting.dictionary")
  6.     Application.ScreenUpdating = False
  7.     rng1 = "A1: C5"
  8.     rng2 = "C2: E9"
  9.     rng3 = "A22:E28"
  10.     Union(Range(rng1), Range(rng2), Range(rng3)).Select
  11.     s = 0: n = 0
  12.     For Each cell In Selection
  13.         Z = cell.Address(0, 0)
  14.         T = cell.Value
  15.         If Not d.exists(Z) Then
  16.             s = s + 1
  17.             d.Add Z, T
  18.             If T = "" Then
  19.                 GoTo 1         '单元格值为空直接往下一单元格
  20.             ElseIf Trim(T) <> "" Then
  21.                 If Not dd.exists(T) Then
  22.                     dd.Add T, Z
  23.                     K = dd.Item(T)
  24.                 ElseIf Z <> dd.Item(T) Then
  25.                     n = n + 1
  26.                     If rng Is Nothing Then
  27.                         Set rng = cell
  28.                     Else
  29.                         Set rng = Union(rng, cell)
  30.                     End If
  31.                 End If
  32.             Else
  33.                 cell.Value = ""
  34.             End If
  35.         Else
  36.             GoTo 1             '单元格为已查询过的,直接往下一单元格
  37.         End If
  38. 1:  Next
  39.     d.RemoveAll
  40.     rng.Select
  41.     Selection.Delete Shift:=xlUp       '删除重复单元格,或换下面代码清空重复单元格
  42.     'Selection.Clear
  43.     'MsgBox "共选择了" & s & "个单元格,其中" & n & "个重复单元格已被清空"
  44.     Application.ScreenUpdating = True
  45.    
  46. End Sub
复制代码


或直接在表格里选择所需操作区域,再执行下列代码
  1. Sub SC()
  2.    
  3.     Dim rng As Range, cell As Range, d As Object, dd As Object, s As Integer, n As Integer, Z As String, T As String
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set dd = CreateObject("scripting.dictionary")
  6.     Application.ScreenUpdating = False
  7.     s = 0: n = 0
  8.     For Each cell In Selection
  9.         Z = cell.Address(0, 0)
  10.         T = cell.Value
  11.         If Not d.exists(Z) Then
  12.             s = s + 1
  13.             d.Add Z, T
  14.             If T = "" Then
  15.                 GoTo 1         '单元格值为空直接往下一单元格
  16.             ElseIf Trim(T) <> "" Then
  17.                 If Not dd.exists(T) Then
  18.                     dd.Add T, Z
  19.                     K = dd.Item(T)
  20.                 ElseIf Z <> dd.Item(T) Then
  21.                     n = n + 1
  22.                     If rng Is Nothing Then
  23.                         Set rng = cell
  24.                     Else
  25.                         Set rng = Union(rng, cell)
  26.                     End If
  27.                 End If
  28.             Else
  29.                 cell.Value = ""
  30.             End If
  31.         Else
  32.             GoTo 1             '单元格为已查询过的,直接往下一单元格
  33.         End If
  34. 1:  Next
  35.     d.RemoveAll
  36.     rng.Select
  37.     Selection.Delete Shift:=xlUp       '删除重复单元格,或换下面代码清空重复单元格
  38.     'Selection.Clear
  39.     'MsgBox "共选择了" & s & "个单元格,其中" & n & "个重复单元格已被清空"
  40.     Application.ScreenUpdating = True
  41.    
  42. End Sub
复制代码
删除重复.rar (9.4 KB, 下载次数: 18)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-12-3 12:34 | 显示全部楼层
先选择需操作区域,再执行代码。可全部清空重复单元格,或只保留一个

  1. Sub QK()           '清空重复单元格
  2.    
  3.     Dim rng As Range, cell As Range, d As Object, dd As Object, Z As String, T As String
  4.     Set d = CreateObject("scripting.dictionary")
  5.     Set dd = CreateObject("scripting.dictionary")
  6.     Application.ScreenUpdating = False
  7.     For Each cell In Selection
  8.         Z = cell.Address(0, 0)
  9.         T = cell.Value
  10.         If Not d.exists(Z) Then
  11.             d.Add Z, T
  12.             If T = "" Then
  13.                 GoTo 1         '单元格值为空直接往下一单元格
  14.             ElseIf Trim(T) <> "" Then
  15.                 If Not dd.exists(T) Then
  16.                     dd.Add T, Z
  17.                     K = dd.Item(T)
  18.                 ElseIf Z <> dd.Item(T) Then
  19.                     Range(dd.Item(T)).Clear         '省略此行代码,则重复单元格只保留一个
  20.                     If rng Is Nothing Then
  21.                         Set rng = cell
  22.                     Else
  23.                         Set rng = Union(rng, cell)
  24.                     End If
  25.                 End If
  26.             Else
  27.                 cell.Value = ""
  28.             End If
  29.         Else
  30.             GoTo 1             '单元格为已查询过的,直接往下一单元格
  31.         End If
  32. 1:  Next
  33.     d.RemoveAll
  34.     rng.Select
  35.     Selection.Clear
  36.     Application.ScreenUpdating = True
  37.    
  38. End Sub
复制代码


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

本版积分规则

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

GMT+8, 2024-11-15 14:39 , Processed in 0.047155 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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