點(diǎn)擊上方“Excel和VBA”,選擇“置頂公眾號(hào)”
致力于原創(chuàng)分享Excel的相關(guān)知識(shí),源碼,源文件打包提供
一起學(xué)習(xí),一起進(jìn)步~~
前面我們分好幾節(jié)講述了一些關(guān)于合并單元格的VBA知識(shí),涉及單元格的合并,拆分合并單元格等,但是其實(shí)在日常的工作中,我并不是建議過多的使用合并單元格,因?yàn)樗泻芏嗟木窒扌?,在利用VBA處理合并單元格的時(shí)候,大家應(yīng)該已經(jīng)有所感觸,比方說在我們上節(jié)拆分合并單元格并填充的時(shí)候,拆分之后的單元格a和合并之前的a是完全不同的兩個(gè)單元格,今天我們?cè)僬f一個(gè)場(chǎng)景,是合并單元格在篩選的時(shí)候碰到的問題
這里我們簡(jiǎn)單的構(gòu)造一個(gè)模擬數(shù)據(jù),從上面的數(shù)據(jù)中我們可以看到A1有兩行,但是已經(jīng)執(zhí)行了單元格合并操作,我們來看看在這樣的情況,常規(guī)的篩選只有會(huì)有什么
對(duì)比的篩選下,我們可以看到?jīng)]有合并的單元格A2篩選之后能夠準(zhǔn)確的顯示2行數(shù)據(jù)
但是已經(jīng)操作合并單元格的A1,在執(zhí)行篩選之后,就剩下簡(jiǎn)單的一行,這會(huì)造成明顯的數(shù)據(jù)缺失
這也是我前面說并不提倡大家過多使用合并單元格的原因。
但是有時(shí)候是其他同事發(fā)給我們的表格,我們沒有辦法取消合并了,畢竟可能會(huì)涉及格式等方面的變動(dòng),那么在這樣的情況下,我們要如何在不改變合并單元格的情況下,又可以準(zhǔn)確的篩選數(shù)據(jù)呢?
Sub hb()
Dim rng As Range, a As Range, i&, sth As Worksheet, sth1 As Worksheet
Set sth = ActiveSheet
Set rng = Application.InputBox("請(qǐng)選擇存在單元格的區(qū)域", "單元格的處理", , , , , , 8)
For Each a In rng
If a.MergeCells = False Then
MsgBox "當(dāng)前選取存在非合并單元格,無法執(zhí)行操作"
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
來看看代碼實(shí)現(xiàn)的效果
要想知道今天代碼如何實(shí)現(xiàn)的,至少我們需要知道,這樣處理的思路邏輯
常規(guī)的合并單元格,在執(zhí)行篩選之后,肯定是沒有辦法顯示全部數(shù)據(jù)的,那么今天的代碼是如何實(shí)現(xiàn)的?
我們把代碼拆開來,一步步執(zhí)行看下
從上面的GIF,我們可以看到代碼是增加了一個(gè)輔助列,然后將含有合并單元格的區(qū)域,全部復(fù)制到右邊,即剛剛插入的單元格中了
這一部分的操作就比較好理解,沒有什么難點(diǎn)
我們繼續(xù)往下執(zhí)行
看起來后面的代碼雖然比較復(fù)雜,但是也沒有執(zhí)行任何的操作,除了操作單元格的取消合并之外,好像并沒有什么動(dòng)作,那么為什么代碼執(zhí)行合并后的單元格又可以進(jìn)行篩選呢?
我們來看看關(guān)鍵的代碼部分
Selection.Offset(0, -1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False
這里其實(shí)是一個(gè)格式化的操作
將右邊的合并單元格的格式,復(fù)制給左邊,我們剛剛通過代碼取消合并的單元格,這樣單元格雖然有了合并單元格的格式,但是實(shí)際上他的本質(zhì)是三個(gè)并沒有合并的單元格
我們這里將代碼優(yōu)化過的單元格復(fù)制到其他的單元格看看
很明顯,單元格其實(shí)并沒有合并,是分開的三個(gè)單元格,但是單元格樣式上,卻是合并單元格的樣式,這就是我們利用VBA代碼優(yōu)化合并單元格的精髓所在
然后再來執(zhí)行篩選,就非常的輕松了,也不會(huì)有任何的問題了。
==========================
好了,明晚21:00,準(zhǔn)時(shí)再見!
因?yàn)楣娞?hào)沒有留言功能(開的比較晚),所以建立一個(gè)線下微信群,主要為大家提供一個(gè)交流的平臺(tái),同時(shí)大家也可以提一些對(duì)公眾號(hào)的意見和看法,大家一起學(xué)習(xí),一起進(jìn)步。
因?yàn)榻诩尤喝藛T太雜,需要入群的小伙伴可以先加我微信,備注“加群”我會(huì)拉進(jìn)群,不備注,不加的哦~~
聯(lián)系客服