相同数据合并单元格,一“点”到位
相同数据合并单元格,一“点”到位
点击上方“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,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。
因为近期加群人员太杂,需要入群的小伙伴可以先加我微信,备注“加群”我会拉进群,不备注,不加的哦~~