簡體   English   中英

需要幫助完善我的Excel宏以刪除空白行或執行其他操作

[英]Need help refining my excel macro for deleting blank rows or performing another action

基本上,我要完成的工作是在文檔中搜索空白行並將其刪除(如果有)。 如果有空白行要刪除,這將非常有用; 但是,如果沒有空白行,則宏以錯誤結尾。 如果有人可以建議我如何將其變成“如果是空白行,那么,如果沒有,則那個”,我將不勝感激。

Sheets ("xml") .Select
Cells.Select
Selection.SpecialCells(x1CellTypeBlanks).Select
Selection.EntireRow.Delete

輸入我的第二個宏(這部分工作正常)

問候

讓我為您指出規范:

如何避免在Excel VBA宏中使用選擇/激活

因此,您可以開始理解為什么當前代碼失敗或執行不希望的操作。 如果選擇中沒有空白單元格 ,會發生什么情況? 您會得到一個錯誤。 為什么?

因為在這種情況下, Selection.SpecialCells(xlCellTypeBlanks)計算結果為Nothing (您可以使用一些調試語句來驗證這一點)並且由於Nothing沒有任何屬性或方法,您會得到一個錯誤,因為您實際上是在說:

Nothing.Select

這是一個空程序,不運行,不計算,等等。

因此,您需要使用以下方法測試虛無:

Sheets("xml").Select
Cells.Select
If Not Selection.SpecialCells(x1CellTypeBlanks) Is Nothing Then 
    Selection.SpecialCells(x1CellTypeBlanks).EntireRow.Delete
End If

我仍然建議不惜一切代價避免使用Select (約99%的時間是多余的,並且會產生難以調試和維護的草率代碼)。

因此,您可以按照以下思路做一些更完整的事情:

Dim blankCells as Range  '## Use a range variable.

'## Assign to your variable:
Set blankCells = Sheets("xml").Cells.SpecialCells(xlCellTypeBlanks)

'## check for nothingness, delete if needed:
If Not blankCells Is Nothing then blankCells.EntireRow.Delete

評論的跟進

因此,在VBA我們能夠宣布代表對象或數據/值的變量 ,很像一個方程中的數學變量。

Range是Excel對象模型的對象部分的一種類型,由Workbook / Worksheets / Cells / Ranges / etc組成。 (遠遠超出我希望在這里傳達給您的范圍)

http://msdn.microsoft.com/en-us/library/office/ff846392(v=office.14).aspx

如果向下滾動到“為什么使用變量”部分,則可能是一個使用變量的好例子。

http://www.ozgrid.com/VBA/variables.htm

這當然很簡單...但是讀者的摘要版本是變量允許我們重復引用相同的對象(或sipmle數據類型的值),而無需每次都明確引用它。

還有一個方便的副作用,當我們使用變量而不是絕對引用時,代碼變得更易於閱讀,維護和調試:

Dim rng as Range

Set rng = Sheets(1).Range("A1:Q543").Resize(Application.WorksheetFunction.CountA(Sheets(1).Range("A:A"),))

想象一下,相當(但不是很荒謬)復雜的范圍構造。 如果您需要在代碼中多次引用該范圍,則不將其分配給變量是很愚蠢的,除非是出於其他原因(除了避免鍵入錯誤)(否則可能會混淆其中的一部分)。 這也很容易維護,因為您只需要修改一個賦值語句,並且隨后對rng所有引用都將反映該更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM