Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Excel 如何删除没有条目的行?_Excel_Vba - Fatal编程技术网

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
你需要两件事:

  • 如何知道一行是空的
  • 答案可以在中找到(您需要使用check
    应用程序.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