2016-07-08 1031 views
1

我正在尝试查找工作表中筛选范围的行数。 LstRow2是我试图找到的变量。有了这段代码,我得到了未经过滤的行数。Excel VBA筛选筛选范围的最后一行

CSht.Range(CSht.Cells(1, 1), CSht.Cells(LstRow1, LstCol1)).AutoFilter Field:=2, Criteria1:="RA" 
     With CSht 
     LstRow2 = .UsedRange.SpecialCells(xlCellTypeLastCell).Row 
     End With 

Here is the data that I am filtering

回答

1

您需要使用仅可见单元格的工作,因为它的过滤。

试试这个:

With CSht 

    'load filter cells into Range object 
    Dim rngFilter as Range 
    Set rngFilter = Intersect(.UsedRange,.UsedRange.Offset(1)).SpecialCells(xlCellTypeVisible) 

    'find the max number of elements split by $ in the range address 
     'needs to be dynamic because of areas 
    Dim lUpper as Long 
    lUpper = UBound(Split(rngFilter.Address,"$")) 

    'the last element will be the last row in the filtered range 
     'the last number in the rngFilter.Address 
    Dim LstRow2 as Long 
    LstRow2 = Split(rngFilter.Address,"$")(lUpper) 

End With 
+0

嗨,Scott。我意识到LastRow2会出现一个不正确的值。我也不确定最上面是什么。谢谢你的帮助。 – Liz

+0

@Liz - 'lUpper'是一个变量,用于在用'$'分割公式时捕获数组中的最高元素。这是必要的,因为过滤时范围内的区域数量可以是任意的。最高的元素将始终有最后一行过滤的数据。当你说'LstRow2'出现一个不正确的值时,你是什么意思? –

+0

我的意思是这个值应该是3,但它是以5的形式出现的,这是过滤列表之前的元素的数量。 – Liz

0

你为什么不更换此行

LstRow2 = .UsedRange.SpecialCells(xlCellTypeLastCell).Row 

随着

LstRow2 = .Cells(.rows.count, 1).end(xlup).row 
+0

并没有为我工作。我得到了相同的结果 – Liz

+0

这不会起作用,因为'.End(xlUp)'会忽略过滤的范围。它仅作用于整个工作表。 –

+0

刚刚为我工作。我在第1列做了一堆单个数字并对它们进行了过滤,以便第5行中的某些内容将成为最后一行,第6-10行被隐藏,并且lastrow最终结束为5. – Rodger

0

当前区域会为你做它在一个单一的线

LastRow = sht.Range("A1").CurrentRegion.Rows.Count 
+0

这不适合我。我得到的数字与之前的行数相同 – Liz

+0

是的,我很害怕这个,因为我希望得到另一个不适合你的结果。你可以分享剩下的代码吗? – Rodger

+0

或者你是否可以尝试一个测试子程序,它对你的数据真的很短,并拿出所有其他可能的影响因素,并查看一个或两个代码片段是否适合你? – Rodger