Excel VBA 8.12 横向批量合并单元格 进一步提升合并功能
前景提要
在之前几次的学习中,我们学会了如何利用VBA的merge方法来实现单元格的合并,并且尝试用代码实现了连续和非连续的相同单元格内容的合并,效果还是非常的不错的,但是后台有不少的小伙伴表示,这样的场景还不够全面,又提出了一个新的工作场景,我们今天就一起针对这个新的场景来研究下
场景说明
来看看我们今天的模拟数据

和我们上节课的数据基本上差不多,唯一的区别就是姓名这一个字段有多个相同数据,并且是横向分布,相对于上节课的思路来说,我们现在无非就是需要就我们的思路从原来的横向,转化成为纵向就可以了。
说起来好像很简单的样子,思维从横向转成纵向,但是实际的代码要如何来实现呢?
直接来看看代码,这样我们理解更加方便一点
代码区
Sub test3()Dim rng As Range, rngC&, rngR&, r&, c&, frng As RangeApplication.DisplayAlerts = FalseSet rng = Application.InputBox("请选择合并的区域", "合并相同内容", , , , , , 8)rngC = rng.Columns.CountrngR = rng.Rows.CountFor r = 2 To rngR + 1 Set frng = rng.Cells(r - 1, 1) frng.Select For c = 1 To rngC If Cells(r, c) <> Cells(r, c + 1) Then Range(frng, Cells(r, c)).Merge Set frng = Cells(r, c + 1) End If Next cNext r End Sub
来看看代码实现的



仔细看下这两个数据图前后的对比,我们在数据中设置了一些bug,从中拆除一些连续相同单元格,不连续相同单元格的合并,涵盖了之前两节中所存在的bug,最终效果看起来还是非常的完美的
代码解析
其实今天的代码的重点,还是在起始单元格的确认上面, 也就是我们的frng
首先我们要确定我们的思路,因为我们是循环整个选择区域的
故而我们首先需要得到整个区域的大小
rngC = rng.Columns.Count'总共有多少列 rngR = rng.Rows.Count'总共有多少行有了总行数和总列数之后,那么我们就可以进行循环了。
当然循环并不是随意的循环,我们需要有个参照物,这个参照物就是我们上面说的起始单元格
和之前纵向对比的时候不同的是,他应该是每一行的第一个单元格,而不是每一列的第一单元格
所以我们这里使用了下面的代码
Set frng = rng.Cells(r - 1, 1)有了起始单元格和单元格的区域之后,我们就可以进行循环判断了。
上节课思路是纵向,我们现在要横向

如果后面每个单元格的内容都和起始单元格相同,则直接可以进行单元格的合并,利用merge方法
但是,难点在这里
如果碰到不一致的单元格之后,我们需要做两个操作
1.合并之前的单元格
2.重新定义其实单元格
这里要怎么理解呢?
回归案例

以上面数据的第四行为例,第一、第二两个单元格内容相同,可以合并,但是第三单元格内容和第一单元不同,肯定不能够执行合并。
所以我们先合并前面两个单元格
Range(frng, Cells(r, c)).Merge
然后我们需要重新初始化起始单元格
Set frng = Cells(r, c + 1)
为什么要这么操作呢?
继续回归案例

这时候已经循环到了A11所在的单元格了,但是A11和下一个单元格内容并不相同,这个时候是不能够执行合并的
如果我们没有上一步的操作,不重新定义起始单元格,那么起始单元格还是等于A1所在的单元格
这会导致整个A4:E4这样一个区间都会被合并

这很明显是不对的,所以在这里我们需要重新定义起始单元格
然后程序就会继续循环下去
因为C3单元格和D4单元格不同,故而不会执行合并,同时再次定义新的起始单元格,也就是D4单元格

D4单元格和后面的E4单元格内容相同,就可以再次执行合并操作了。
最终就得到了我们看到的 效果了。

