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 WorksheetSet sth = ActiveSheetSet rng = Application.InputBox("请选择存在单元格的区域", "单元格的处理", , , , , , 8)For Each a In rng    If a.MergeCells = False Then        MsgBox "当前选取存在非合并单元格,无法执行操作"        Exit Sub    End IfNext anumr = rng.Rows.Countrowss = rng.Rowcolunmss = rng.ColumnColumns(colunmss + 1).Insertrng.SelectSelection.Copy Selection.Offset(0, 1)rng.SelectSelection.UnMergeSelection.SpecialCells(xlCellTypeBlanks).SelectFor Each a In Selection    a.FormulaArray = "=R[-1]C"Next aRange(Cells(rowss, colunmss + 1), Cells(rowss + numr - 1, colunmss + 1)).SelectSelection.CopySelection.Offset(0, -1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _        SkipBlanks:=False, Transpose:=FalseApplication.CutCopyMode = FalseColumns(colunmss + 1).Delete        End Sub

来看看代码实现的效果

代码解析

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

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

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

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

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

我们继续往下执行

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

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

Selection.Offset(0, -1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False

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

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

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

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

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

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

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

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

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

(0)

相关推荐