作者:绿色风
分类:
时间:2022-08-17
浏览:168
楼主 芐雨 |
Q:如何利用VBA字典合并单元格同类项 A:
上面列举了合并的三种规则: 1.单元格上下左右相邻的值相等就合并,顺序先行后列----代码09行 2.单元格上下相邻的值相等合并(列方向)----代码10行 3.单元格左右相邻的值相等合并(行方向)----代码11行
PS:比较常用的是列方向和行方向的合并,大家可以根据图和代码来对比三种规则的不同之处
代码如下:
- Sub 利用字典合并同类项_芐雨()
- Dim rng As Range, rg As Range, d As Object
- Application.ScreenUpdating = False
- Application.DisplayAlerts = False
- Range("A11:E17").Copy Range("A1:E7")
- Set rng = Range("A1:E7")
- Set d = CreateObject("scripting.dictionary")
- For Each rg In rng
- s = rg.Value '等于单元格rg的值
- ' s = rg.Value & "#" & rg.Column '等于单元格rg的值&"#"&rg的列号
- ' s = rg.Value & "#" & rg.Row '等于单元格rg的值&"#"&rg的行号
- If d.exists(s) Then '存在执行连接单元格对象
- Set d(s) = Union(d(s), rg)
- Else
- Set d(s) = rg '不存在等于单元格对象
- End If
- Next
- For Each ky In d.keys '遍历所有字典并合并单元格
- d(ky).Merge
- Next
- rng.Borders.LineStyle = 1 '边框
- rng.HorizontalAlignment = xlCenter '左右居中对齐
- rng.VerticalAlignment = xlCenter '上下居中对齐
- Application.ScreenUpdating = True
- Application.DisplayAlerts = True
- End Sub
重要代码详解: 1、字典可以是一个值,也可以是对象。rg表示一个单元格 给普通变量赋值,可以直接等于:d(s)=rg,等于Range的值 给对象变量赋值使用SET, Set d(s) = rg ,也就是说d(s)是一个Range。
2、利用字典的去重功能,把重复的数值的单元格对象利用Union合并在一起 如果要单元格上下左右相邻的值相等就合并,s = rg.Value,等于单元格rg的值, 如果只需列或行方向相邻的值相等才合并,加个列号或行号就以区分就可以了,详细见代码10,11行。- s = rg.Value '等于单元格rg的值
- ' s = rg.Value & "#" & rg.Column '等于单元格rg的值&"#"&rg的列号
- ' s = rg.Value & "#" & rg.Row '等于单元格rg的值&"#"&rg的行号
- If d.exists(s) Then '存在执行连接单元格对象
- Set d(s) = Union(d(s), rg)
- Else
- Set d(s) = rg '不存在等于单元格对象
- End If
3、遍历所有字典并合并单元格,利用key值遍历所有字典。 其中d(ky)可以是一个单元格对象,也可以由多个单元格或单元格区域组成的区域,直接用Merge合并单元格(效果等同于用Ctrl选取多个单元格区域,再按合并单元。)
- For Each ky In d.keys '遍历所有字典并合并单元格
- d(ky).Merge
- Next
附件:
利用字典合并同类项_芐雨.zip
|
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一