Excel VBA 8.17合并单元格无法筛选? 不不不!让VBA来优化下合并单元格
合并单元格无法筛选?不不不!让VBA来优化下合并单元格
点击上方“Excel和VBA”,选择“置顶公众号”
致力于原创分享Excel的相关知识,源码,源文件打包提供
一起学习,一起进步~~
前景提要
前面我们分好几节讲述了一些关于合并单元格的VBA知识,涉及单元格的合并,拆分合并单元格等,但是其实在日常的工作中,我并不是建议过多的使用合并单元格,因为他有很多的局限性,在利用VBA处理合并单元格的时候,大家应该已经有所感触,比方说在我们上节拆分合并单元格并填充的时候,拆分之后的单元格a和合并之前的a是完全不同的两个单元格,今天我们再说一个场景,是合并单元格在筛选的时候碰到的问题
场景说明
这里我们简单的构造一个模拟数据,从上面的数据中我们可以看到A1有两行,但是已经执行了单元格合并操作,我们来看看在这样的情况,常规的筛选只有会有什么
对比的筛选下,我们可以看到没有合并的单元格A2筛选之后能够准确的显示2行数据
但是已经操作合并单元格的A1,在执行筛选之后,就剩下简单的一行,这会造成明显的数据缺失
这也是我前面说并不提倡大家过多使用合并单元格的原因。
但是有时候是其他同事发给我们的表格,我们没有办法取消合并了,毕竟可能会涉及格式等方面的变动,那么在这样的情况下,我们要如何在不改变合并单元格的情况下,又可以准确的筛选数据呢?
代码区
Sub hb()
Dim rng As Range, a As Range, i&, sth As Worksheet, sth1 As Worksheet
Set sth = ActiveSheet
Set rng = Application.InputBox("请选择存在单元格的区域", "单元格的处理", , , , , , 8)
For Each a In rng
If a.MergeCells = False Then
MsgBox "当前选取存在非合并单元格,无法执行操作"
Exit Sub
End If
Next a
numr = rng.Rows.Count
rowss = rng.Row
colunmss = rng.Column
Columns(colunmss + 1).Insert
rng.Select
Selection.Copy Selection.Offset(0, 1)
rng.Select
Selection.UnMerge
Selection.SpecialCells(xlCellTypeBlanks).Select
For Each a In Selection
a.FormulaArray = "=R[-1]C"
Next a
Range(Cells(rowss, colunmss + 1), Cells(rowss + numr - 1, colunmss + 1)).Select
Selection.Copy
Selection.Offset(0, -1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Columns(colunmss + 1).Delete
End Sub
来看看代码实现的效果
代码解析
要想知道今天代码如何实现的,至少我们需要知道,这样处理的思路逻辑
常规的合并单元格,在执行筛选之后,肯定是没有办法显示全部数据的,那么今天的代码是如何实现的?
我们把代码拆开来,一步步执行看下
从上面的GIF,我们可以看到代码是增加了一个辅助列,然后将含有合并单元格的区域,全部复制到右边,即刚刚插入的单元格中了
这一部分的操作就比较好理解,没有什么难点
我们继续往下执行
看起来后面的代码虽然比较复杂,但是也没有执行任何的操作,除了操作单元格的取消合并之外,好像并没有什么动作,那么为什么代码执行合并后的单元格又可以进行筛选呢?
我们来看看关键的代码部分
Selection.Offset(0, -1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
这里其实是一个格式化的操作
将右边的合并单元格的格式,复制给左边,我们刚刚通过代码取消合并的单元格,这样单元格虽然有了合并单元格的格式,但是实际上他的本质是三个并没有合并的单元格
我们这里将代码优化过的单元格复制到其他的单元格看看
很明显,单元格其实并没有合并,是分开的三个单元格,但是单元格样式上,却是合并单元格的样式,这就是我们利用VBA代码优化合并单元格的精髓所在
然后再来执行筛选,就非常的轻松了,也不会有任何的问题了。
==========================
好了,明晚21:00,准时再见!
因为公众号没有留言功能(开的比较晚),所以建立一个线下微信群,主要为大家提供一个交流的平台,同时大家也可以提一些对公众号的意见和看法,大家一起学习,一起进步。
因为近期加群人员太杂,需要入群的小伙伴可以先加我微信,备注“加群”我会拉进群,不备注,不加的哦~~