【问题标题】:VBA_Offset for Column with Header带有标题的列的 VBA_Offset
【发布时间】:2021-04-01 08:44:20
【问题描述】:

我有一个数据,我根据其标题对列应用了过滤器。现在我想对过滤后的数据进行一些更改,即同一列中的可见单元格。我在下面提到了过滤器已应用于标题为“查询类型”的列并且其列字母为“E”的代码。是否可以根据列标题而不是列字母放置偏移量?因为列每次都在变化。在下面的示例中,如何动态替换 E2 或 E 以适应带有标题的列?我尝试用 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

【问题讨论】:

    标签: excel vba offset


    【解决方案1】:

    当您要处理列号时,可以使用工作表的.Cells-property。 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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

      • 我刚刚抓到了一个大数字——它应该真正动态地位于工作表的底部。现已编辑。
      • 编辑时:切勿使用不合格的RangesCells
      • 通常,我会使用 Workbooks().Worksheets().cells() - 否则它只是自找麻烦 - 但为了利益,我尽量避免在这里一次性扔掉太多东西简洁。
      • 一个简单的With-statement 可以减轻痛苦。但是ActiveSheet.Range(Cells... 很危险,因为您为Range 指定了工作表,但没有为Cells 指定工作表。如果您使用这样的语句并稍后决定使用真实的工作表变量,则该行将失败并且不容易看出原因。 SO充满了关于那个的问题......
      猜你喜欢
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2012-01-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多