VBA从excel中的过滤表返回第n个行号

时间:2015-03-04 13:35:46

标签: excel vba excel-vba

在excel表中应用过滤器之后,任何人都可以帮我找到第n个元素的绝对行数。

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

3 个答案:

答案 0 :(得分:5)

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

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

修改

汤姆声称这种方法不起作用,但我很确定它能满足您的要求。例如:

这是我原来的测试表 - 未经过滤,因此您可以看到我们正在做的事情。 Unfiltered

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

Filtered

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

答案 1 :(得分:0)

作为我建议的功能

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

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

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

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

答案 2 :(得分:-1)

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

这个工作,您必须在脚本中自行更改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