前景提要

前面我们分好几节讲述了一些关于合并单元格的VBA知识,涉及单元格的合并,拆分合并单元格等,但是其实在日常的工作中,我并不是建议过多的使用合并单元格,因为他有很多的局限性,在利用VBA处理合并单元格的时候,大家应该已经有所感触,比方说在我们上节拆分合并单元格并填充的时候,拆分之后的单元格a和合并之前的a是完全不同的两个单元格,今天我们再说一个场景,是合并单元格在筛选的时候碰到的问题

场景说明

合并单元格能用公式吗_excel合并单元格不能用_合并单元格excel

这里我们简单的构造一个模拟数据,从上面的数据中我们可以看到A1有两行,但是已经执行了单元格合并操作,我们来看看在这样的情况,常规的筛选只有会有什么

对比的筛选下,我们可以看到没有合并的单元格A2筛选之后能够准确的显示2行数据

合并单元格能用公式吗_excel合并单元格不能用_合并单元格excel

但是已经操作合并单元格的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

来看看代码实现的效果

合并单元格excel_excel合并单元格不能用_合并单元格能用公式吗

代码解析

要想知道今天代码如何实现的,至少我们需要知道,这样处理的思路逻辑

常规的合并单元格,在执行筛选之后,肯定是没有办法显示全部数据的,那么今天的代码是如何实现的?

我们把代码拆开来,一步步执行看下

合并单元格能用公式吗_合并单元格excel_excel合并单元格不能用

从上面的GIF,我们可以看到代码是增加了一个辅助列,然后将含有合并单元格的区域,全部复制到右边,即刚刚插入的单元格中了

这一部分的操作就比较好理解,没有什么难点

我们继续往下执行

合并单元格excel_excel合并单元格不能用_合并单元格能用公式吗

看起来后面的代码虽然比较复杂,但是也没有执行任何的操作,除了操作单元格的取消合并之外,好像并没有什么动作,那么为什么代码执行合并后的单元格又可以进行筛选呢?

我们来看看关键的代码部分

.(0, -1). Paste:=, :=, _

:=False, :=False

这里其实是一个格式化的操作

将右边的合并单元格的格式,复制给左边,我们刚刚通过代码取消合并的单元格,这样单元格虽然有了合并单元格的格式,但是实际上他的本质是三个并没有合并的单元格

我们这里将代码优化过的单元格复制到其他的单元格看看

excel合并单元格不能用_合并单元格excel_合并单元格能用公式吗

很明显,单元格其实并没有合并,是分开的三个单元格,但是单元格样式上,却是合并单元格的样式,这就是我们利用VBA代码优化合并单元格的精髓所在

excel合并单元格不能用_合并单元格excel_合并单元格能用公式吗

然后再来执行筛选,就非常的轻松了,也不会有任何的问题了。

参与评论