Excel 如何删除没有条目的行?
我有这种情况Excel 如何删除没有条目的行?,excel,vba,Excel,Vba,我有这种情况 代码删除行A3和A10,尽管B3和D10处有值 我想删除工作簿中所有工作表中的行 Sub Delete() Dim xlastrow As Integer Dim xrow As Integer xrow = 1 Range("a65000").End(xlUp).Select xlastrow = ActiveCell.Row Do Until xrow = xlastrow If Cells(xrow, 1).Value = "&q
代码删除行A3和A10,尽管B3和D10处有值 我想删除工作簿中所有工作表中的行
Sub Delete()
Dim xlastrow As Integer
Dim xrow As Integer
xrow = 1
Range("a65000").End(xlUp).Select
xlastrow = ActiveCell.Row
Do Until xrow = xlastrow
If Cells(xrow, 1).Value = "" Then
Cells(xrow, 1).Select
Selection.EntireRow.Delete
xrow = xrow - 1
xlastrow = xlastrow - 1
End If
xrow = xrow + 1
Loop
End Sub
这将返回文本“有值单元格数”
,其中第3行有值单元格数
对于空行,它应该返回0
注意:如果删除第3行,则需要再次检查第3行,因为它将包含第4行以前的值…要检查一行的所有单元格,可以使用函数
CountA
。当您谈论处理大量工作表时,您应该创建一个Sub
,该Sub将工作表作为参数并处理该工作表,而不是依赖于活动工作表。你应该避免使用
删除数据应始终以相反的顺序进行,这使其更易于实现。你的日常生活可能看起来像
Sub DeleteEmptyRows(ws As Worksheet)
Dim row As Long
For row = ws.UsedRange.Rows.Count To 1 Step -1
Dim r As Range
Set r = ws.Cells(row, 1).EntireRow
If WorksheetFunction.CountA(r) = 0 Then
r.Delete
End If
Next
End Sub
这将检查行的整个长度(数字和/或文本值)。并删除空白行。它还将只运行delete rows语句一次,以提高性能
Option Explicit
Sub removeBlankRows()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim xlastrow As Long
xlastrow = ws.Range("a65000").End(xlUp).Row
Dim xrow As Long
For xrow = xlastrow To 1 Step -1
Dim c As Long
c = WorksheetFunction.CountA(ws.Rows(xrow))
Dim d As Long
d = WorksheetFunction.Count(ws.Rows(xrow))
If c = 0 And d = 0 Then
Dim deleteRng As Range
If deleteRng Is Nothing Then
Set deleteRng = ws.Cells(xrow, 1)
Else
Set deleteRng = Union(ws.Cells(xrow, 1), deleteRng)
End If
End If
Next
If Not deleteRng Is Nothing Then deleteRng.EntireRow.Delete
End Sub
你需要两件事:
应用程序.CountA(SomeCell.EntireRow)=0
)
好吧,你想从第一行到最后一行,删除其中的一些(简单的事实是,我可以谈论第一行和最后一行,这意味着整个想法是有序的)。只有一种正确的方法可以做到这一点(互联网上对此有很多解释,归根结底是您保留了一个位置索引,当您删除一行并增加索引时,您可能会跳过需要删除的一行): 从最后一行开始,然后返回第一行。
祝你好运如果最后一行在a列中没有值,但在另一列中呢?
无论如何,我认为这是一个完整的解决方案,除了防止被保护的工作表之外。
它使用了许多小函数,使其更易于理解。它不依赖于
COUNTA
或COUNT
函数。LastRowInRange
也将处理子集范围,而不是整个工作表
Sub ExampleCall()
Dim Sheet As Worksheet
' Clean up all sheets in ActiveWorkbook
For Each Sheet In ActiveWorkbook.Worksheets
DeleteEmptyRows Sheet
Next
End Sub
DeleteEmptyRows
Sub DeleteEmptyRows(Optional Sheet As Worksheet)
Dim LastRow As Long, Row As Long
Dim DeleteRange As Range
If Sheet Is Nothing Then Set Sheet = Application.ActiveSheet
LastRow = LastRowInRange(Sheet.UsedRange)
For Row = Sheet.UsedRange.Row To LastRow
If IsRowEmpty(Row, Sheet) Then Set DeleteRange = MakeUnion(DeleteRange, Sheet.Cells(Row, 1))
Next
If Not DeleteRange Is Nothing Then DeleteRange.EntireRow.Delete
End Sub
LastRowInRange
Public Function LastRowInRange(Target As Range) As Long
Dim Column As Range
Dim Row As Long, MaxRow As Long
If Target Is Nothing Then Exit Function
For Each Column In Target.Columns
' This check added, in case you want to look into a subset range and not an entire table/sheet.
If Column.Cells(Column.Row + Column.Rows.Count - 1) <> vbNullString Then
MaxRow = Column.Row + Column.Rows.Count - 1
Exit For
Else
Row = Column.Cells(Column.Row + Column.Rows.Count).End(xlUp).Row
If Row > MaxRow Then MaxRow = Row
End If
Next
LastRowInRange = MaxRow
End Function
MakeUnion
Public Function MakeUnion(Arg1 As Range, Arg2 As Range) As Range
If Arg1 Is Nothing Then
Set MakeUnion = Arg2
ElseIf Arg2 Is Nothing Then
Set MakeUnion = Arg1
Else
Set MakeUnion = Union(Arg1, Arg2)
End If
End Function
最后,我学会了录制宏,并在使用数据过滤器时录制了自己的宏。相应地修改了它(以搜索通用列),并使用宏删除了空行。并且还创建了一个短键以便于执行。
如果单元格(xrow,1).Value=“”和单元格(xrow,2).Value=“”,那么
现在,它将保留b列的值“c”,但是D10行将被删除。然后为第三列添加。有没有办法在数据中包含所有列的范围,单元格是如何填充的?它们是否填充了返回“
”的公式?我尝试通过创建新的子项来运行它,但它没有运行。我对VB的东西完全陌生。你能给我讲讲怎么跑吗谢谢。当我运行时,它会显示“宏”对话框来创建宏,如果我输入相同名称的DeleteEmptyRows,它不会接受它的重复。要进行测试,请打开“立即”窗口并键入DeleteEmptyRows ActiveSheet
-它将在当前活动工作表上工作。但是,您需要考虑如何为所有工作表(可能在许多工作簿中)调用它。什么是立即窗口,我创建了sub并输入了名称“添加过程窗口”作为DeleteEmptyRows ActiveSheet单击“确定”按钮,如果单元格中填充了返回的公式和空字符串,则表示过程名称无效COUNTA仍然会计算。也许你必须调整工作表名称?@Jake-逐行检查代码,看看它在做什么,而不是你所期望的。我无法根据您的数据进行测试,因此您必须进行测试。例如,当存在空行时,c
和d
是否都等于0?如果没有,价值是什么?正如Scott Craner所提到的,单元格中有什么类型的信息?我认为问题在于xlastrow=ws.Range(“a65000”).End(xlUp)。行只查看A列以查找最后一行。没有必要填充该列。@t如果是这样,这里不会填充所有行。。在A列中,我还检查了emty单元格中没有任何类似“”的字符串,但在创建模拟或虚拟数据时,在其上方运行的数据删除了行,但仍然存在错误。但是,不会删除我的excel工作表行。
Public Function IsRowEmpty(Optional Row As Long = 1, Optional Sheet As Excel.Worksheet) As Boolean
Dim Col As Long
If Sheet Is Nothing Then Set Sheet = Application.ActiveSheet
Col = GetLastCol(Row, Sheet)
IsRowEmpty = (Col = 1) And (Trim(Sheet.Cells(Row, 1)) = vbNullString)
'For debuging, uncomment the following:
'If Sheet.Cells(Row, Col) <> vbNullString Then
' Debug.Print "Found something in Row " & Row & ", Col " & Col & ": """ & Sheet.Cells(Row, Col) & """"
'End If
End Function
Public Function GetLastCol(Optional Row As Long = 1, Optional Sheet As Excel.Worksheet) As Long
If Sheet Is Nothing Then Set Sheet = Application.ActiveSheet
GetLastCol = Sheet.Cells(Row, Sheet.Columns.Count).End(xlToLeft).Column
End Function
Public Function MakeUnion(Arg1 As Range, Arg2 As Range) As Range
If Arg1 Is Nothing Then
Set MakeUnion = Arg2
ElseIf Arg2 Is Nothing Then
Set MakeUnion = Arg1
Else
Set MakeUnion = Union(Arg1, Arg2)
End If
End Function