Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 当多列中的单元格为空或0时,删除整行_Vba_Excel - Fatal编程技术网

Vba 当多列中的单元格为空或0时,删除整行

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

我试图编写一个代码,它基本上会查看第13-33行,如果B-M列中的单元格都是空的,而a列不是空的,则会删除整行

我在下面编写的第一个代码仅在B列中的单元格为空时删除整行,但我需要B-M中的所有单元格为空才能删除整行

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中检查的值标记要删除的行。