Vba 当多列中的单元格为空或0时,删除整行
我试图编写一个代码,它基本上会查看第13-33行,如果B-M列中的单元格都是空的,而a列不是空的,则会删除整行 我在下面编写的第一个代码仅在B列中的单元格为空时删除整行,但我需要B-M中的所有单元格为空才能删除整行Vba 当多列中的单元格为空或0时,删除整行,vba,excel,Vba,Excel,我试图编写一个代码,它基本上会查看第13-33行,如果B-M列中的单元格都是空的,而a列不是空的,则会删除整行 我在下面编写的第一个代码仅在B列中的单元格为空时删除整行,但我需要B-M中的所有单元格为空才能删除整行 Sub scheduleA() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Sheets("Schedule A Template").Select Dim R
Sub scheduleA()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Sheets("Schedule A Template").Select
Dim RowstoDelete As Long
x = 33
For RowstoDelete = Cells(x, 2).End(xlUp).Row To 13 Step -1
If (Cells(RowstoDelete, 2).Value = "0") And (Cells(RowstoDelete, 1).Value <> "") Then
Rows(RowstoDelete).Delete Shift:=xlUp
End If
Next RowstoDelete
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Sub scheduleA()
Application.ScreenUpdating=False
Application.Calculation=xlCalculationManual
图纸(“计划模板”)。选择
暗显行删除为长
x=33
对于RowstoDelete=单元格(x,2)。结束(xlUp)。行到13步骤-1
如果(单元格(RowstoDelete,2).Value=“0”)和(单元格(RowstoDelete,1).Value”“),则
行(RowstoDelete).删除移位:=xlUp
如果结束
下一行删除
Application.Calculation=xlCalculationAutomatic
Application.ScreenUpdating=True
端接头
我试着在下面的代码中以不同的方式编写它,但无法达到预期的效果
Sub DeleteRows()
Dim i As Integer
For i = 33 To 13 Step -1
If WorksheetFunction.CountA(Range("B" & i, "M" & i)) = 0 And WorksheetFunction.CountA(Range("A" & i)) <> "" Then
Rows(i).EntireRow.Delete
End If
Next i
End Sub
子删除行()
作为整数的Dim i
对于i=33至13,步骤-1
如果WorksheetFunction.CountA(范围(“B”和i,“M”和i))=0且WorksheetFunction.CountA(范围(“A”)和i))”,则
行(i).EntireRow.Delete
如果结束
接下来我
端接头
请帮忙 行删除的条件是:A列不为空,B列到M列为空。那么,像这样的事情应该会起作用:
Sub ScheduleA()
On Error GoTo errHandler
Const TOP_ROW As Long = 13
Const BOTTOM_ROW As Long = 33
Dim rowIndex As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With ThisWorkbook.Worksheets("Schedule A Template")
For rowIndex = .Cells(BOTTOM_ROW, "A").End(xlUp).Row To TOP_ROW Step -1
If Not IsEmpty(.Cells(rowIndex, "A").Value2) Then '...column A is not blank.
If Application.WorksheetFunction.CountA(.Range(.Cells(rowIndex, "B"), .Cells(rowIndex, "M"))) = 0 Then '...all cells on row rowIndex from columns B to M are blank.
.Rows(rowIndex).Delete Shift:=xlUp
End If
End If
Next
End With
Cleanup:
On Error Resume Next
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub
errHandler:
MsgBox Err.Description, vbExclamation + vbOKOnly, "Error"
Resume Cleanup
End Sub
请注意,.Select
已消失;你几乎不需要选择任何东西来完成工作。不依赖选择将使代码更加健壮。在上面的代码中,With
块告诉其中的代码,每当表达式以句点(例如.Cells
)开头时,就引用目标工作表
此外,当关闭屏幕更新
和计算
时,系统地包括错误处理以重新打开它们。这样,如果出现问题,您的代码将不会使Excel处于不受欢迎的状态
最后,您可以在“属性”窗口中工作表的(名称)属性下,直接使用工作表的代码名(从VBA编辑器中可以看到),而不是通过其选项卡的名称(从Excel中看到)来引用工作表(按Ctrl+R以显示项目资源管理器,单击Microsoft Excel对象节点下的工作表,然后按F4以显示属性窗口)。您可以更改此值;我通常会将其更改为shtScheduleATemplate。然后,With
行可以重新写入:
With shtScheduleATemplate
…即使您从Excel更改了工作表的名称,它仍然有效
编辑:在您的问题代码中,您在确定从哪一行下线索引开始循环时正在检查B列。但是,这样做可能会遗漏一些应该删除的行。我已将答案改为在A列中检查:
For rowIndex = .Cells(BOTTOM_ROW, "A").End(xlUp).Row To TOP_ROW Step -1
不要使用
和工作表function.CountA(范围(“A”和i))“
只需执行和范围(“A”和i)”
感谢您提供了一个解决方案来限定父工作表!@Excelosaurus感谢您的帮助,但当我运行此宏时,我收到一条错误消息。。但是出现的对话框是空白的,没有任何内容。知道为什么会发生这种情况吗?非常糟糕。在“清理”部分的末尾添加“退出”子项。我已编辑了我的答案。@Excelosaurus感谢您的回复。所以这仍然没有删除行…但可能是因为这些单元格基于公式吗?例如,B-M行中的单元格从另一个工作表中提取。如果是“0”在另一张工作表中,此工作表上的单元格将为0,我想将其删除。现在,此代码将删除B-M列中所有单元格为空且不基于公式的行。CountA
对包含公式的单元格进行计数。只需修改最内层的If
以满足您的需要。如果值全部为空,或全部为positive或全部负数,您可以使用Sum(…)=0
作为删除条件(如果存在正数和负数的混合,您将面临获得零和的风险)。如果条件更复杂,则可以添加最内部的循环来扫描行的单元格。还可以在工作表中放置公式,例如在第N列,该公式将用VBA中检查的值标记要删除的行。