ActiveSheet.AutoFilter.Range异常返回表格筛选范围,如何获取已用区域外单元格?
解决ActiveSheet.AutoFilter.Range返回异常的替代方案
我之前也踩过ActiveSheet.AutoFilter.Range的坑——它有时候会根据当前选中的单元格来返回筛选范围,而不是我们预期的整个表格筛选区域。为了绕开这个问题,我折腾出了一个替代思路:找到工作表里最后一个已使用的单元格,通过偏移一行一列定位到已用区域之外的单元格,临时选中这个单元格后再切回用户之前选中的区域,这样就能避免AutoFilter.Range的异常返回了。
当然这个方案有个小局限:如果用户把整个工作表的单元格都用上了,那这个方法就会失效,但我愿意承担这种小概率的风险。
对应的完整VBA实现代码如下:
Public Function getCellOutsideUsedRange(ws As Worksheet) As Range Dim rng As Range Set rng = getLastCellOnSheet(ws) If rng.Row = ws.Rows.CountLarge Then If rng.Column = ws.Columns.CountLarge Then Set getCellOutsideUsedRange = Nothing Else Set getCellOutsideUsedRange = rng.Offset(0, 1) End If ElseIf rng.Column = ws.Columns.CountLarge Then If rng.Row = ws.Rows.CountLarge Then Set getCellOutsideUsedRange = Nothing Else Set getCellOutsideUsedRange = rng.Offset(1, 0) End If Else Set getCellOutsideUsedRange = rng.Offset(1, 1) End If End Function ' 辅助函数:获取工作表最后一个已使用的单元格 Private Function getLastCellOnSheet(ws As Worksheet) As Range Dim lastRow As Long, lastCol As Long lastRow = ws.Cells(ws.Rows.CountLarge, 1).End(xlUp).Row lastCol = ws.Cells(1, ws.Columns.CountLarge).End(xlToLeft).Column Set getLastCellOnSheet = ws.Cells(lastRow, lastCol) End Function
使用的时候,你可以先记录用户当前选中的区域,调用getCellOutsideUsedRange拿到外部单元格并临时选中,之后再恢复用户的选中状态,这样就能获取到准确的AutoFilter范围了。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

