2015-10-15 126 views
0

我是新来的VBA excel,我坚持一个小问题。我有一个数据列表,我有两个任务要完成。运行时错误91对象变量或块变量未设置

第一个将删除J列中任何等于0的值的行;

第二部分:我想遍历剩余的行并删除I列中的值大于值J列中的任何行。

不过,我发现了以下错误:VBA运行时错误91对象变量或带块变量未设置

这是各国行:

For rw = .Cells(rows.Count, "E").End(xlUp).Row To 2 Step -1 

完整的代码

Private Sub clearupdata_Click() 

Dim rows As Range, OSQty As Range, value As Long, rw As Long 

Set OSQty = Range("j2") 

Do Until OSQty.value = "" 
    value = Val(OSQty.value) 
    If (value = 0) Then 
     If rows Is Nothing Then 
      Set rows = OSQty.EntireRow 
     Else 
      Set rows = Union(OSQty.EntireRow, rows) 
     End If 
    End If 
    Set OSQty = OSQty.Offset(1) 
Loop 

If Not rows Is Nothing Then rows.Delete 

With Worksheets(1) '<~~ worksheet ~~> 
    For rw = .Cells(rows.Count, "E").End(xlUp).Row To 2 Step -1 
     If .Cells(rw, "I").Value2 > .Cells(rw, "J").Value2 Then 
      .rows(rw).EntireRow.Delete 
     End If 
    Next rw 
End With 

End Sub 
+1

使用'rows'作为一个Range对象变量名是不是一个好主意因为barrowc表示已经在应用程序,工作表和范围对象 – barrowc

+0

上定义了'Rows'属性,rows.count可能会认为它是名为rows的范围变量。我尝试重命名它的工作范围 –

回答

1

只是改变:

For rw = .Cells(rows.Count, "E").End(xlUp).Row To 2 Step -1 

For rw = .Cells(.rows.Count, "E").End(xlUp).Row To 2 Step -1 

不同的是,当你从不同的表中rows.count不是在同一张纸上,因此跌倒在调用该函数。

+0

解决方案没问题,但解释应该稍有不同。它与不同的表单无关,'rows.count'没有点将永远不会工作,因为'.Rows'是'Sheet'类的一个方法,并且总是必须以该类的对象为前缀。 – mielk

+0

够公平的。我真的认为,如果没有指定这种情况下的工作表,默认情况下需要'activesheet',并且我认为它会正常运行,而我刚刚检查过它没有。 – Raugmor

0
Dim rows2 As Range 

不会.Cells(.rows.Count, "E").End(xlUp).Row后来妥协,

因为rows.count会引发错误,+1 barrowc

相关问题