2017-05-04 227 views
1

我一直在使用IF条件来查找电子表格中的空白单元格,然后删除我不想要的部分并将其他单元格向上移动。它进展顺利,但是当我使用这个数据库时,代码不会删除一些行。VBA不删除空白单元

这里是下面的部分在那里找到并删除该行的一部分:

Dim wb As Workbook 
Dim Disciplinas As Worksheet 
Set wb = ThisWorkbook 
Set Disciplinas = wb.Sheets("Disciplinas") 

Dim start_time As range 
Dim i As Integer, nLines As Integer 

nLines = Disciplinas.Cells(Rows.Count, 2).End(xlUp).Row 

Set start_time = Disciplinas.Rows(1).Find(what:="HR_INICIO", LookIn:=xlValues, lookat:=xlWhole) 

For i = 2 To nLines 
    If Disciplinas.Cells(i, start_time.Column) = "" Then 
     Disciplinas.Cells(i, 2).Resize(, 13).Delete Shift:=xlUp 
    End If 
Next 

这里是文件:Spreadsheet(我有麻烦的细胞E105 E125到其他的人已经。在我第一次运行代码时被删除)。

而不是If Disciplinas.Cells(i, start_time.Column) = "" Then我试过vbNullStringisEmpty() = TRUE,其中他们都没有删除行。我直接在电子表格中使用公式=ISBLANK(),结果是真实的。

我注意到,如果我多次运行代码,最终会删除所有我想要的行。我问自己为什么它不能在第一次运行中将其全部清除?谢谢。

+5

建议:尝试向后运行循环:'For i = nLines to 2 Step -1'。 – paulsm4

+3

解释是:假设你有10行(编号从1到10),你删除第2行,然后第3到10行向上移动一个并成为第2行到第9行(第3行成为第2行,第4行成为第3行,... )。所以这些行改变了他们的立场。 **但现在'我'增量,你走一条线**,但它不应该因为下一行已经成为*当前*线,这就是为什么我们错过了这条线。如果从最后开始,那么行向下移动并不重要,因为我们向上走。 –

+0

@裴,那么你解释后似乎很简单。谢谢! – jf8769

回答

0

解决方案确实非常简单,只需要按照paulsm4的建议反向运行环路。我不得不为For i = nLines to 2 Step -1更改For i = 2 To nLines

解释是,当VBA删除该行并将其向上移动时,计数器递增并向下一行,“丢失”一些行,如Peh解释的那样。