前景提要
前面我们分好几节讲述了一些关于合并单元格的VBA知识,涉及单元格的合并,拆分合并单元格等,但是其实在日常的工作中,我并不是建议过多的使用合并单元格,因为他有很多的局限性,在利用VBA处理合并单元格的时候,大家应该已经有所感触,比方说在我们上节拆分合并单元格并填充的时候,拆分之后的单元格a和合并之前的a是完全不同的两个单元格,今天我们再说一个场景,是合并单元格在筛选的时候碰到的问题
场景说明
这里我们简单的构造一个模拟数据,从上面的数据中我们可以看到A1有两行,但是已经执行了单元格合并操作,我们来看看在这样的情况,常规的筛选只有会有什么
对比的筛选下,我们可以看到没有合并的单元格A2筛选之后能够准确的显示2行数据
但是已经操作合并单元格的A1,在执行筛选之后,就剩下简单的一行,这会造成明显的数据缺失
这也是我前面说并不提倡大家过多使用合并单元格的原因。
但是有时候是其他同事发给我们的表格,我们没有办法取消合并了,毕竟可能会涉及格式等方面的变动,那么在这样的情况下,我们要如何在不改变合并单元格的情况下,又可以准确的筛选数据呢?
代码区
Sub hb()
Dim rng As Range, a As Range, i&, sth As , sth1 As
Set sth =
Set rng = .("请选择存在单元格的区域", "单元格的处理", , , , , , 8)
For Each a In rng
If a. = False Then
"当前选取存在非合并单元格,无法执行操作"
Exit Sub
End If
Next a
numr = rng.Rows.Count
rowss = rng.Row
= rng.
( + 1).
rng.
.Copy .(0, 1)
rng.
.
.().
For Each a In
a. = "=R[-1]C"
Next a
Range(Cells(rowss, + 1), Cells(rowss + numr - 1, + 1)).
.Copy
.(0, -1). Paste:=, :=, _
:=False, :=False
. = False
( + 1).
End Sub
来看看代码实现的效果
代码解析
要想知道今天代码如何实现的,至少我们需要知道,这样处理的思路逻辑
常规的合并单元格,在执行筛选之后,肯定是没有办法显示全部数据的,那么今天的代码是如何实现的?
我们把代码拆开来,一步步执行看下
从上面的GIF,我们可以看到代码是增加了一个辅助列,然后将含有合并单元格的区域,全部复制到右边,即刚刚插入的单元格中了
这一部分的操作就比较好理解,没有什么难点
我们继续往下执行
看起来后面的代码虽然比较复杂,但是也没有执行任何的操作,除了操作单元格的取消合并之外,好像并没有什么动作,那么为什么代码执行合并后的单元格又可以进行筛选呢?
我们来看看关键的代码部分
.(0, -1). Paste:=, :=, _
:=False, :=False
这里其实是一个格式化的操作
将右边的合并单元格的格式,复制给左边,我们刚刚通过代码取消合并的单元格,这样单元格虽然有了合并单元格的格式,但是实际上他的本质是三个并没有合并的单元格
我们这里将代码优化过的单元格复制到其他的单元格看看
很明显,单元格其实并没有合并,是分开的三个单元格,但是单元格样式上,却是合并单元格的样式,这就是我们利用VBA代码优化合并单元格的精髓所在
然后再来执行筛选,就非常的轻松了,也不会有任何的问题了。
发表回复