Vba 根据标题名称删除行

Vba 根据标题名称删除行,vba,excel,Vba,Excel,我正在尝试删除Excel工作表中的许多行 我的VBA非常简单: Sub delNA() lr = Cells(Rows.Count, "A").End(xlUp).Row 'find last row For i = lr To 2 Step -1 'loop thru backwards, finish at 2 for headers If Cells(i, "H").Text = "#N/A" Then Rows(i).EntireRow.Delete

我正在尝试删除Excel工作表中的许多行

我的VBA非常简单:

Sub delNA()
    lr = Cells(Rows.Count, "A").End(xlUp).Row 'find last row
    For i = lr To 2 Step -1 'loop thru backwards, finish at 2 for headers
        If Cells(i, "H").Text = "#N/A" Then Rows(i).EntireRow.Delete
    Next i
End Sub
但我的问题是,有时我的标题是不同的。在本例中,头BTEX(Sum)在H2中,但有时该参数在G2中,有时在E2中,所以我尝试做的是让VBA搜索头名称,因此标准不是H而是“BTEX(Sum)”


有没有办法让VBA在第2行中的值为“BTEX(Sum)”的列中运行?

@Mikkel Astrup首先使用for循环查找要查找的列索引,在这种情况下,第2行单元格的列索引值为“BTEX(Sum)”


@Mikkel Astrup首先使用for循环查找要查找的col索引,在本例中,第2行单元格的col索引的值为“BTEX(Sum)”

尝试一下:

Option Explicit 

Sub delNA()
  Const HEADER_TEXT As String = "BTEX (Sum)"
  Dim thisSheet As Worksheet
  Set thisSheet = ActiveSheet
  With thisSheet
    Dim myHeader As Range
    Set myHeader = .Cells.Find(What:=HEADER_TEXT, after:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    If Not myHeader Is Nothing Then  'i.e. we found the header text somewhere
      Dim headerColumn As Long
      headerColumn = myHeader.Column

      Dim lastRow As Long
'Update here:
      lastRow = .Cells(.Rows.Count, headerColumn).End(xlUp).Row 'find last row
      Dim i As Long
      For i = lastRow To 2 Step -1 'loop thru backwards, finish at 2 for headers
'Update here:
          If IsError(.Cells(i, headerColumn).Value2) Then
            .Rows(i).EntireRow.Delete
          End If
      Next i
    Else
      MsgBox ("Could not find a column for the header text " & HEADER_TEXT)
    End If
  End With
End Sub
  • 它在范围上使用
    .Find()
    ,可以非常快速地确定标题列的位置,如果没有找到,则会弹出一条错误消息(以防万一)
    • 注意:
      .Find()
      将使用
      查找
      对话框中未明确设置的任何内容的当前设置,下次使用
      查找
      对话框时,该设置将是您的代码设置的任何内容。i、 e.
      Find
      对话框和
      .Find()
      函数共享一组通用的持久参数
  • 它为当前工作表分配一个工作表变量,只是为了确保,如果该操作需要运行一段时间,则无聊的用户不会单击另一个工作表并破坏内容
  • 所有工作表行通过使用
    .Cells()
    .rows()
    (请注意前导的
    )明确引用
    此工作表
    ,因为行:
    与此工作表
  • 它使用
    .Value2
    而不是
    .text
    (有关原因,请参阅。)
  • 我在开始时声明了
    选项Explicit
    ,以确保在使用之前声明了所有变量。
    • 这是一个好习惯,因为它将消除令人沮丧的错误,即在一个地方使用
      MyText
      作为变量,在另一个地方使用
      MyTxt
      作为变量,而不理解它为什么不起作用
  • 现在,通过将
    Const
    声明转换为
    delNA()
    接受的参数,您可以将其用于任何标题行,而不是固定的标题行,从而获得一个更通用的函数框架
试试看:

Option Explicit 

Sub delNA()
  Const HEADER_TEXT As String = "BTEX (Sum)"
  Dim thisSheet As Worksheet
  Set thisSheet = ActiveSheet
  With thisSheet
    Dim myHeader As Range
    Set myHeader = .Cells.Find(What:=HEADER_TEXT, after:=.Cells(1, 1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    If Not myHeader Is Nothing Then  'i.e. we found the header text somewhere
      Dim headerColumn As Long
      headerColumn = myHeader.Column

      Dim lastRow As Long
'Update here:
      lastRow = .Cells(.Rows.Count, headerColumn).End(xlUp).Row 'find last row
      Dim i As Long
      For i = lastRow To 2 Step -1 'loop thru backwards, finish at 2 for headers
'Update here:
          If IsError(.Cells(i, headerColumn).Value2) Then
            .Rows(i).EntireRow.Delete
          End If
      Next i
    Else
      MsgBox ("Could not find a column for the header text " & HEADER_TEXT)
    End If
  End With
End Sub
  • 它在范围上使用
    .Find()
    ,可以非常快速地确定标题列的位置,如果没有找到,则会弹出一条错误消息(以防万一)
    • 注意:
      .Find()
      将使用
      查找
      对话框中未明确设置的任何内容的当前设置,下次使用
      查找
      对话框时,该设置将是您的代码设置的任何内容。i、 e.
      Find
      对话框和
      .Find()
      函数共享一组通用的持久参数
  • 它为当前工作表分配一个工作表变量,只是为了确保,如果该操作需要运行一段时间,则无聊的用户不会单击另一个工作表并破坏内容
  • 所有工作表行通过使用
    .Cells()
    .rows()
    (请注意前导的
    )明确引用
    此工作表
    ,因为行:
    与此工作表
  • 它使用
    .Value2
    而不是
    .text
    (有关原因,请参阅。)
  • 我在开始时声明了
    选项Explicit
    ,以确保在使用之前声明了所有变量。
    • 这是一个好习惯,因为它将消除令人沮丧的错误,即在一个地方使用
      MyText
      作为变量,在另一个地方使用
      MyTxt
      作为变量,而不理解它为什么不起作用
  • 现在,通过将
    Const
    声明转换为
    delNA()
    接受的参数,您可以将其用于任何标题行,而不是固定的标题行,从而获得一个更通用的函数框架

您是在尝试删除文本中标题为
BTEX(Sum)
的位置,还是在代码读取时标题为
\N/A
的位置?您正在尝试删除H列中有错误的行,还是删除H列中的实际文本
#N/a
?如果您正在查找错误,请使用
If-IsError({cell reference}),然后使用
,这样会更干净。您不合格的
单元格()
行()
引用最终会给您带来麻烦-它们隐式引用了
ActiveSheet
,如果发生更改(通过代码或用户输入),您将开始查看和删除错误工作表中的数据。等等。。。您试图删除在
BTEX(Sum)
列中有错误的行,但您并不总是知道
BTEX(Sum)
列在哪个列中,对吗?是的,FreeMan,我试图删除带有文本“N/A”的行,这不是一个错误,我收到的输出是作为文本发送的,所以在这种情况下使用iError没有帮助。问题是,我并不总是知道BTEX(Sum)列是什么。顺便说一句,在确定删除循环应该从下到上运行方面做得很好,这是人们在删除时经常遇到的问题…您是否试图删除标题为
BTEX(Sum)
的内容,如您的文本所示,或者当代码读取时,标题是
#N/A
?您正在尝试删除H列中有错误的行,还是删除H列中的实际文本
#N/a
?如果您正在查找错误,请使用
If-IsError({cell reference}),然后使用
,这样会更干净。您不合格的
单元格()
行()
引用最终会给您带来麻烦-它们隐式引用了
ActiveSheet
,如果发生变化(通过代码或用户输入),您将