分享

相同数据合并单元格,一“点”到位

 Excel和VBA 2021-06-11

相同数据合并单元格,一“点”到位


点击上方“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 RangeApplication.DisplayAlerts = FalseSet 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 IfNext aApplication.DisplayAlerts = TrueEnd 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 IfNext 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 IfNext a

这里执行的就是单元格合并,同样的,这里也是使用到了offset方法,不同的是这里是往上移动一行

这里不要忘记,因为上面一个循环结束之后,我们需要重新设置firstrng所对应的单元格内容。切记

不然的话,他永远都是和第一行的A1进行比较,会导致后面所有的操作都出错的。

==========================

好了,明晚21:00,准时再见!

因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。

因为近期加群人员太杂,需要入群的小伙伴可以先加我微信,备注“加群”我会拉进群,不备注,不加的哦~~

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多