相同数据合并单元格,一“点”到位点击上方“Excel和VBA”,选择“置顶公众号” 致力于原创分享Excel的相关知识,源码,源文件打包提供 一起学习,一起进步~~ 合并单元格的操作,相信在大家日常的工作中会经常使用到,比方说相同数据合并单元格,或者纯粹为了表格样式的美观而选择合并单元格等等,单元格的合并操作,在Excel中也很简单,直接选中单元格之后,按下合并单元格的按钮就可以实现了。 虽然简单,实际中的一些缺点也是存在的,比方说一次只能合并一个相同内容,如果你有多个不同的数据需要合并单元格的话,那么可能就需要重重复复的操作很多次,非常的不方便。今天就来和大家介绍下用VBA来实现这个大批量的相同数据的单元合并的操作 场景说明这是我们今天模拟的操作数据,我们现在希望将相同的姓名执行合并单元格的操作,这样方便其他人阅读,这里有5个同学,其中A4因为种种原因只参加一门考试,所以在合并的过程中,A4所在的行又是不用合并的,这样如果纯粹用Excel自带的合并单元格操作的话,就会比较的麻烦,至少需要重复5次操作,其中还包括选择单元格,如果表格更加大,数据更加的负责的话,就很浪费时间了,所以我们今天来看看VBA如何快速实现合并。 代码区Sub TEST() Dim rng As Range, a As Range, rng1 As Range, s$, fisrrng As Range Application.DisplayAlerts = False Set rng = Application.InputBox("请选择合并的区域", "合并相同内容", , , , , , 8) Set fisrrng = rng(1) Set rng1 = rng.Offset(1, 0) For Each a In rng1 s = fisrrng.Value If a.Value <> s Then Range(a.Offset(-1, 0), fisrrng).Merge Set fisrrng = a End If Next a Application.DisplayAlerts = True End Sub 代码并不算是太难,关键是要理解代码中的逻辑,我们先来看看代码实现的效果 从结果上来看,我们很好的实现了我们的目的和效果 代码解析既然已经实现了我们想要的效果,那么现在大家最想要知道的就是代码实现的过程了。 其实在之前的讲解中,我也说过很多次,VBA实现的逻辑其实就是我们手工操作中的各种逻辑,我们只要知道自己的操作方式,稍加转换,切到VBA的代码中区,就可以实现了,来具体看看 Set rng = Application.InputBox("请选择合并的区域", "合并相同内容", , , , , , 8) 这里我们先要选择我们需要操作的单元格区域,这里非常的简单,利用一个InputBox的方法,就可以实现一个简单的交互了,最终得到的结果,我们赋值给变量rng 有了rng这个区域之后,我们就可以进行合并操作了,那么是随便操作合并嘛?肯定不是的,我们需要和上面一个单元格进行对照,是相同内容的话,才会执行合并操作。 那么这里的重点来了,上面一个单元格,在vba进行循环判断的过程中,如何体现这个上面一个单元格呢? 这里我们换一个角度,切换成为第一个单元格,如果和第一个单元格不同,那就是不同的内容不需要合并,如何和第一个单元格内容相同,那就是需要合并的。 这里我们已A1来举例,第二行的A1是第一个单元格,那么后面第三行和第四行的 A1分别于第二行的 A1相比较,是相同的,那么这几行就是需要操作合并的单元格 到了第五行的时候,我们发现A2并不等于 A1,那么到这里为止,前面的2,3,4都是需要合并的单元格,而第5行开始不需要和上面的单元格合并了。 那么这里就可以理解我们的代码的作用了。 Set fisrrng = rng(1) 实现的作用就是讲第一个单元格赋值给fisrrng这个变量 有了这个变量之后,我们就可以将其他的单元格和fisrrng进行比较了。 Set rng1 = rng.Offset(1, 0) For Each a In rng1 s = fisrrng.Value If a.Value <> s Then .......... End If Next a 大家可能会疑惑,这里为什么又有rng1呢? 因为上面我们既然已经选择了fisrrng,那么在后面的数据区域自然是不用包含这个fisrrng了,所以是将我们选择的整个单元格向下移动一行,这里使用到了offset,他的用法和函数offset是一样的。 在循环中,如果a的内容和fisrrng是相同的,那么就跳过,继续往下走,如果不一样,那就代表我们已经找到一个分水岭了。 For Each a In rng1 s = fisrrng.Value If a.Value <> s Then Range(a.Offset(-1, 0), fisrrng).Merge'执行单元格的合并 Set fisrrng = a'重新设置第一个单元格对象 End If Next a 这里执行的就是单元格合并,同样的,这里也是使用到了offset方法,不同的是这里是往上移动一行 这里不要忘记,因为上面一个循环结束之后,我们需要重新设置firstrng所对应的单元格内容。切记 不然的话,他永远都是和第一行的A1进行比较,会导致后面所有的操作都出错的。 ========================== 好了,明晚21:00,准时再见! 因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。 因为近期加群人员太杂,需要入群的小伙伴可以先加我微信,备注“加群”我会拉进群,不备注,不加的哦~~ |
|