如何删除VBA中先前或后续行为非空的空行

如何删除VBA中先前或后续行为非空的空行,vba,excel,Vba,Excel,我的工作表中有空行,我想删除它们,如果上面或下面的行不是空的,我就不想删除它们。我不想删除它们,因此在前面填充的行下面至少有一个空行 我知道如何删除工作表中的空行: Worksheets("Sheet1").Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 但我不知道如何改变这一点来实现这一点。需要一些关于如何做到这一点的指导 我的代码现在看起来像这样: For Each ws In Workbooks(newwb).

我的工作表中有空行,我想删除它们,如果上面或下面的行不是空的,我就不想删除它们。我不想删除它们,因此在前面填充的行下面至少有一个空行

我知道如何删除工作表中的空行:

Worksheets("Sheet1").Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
但我不知道如何改变这一点来实现这一点。需要一些关于如何做到这一点的指导

我的代码现在看起来像这样:

For Each ws In Workbooks(newwb).Sheets
    If (ws.Name <> "Sheet1") And (ws.Name <> "Sheet2") And (ws.Name <> "Sheet3") Then
        'ws.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
        lRow = ws.Range("A" & Rows.Count).End(xlUp).Row
        For i = 1 To lRow
            If Application.WorksheetFunction.CountA(ws.Range("A" & i & ":O" & i + 2)) = 0 Then
                If IsEmpty(rngBlanks) Then
                    Set rngBlanks = ws.Rows(i + 1)
                Else
                    Set rngBlanks = Union(rngBlanks, ws.Rows(i + 1))
                End If
            End If
        Next i
        rngBlanks.EntireRow.Delete
        Set rngBlanks = Nothing
    Else
        ws.Delete
    End If
Next
用于工作簿(newwb)中的每个ws.Sheets
如果(ws.Name“Sheet1”)和(ws.Name“Sheet2”)以及(ws.Name“Sheet3”),则
'ws.Columns(“A:A”).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
lRow=ws.Range(“A”&Rows.Count).End(xlUp).Row
对于i=1至lRow
如果Application.WorksheetFunction.CountA(ws.Range(“A”&i&“:O”&i+2))=0,则
如果是空的(rngBlanks),则
设置rngBlanks=ws.Rows(i+1)
其他的
设置rngBlanks=Union(rngBlanks,ws.Rows(i+1))
如果结束
如果结束
接下来我
rngBlanks.EntireRow.Delete
设置rngBlanks=Nothing
其他的
ws.Delete
如果结束
下一个
执行此操作时,它会给我一个运行时错误“5”:行
Set rngBlanks=Union(rngBlanks,ws.Rows(i+1))处的过程调用或参数无效。

似乎with中的每个都应该忽略第一个和最后一个单元格,并删除其余单元格

Dim a As Long, r As Long, rng As Range
With Worksheets("sheet1")
    With Intersect(.Columns(1), .UsedRange)
        With .SpecialCells(xlCellTypeBlanks)
            For a = 1 To .Areas.Count
                With .Areas(a)
                    For r = 2 To .Rows.Count - 1
                        If rng Is Nothing Then
                            Set rng = .Rows(r).Cells(1, 1)
                        Else
                            Set rng = Union(rng, .Rows(r).Cells(1, 1))
                        End If
                    Next r
                End With
            Next a
        End With
    End With
End With

'test with red fill
rng.Interior.Color = vbRed
'delete these after comfortable with debugging
'rng.EntireRow.Delete

我知道如何删除工作表中的空行:

Worksheets("Sheet1").Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
否。这是一种删除空行的错误方法,并且当您有多个列时,将不起作用。您可能需要查看。这一个使用循环和
Application.WorksheetFunction.CountA
。或者,您也可以使用
.Autofilter

但我不知道如何改变这一点来实现这一点。需要一些关于如何做到这一点的指导

使用与上面链接中我的答案相同的逻辑

    '~~> Loop through the rows to find which range is blank
    For i = 1 To lRow
        '~~> Checking 3 rows in one go
        If Application.WorksheetFunction.CountA(Range("A" & i & ":J" & i + 2)) = 0 Then
            If rngBlanks Is Nothing Then
                Set rngBlanks = .Rows(i + 1)
            Else
                Set rngBlanks = Union(rngBlanks, .Rows(i + 1))
            End If
        End If
    Next i
编辑

请试试这个(未测试)

另一种“公式”方法

选项显式
副标题()
长的
暗淡的颜色范围
将ws设置为工作表
对于工作簿(newwb)中的每个ws.Sheets
选择Case ws.Name
案例“第1张”、“第2张”、“第3张”
其他情况
与ws

Set colRng=.Columns(“A:O”)编辑了问题。遇到错误:运行时错误“5”:行集合rngBlanks=Union(rngBlanks,ws.Rows(i+1))处的过程调用或参数无效。我该如何解决这个问题?
Option Explicit

Sub main()
Dim ncols As Long
Dim colRng As Range
Dim ws As Worksheet

For Each ws In Workbooks(newwb).Sheets
    Select Case ws.Name
        Case "Sheet1", "Sheet2", "Sheet3"    
        Case Else
            With ws
                Set colRng = .Columns("A:O") '<= set the columns range you want to deal with
                ncols = colRng.Columns.Count
                With .Range("A1", .Cells(.Rows.Count, 1).End(xlUp)).Resize(, ncols).Offset(, ncols).Resize(, 1)
                    .FormulaR1C1 = "=IF(RC[-1]="""",IF(COUNTBLANK(indirect(""R["" & if(row()<2,1,-1) & ""]C[-" & ncols & "]"", False):R[1]C[-1])=" & 3 * ncols & ","""",1),1)"
                    .value = .value
                    .SpecialCells(xlCellTypeBlanks).EntireRow.Delete
                    .ClearContents
                End With
            End With
     End Select
Next ws

End Sub