不得不說,你這個問題有點難,其實也不是難,是惡心。對于一般的沒有VBA基礎(chǔ)的人,處理這個問題就是通過一步步繁復(fù)的操作來實現(xiàn)。
如果說通過篩選去找,數(shù)據(jù)量大的話,這個事無疑會惡心死人。
我看這個問題在這有一段時間了,但是也沒人給出靠譜的回答,所以特地寫了一段代碼。經(jīng)測試,完全沒有問題。
而且,這個問題提的也很模糊,不太方便給出針對性的做法
表格中標記的顏色是統(tǒng)一的顏色還是有多種不同的顏色
表格中被標記顏色的地方是對數(shù)據(jù)區(qū)域整行標記還是僅對單元格標記
問題中所提到的匯總表和明細表是不是在同一個工作簿中
刪除標記顏色以外的表格是單元格刪除還是整行、整列、或者整sheet刪除
有標記顏色但是空白單元格怎么處理
大概有多少的sheet需要處理,有沒有無標記顏色的sheet,有沒有空白sheet
如果是刪除標記顏色以外的單元格,那么如果出現(xiàn)空白行或列,要不要一并刪除
以上情況都是編寫VBA代碼需要考慮的地方
我這里呢,根據(jù)給出的模糊問題,簡單的寫了一個大概能用的宏命令
假設(shè)所有表格是在同一個工作簿中
統(tǒng)計出一共有多少個工作博,用于做循環(huán)查詢
找出每個sheet中沒有被標記顏色的單元格,并清除單元格格式及內(nèi)容
如果有未標記顏色且無任何單元格內(nèi)容的表格,則給出提示,并結(jié)束循環(huán)
如果需要刪除內(nèi)容之前的空白行或列,則刪除整行、整列
下圖是我做的實例,有三個Sheet表,每個表格中存在標注了顏色的行,或單元格:
Sheet1,標題行標注顏色,數(shù)據(jù)中整行包含不同顏色
Sheet2,標題行標注顏色,數(shù)據(jù)中非整行包含不同顏色
Sheet3,標題行未標注顏色,數(shù)據(jù)中非整行包含不同顏色
VBA編輯器打開方法,快捷鍵:Alt+F11,工程區(qū),插入,模塊
VBA代碼圖示(源碼占用篇幅較大,我放到最后了):
其中
Sub Clear():用于清除未標注顏色的非空單元格
Sub DeleteEmptyRows():用于刪除空行
Sub DeleteEmptyColumns():用于刪除空列
代碼執(zhí)行過程中,只執(zhí)行一個工程,但通過Sub Clear()工程,調(diào)用了Sub DeleteEmptyRows()和Sub DeleteEmptyColumns()
我們來看一下執(zhí)行代碼的效果:
代碼執(zhí)行時,為了看效果,我屏蔽了兩條返回sheet1的代碼
從動圖可以看到,代碼執(zhí)行的很快,也達到了我們的目
清楚了所有未標記顏色的單元格
清楚了數(shù)據(jù)中的冗余空行
我再一步一步執(zhí)行代碼,給大家看一下Excel都干了些什么(由于多個sheet處理機制一樣,這里只錄制了兩個sheet的處理過程慢放):
通過慢放,大家應(yīng)該能看出,代碼真的是很蠢的,它也是一個一個的單元格去刪除,然后再去刪除行。
需要注意的是,如果表格中存在空的sheet,vba會給出一個提示,如果空表夾雜在有數(shù)據(jù)的表格中間,那么代碼運行到空表的時候會退出,直接給出提示,不再向下運行。
提示如下:
sheet4為一個空的表格
對于宏,你也可以再Excel中插入一個控件,指定到所編寫的宏,之后,點擊控件即可執(zhí)行宏了。操作方法如下:
ok,就這么多吧,代碼我寫在下邊了,沒有寫注釋,如果有感興趣的朋友可以自己去研究優(yōu)化一下,或者有什么疑問,評論或私信聯(lián)系我即可:
橫線中間為VBA代碼:
--------------------------------------
Sub Clear()
Dim rng As Range, i As Integer
For i = 1 To ActiveWorkbook.Worksheets.Count
ActiveWorkbook.Worksheets(i).Select
For Each rng In ActiveSheet.UsedRange.SpecialCells(2)
On Error GoTo Skip
If rng.Interior.ColorIndex = xlNone Then
rng.Clear
End If
Next
Call DeleteEmptyRows
Call DeleteEmptyColumns
Next
ActiveWorkbook.Worksheets(1).Select
Exit Sub
Skip:
ActiveWorkbook.Worksheets(1).Select
MsgBox '已經(jīng)沒有未標記顏色的非空單元格'
End Sub
Sub DeleteEmptyRows()
Dim LastRow As Integer, r As Integer
LastRow = ActiveSheet.UsedRange.Rows.Count
LastRow = LastRow + ActiveSheet.UsedRange.Row - 1
For r = LastRow To 1 Step -1
If WorksheetFunction.CountA(Rows(r)) = 0 Then
Rows(r).Delete
End If
Next r
End Sub
Sub DeleteEmptyColumns()
Dim LastColumn As Integer, c As Integer
LastColumn = ActiveSheet.UsedRange.Columns.Count
LastColumn = LastColumn + ActiveSheet.UsedRange.Column
For c = LastColumn To 1 Step -1
If WorksheetFunction.CountA(Columns(c)) = 0 Then
Columns(c).Delete
End If
Next c
End Sub
--------------------------------------
聯(lián)系客服