如何删除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