下标超出VBA范围

时间:2017-12-04 12:45:55

标签: excel vba excel-vba

我正在写我的第一个VBA。我有一张名为Sheet1的表格。该表格有一列E;我想删除列E上有空字段的所有行。

因此,我写了这段代码:

Sub EmptyCells()
   Sheets("Sheet1").Columns("E:E").SpecialCells(xlBlanks).EntireRow.Delete
End Sub

然而,当我运行它时,我收到此错误:

  

下标超出范围

为什么会出现此错误?我确信E中的列Sheet1已存在。我的推荐不正确吗?

修改

如果我尝试Columns("E")Range("E:E"),而不是Columns("E:E"),我会收到同样的错误

3 个答案:

答案 0 :(得分:2)

如果列 E 在UsedRange 中)中有任何REAL空单元格,则您的代码将有效。

您的单元格可能包含返回 Null 的公式。 SpecialCells并不认为它们是空的。您可以将 E 列中的单元格包含 Null 作为常量; SpecialCells也认为它们已被填满。

修改#1:

根据您的具体错误消息确保工作表名称拼写正确Sheet1Sheet 1

不同

答案 1 :(得分:1)

我试过这个并且有效:

Option Explicit
Sub TetsMe()
    MsgBox (Worksheets(1).Parent.Name & VbCrLf & Worksheets(1).Name)
    Worksheets(1).Columns("E:E").SpecialCells(xlBlanks).EntireRow.Delete
End Sub

作为索引的不同语法可以引用不同的表。在这种情况下,Worksheets(1)是工作簿中的第一个工作表。

MsgBox()将告诉您正在更改哪个工作表和哪个工作簿。一旦你知道,你在做什么,你可以删除它。

如果问题出在工作簿名称中,则可以很容易地将其更改为:

With Workbooks("NameYourWorkbook").Worksheets("NameYourWorksheet")
    .Columns("E:E").SpecialCells(xlBlanks).EntireRow.Delete
End With

答案 2 :(得分:1)

如果您有一张名为/标题Sheet1的表单,您的代码就可以使用。

Sub EmptyCells()
   Sheets("Sheet1").Columns("E:E").SpecialCells(xlBlanks).EntireRow.Delete
End Sub

请注意,有不同的方式来调用工作表。

Sheets("Sheet1") 'means the visible name of the sheet is `Sheet1` (not the same as VBA name)
                 'the number doesn't tell anything about it's position, it's just a name.

Sheet1           'means the VBA name of the sheet.
                 'the number doesn't tell anything about it's position, it's just a name.

Worksheets(1)    'means the first worksheet (which ever is in the first position)

Sheets(1)        'means the first sheet (can also be a chart not only a worksheet)
                 'this has no relation to its name which could be "Sheet5"
                 '(If "Sheet5" is in first position).