需要帮助优化我的excel宏以删除空白行或执行其他操作

时间:2014-07-01 01:05:02

标签: excel vba excel-vba

基本上我想要完成的是搜索文档中的空白行并删除它们(如果有的话)。如果要删除空白行,这很有用;但是,如果没有空行,则宏以错误结束。如果有人能告诉我如何将其变成“如果空白行,那么如果没有,那么我会永远感激”

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

输入我的第二个宏(这部分工作正常)

此致

1 个答案:

答案 0 :(得分:1)

让我指出规范:

How to avoid using Select/Activate in Excel VBA macros

因此,您可以开始了解当前代码失败或执行不需要的操作的原因。如果您的选择中没有空白单元格,会发生什么?你会收到一个错误。为什么呢?

因为在这种情况下,Selection.SpecialCells(xlCellTypeBlanks)评估为Nothing。 (您可以使用一些调试语句验证这一点)并且由于Nothing没有任何属性或方法,您将收到错误,因为您真的在说:

Nothing.Select

哪个是null程序,不是grok,不计算等等。

所以,你需要用这样的东西测试虚无:

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的后续引用都会反映出这种变化。