VBA_Offset 对于具有 Header 的列
VBA_Offset for Column with Header
我有一个数据,我根据 header 对列应用了过滤器。现在我想对过滤后的数据进行一些更改,即同一列中的可见单元格。我在下面提到的代码中,过滤器已应用于具有 header“查询类型”的列,它的列字母是“E”。是否可以根据列 header 而不是列字母来放置偏移量?因为列每次都在变化。在下面的示例中,如何动态替换 E2 或 E 以适应带有 header 的列?我尝试用 FiltCol 替换“E”;但是它不起作用。
Sub Filter()
Dim FiltCol As Variant
FiltCol = Rows("1:1").Find(What:="Query Type", LookAt:=xlWhole).Column
ActiveSheet.UsedRange.AutoFilter Field:=FiltCol, Criteria1:="Rejected"
ActiveSheet.Range("E2", Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "Accepted"
End Sub
cells(1,1).offset(2,3)
会让你从 A1 到 D3
lastRow = Cells(105000, FiltCol).End(xlUp).Row <<< This is poor, see edit below
ActiveSheet.Range(Cells(2, FiltCol).Offset(0, 1), Cells(lastRow, FiltCol).Offset(0, 1)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "Accepted"
编辑:
最好动态描述最后一行
lastRow = Cells(Cells.Rows.Count, FiltCol).End(xlUp).Row
当要处理列号时,可以使用工作表的.Cells
-属性。 Cells
需要 2 个参数,行和列。行始终是一个(长)数字,列可以指定为数字或列字符
以下条款完全相同:
ActiveSheet.Range("D3")
ActiveSheet.Cells(3, 4)
ActiveSheet.Cells(3, "D")
您的代码可能如下所示
Sub Filter()
Dim FiltCol As Variant
With ActiveSheet
FiltCol = .Rows("1:1").Find(What:="Query Type", LookAt:=xlWhole).Column
Dim lastRow As Long
lastRow = .Cells(.Rows.Count, FiltCol).End(xlUp).row
.UsedRange.AutoFilter Field:=FiltCol, Criteria1:="Rejected"
Dim visibleCells As Range
On Error Resume Next ' Avoid runtime error if nothing is found
Set visibleCells = .Range(.Cells(2, FiltCol), .Cells(lastRow, FiltCol)).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visibleCells Is Nothing Then
visibleCells.Value2 = "Accepted"
End If
End With
End Sub
我有一个数据,我根据 header 对列应用了过滤器。现在我想对过滤后的数据进行一些更改,即同一列中的可见单元格。我在下面提到的代码中,过滤器已应用于具有 header“查询类型”的列,它的列字母是“E”。是否可以根据列 header 而不是列字母来放置偏移量?因为列每次都在变化。在下面的示例中,如何动态替换 E2 或 E 以适应带有 header 的列?我尝试用 FiltCol 替换“E”;但是它不起作用。
Sub Filter()
Dim FiltCol As Variant
FiltCol = Rows("1:1").Find(What:="Query Type", LookAt:=xlWhole).Column
ActiveSheet.UsedRange.AutoFilter Field:=FiltCol, Criteria1:="Rejected"
ActiveSheet.Range("E2", Range("E" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "Accepted"
End Sub
cells(1,1).offset(2,3)
会让你从 A1 到 D3
lastRow = Cells(105000, FiltCol).End(xlUp).Row <<< This is poor, see edit below
ActiveSheet.Range(Cells(2, FiltCol).Offset(0, 1), Cells(lastRow, FiltCol).Offset(0, 1)).SpecialCells(xlCellTypeVisible).FormulaR1C1 = "Accepted"
编辑:
最好动态描述最后一行
lastRow = Cells(Cells.Rows.Count, FiltCol).End(xlUp).Row
当要处理列号时,可以使用工作表的.Cells
-属性。 Cells
需要 2 个参数,行和列。行始终是一个(长)数字,列可以指定为数字或列字符
以下条款完全相同:
ActiveSheet.Range("D3")
ActiveSheet.Cells(3, 4)
ActiveSheet.Cells(3, "D")
您的代码可能如下所示
Sub Filter()
Dim FiltCol As Variant
With ActiveSheet
FiltCol = .Rows("1:1").Find(What:="Query Type", LookAt:=xlWhole).Column
Dim lastRow As Long
lastRow = .Cells(.Rows.Count, FiltCol).End(xlUp).row
.UsedRange.AutoFilter Field:=FiltCol, Criteria1:="Rejected"
Dim visibleCells As Range
On Error Resume Next ' Avoid runtime error if nothing is found
Set visibleCells = .Range(.Cells(2, FiltCol), .Cells(lastRow, FiltCol)).SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If Not visibleCells Is Nothing Then
visibleCells.Value2 = "Accepted"
End If
End With
End Sub