【问题标题】:VBA to return nth row number from a filtered table in excel [closed]VBA从excel中的过滤表中返回第n行号[关闭]
【发布时间】:2015-03-04 13:35:46
【问题描述】:

任何人都可以帮助我找到在过滤器应用于 Excel 表后第 n 个元素的绝对行号。

例如,我已启用过滤器并具有可见范围的数据元素。现在,当没有打开过滤器时,此过滤范围中的第 20(第 n)行可能是第 60 行(绝对意义上)。有没有办法使用 VBA 找到绝对行号?

【问题讨论】:

  • 不知道为什么这个问题被标记为离题。问题非常具体。我想说,这个问题太简单了,没有必要包含代码示例。事实上,任何额外的细节都可能使他的需求更难区分。我认为他做了一个新人应该做的事。 +1 给你发疯的青蛙
  • 是的,这个网站可以超级“超越”。太糟糕了,因为确实,这个问题值得一个功能化的答案,而不是一个“子”,我创建了一个将所需的可见行作为参数并返回绝对值,但我不能分享。谁受益?

标签: vba excel


【解决方案1】:

最简单的方法是特殊细胞。见下文:

Sub test()

Dim i As Integer, j As Integer, k As Integer
Dim Report As Worksheet

Set Report = Excel.ActiveSheet ' Store the current worksheet in a variable (always a good idea)
Dim visRng As Range ' Creating a range variable to store our table, excluding any rows that are filtered out.
Set visRng = Report.UsedRange.SpecialCells(xlCellTypeVisible) ' Select only rows within the used range that are visible.

Dim r As Range 
For Each r In visRng.Rows ' Loop through each row in our visible range ...
    MsgBox (r.Row) ' ... and retrieve the "absolute" row number.
Next

End Sub

编辑

Tom 声称这种方法行不通,但我很确定它可以满足您的要求。示例:

这是我的原始测试表 - 未经过滤,因此您可以看到我们在做什么。

然后我们在表格中间某处过滤几个值...

现在,当我们运行我在上面发布的脚本时,我们的消息框将显示每个未过滤行的“绝对”行号。结果是 1、3、4、5 和 7。

【讨论】:

    【解决方案2】:

    作为我建议的功能

    Function RowNum(Target As Range) As Long
        RowNum = Target.Row
    End Function
    

    通过输入单元格=RowNum(E9) 使用。如果您想要相对于表格开始的行并且您的表格从-say-row 21开始,只需从结果中减去它(您可以使用相同的函数来查找表格开始或课程的行)......例如=rownum(A2)-rownum($A$1) ...注意表头的绝对符号!

    如果您不喜欢这个函数,您可以使用 SelectionChange 事件在消息行中显示所选单元格的行号(可选地取决于工作表中某处的“调试标志”)。

    Tne 非 VBA 方法是使用 CELL 公式......例如=CELL("row",A1)

    【讨论】:

    • 感谢您的回复 MikeD,但我不希望将其应用于特定单元格。我想要表中第 20 个可见行(应用过滤器后)的绝对行号(不启用过滤器)。
    • 这就是它的作用...转到过滤表,前进到第 20 行并在某处输入该函数,指向该行中的任何单元格...。您当然可以查看最左边并从 Excel 中读出行号...或者我可以详细说明如何使其在 status line 上可见
    【解决方案3】:

    如果在第 n 个条目之后还有其他隐藏单元格,@Lopside 提出的答案将不起作用。然后将它们添加到绝对位置。

    这会起作用,您必须在脚本中自己更改 n。改变应该不难。如果您对此有任何疑问,请随时提问。 (;

    Sub absoluteRowID()
    
    Dim RowCount, hiddenRows As Integer
    
    'relative position n
    n = 5
    i = 0
    
    Do While i < n
    
    i = i + 1
    If ThisWorkbook.Sheets(1).Rows(i).EntireRow.Hidden Then
    'if there is a hidden row, position is incremented
    n = n + 1
    End If
    'if there is no hidden row, nothing happens
    
    Loop
    
    MsgBox (i)
    
    
    
    End Sub
    

    HTH

    【讨论】:

    • 不确定你的意思。我在一个大表的中间用过滤的行测试了我的脚本。我将发布一些屏幕截图以证明它确实按照 OP 的要求工作。
    • 嘿@Lopside,抱歉不想冒犯你。也许我弄错了你的代码,但在我看来,它计算了整个表中的 all 不可见行。你能在你的代码中加入一些 cmets 吗?那将非常有帮助。 (:
    • 非常感谢大家.....我结合使用了 Lopside 和 Tim 的解决方案,它解决了我的问题。真的很感谢你们的帮助!!!!
    • 标记答案会很好。 <:>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 2016-12-04
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多