Vba 根据标题名称删除行
我正在尝试删除Excel工作表中的许多行 我的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
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
,如果发生变化(通过代码或用户输入),您将