VBA筛选duration列后复制ID列时可见行统计错误问题求助
问题原因&解决方法
问题1:筛选后可见行计数始终为1
筛选后的可见行是不连续的多区块范围(Range),VBA中多区块Range的Rows.Count属性仅返回第一个区块的行数,你的第一个区块通常是表头行,所以始终返回1。
问题2:复制操作报错
你的代码里Cells(1, idIndex)没有指定父工作表,默认指向当前活动工作表而非dataSheet,会出现引用范围不匹配的错误;同时在不连续的可见范围上直接用偏移构造子范围也会取到错误区域。
修正后代码
' 执行筛选 dataSheet.UsedRange.AutoFilter Field:=durationColIndex, Criteria1:="<100" Dim quickRange As Range, idVisibleRange As Range Dim quickCount As Long, area As Range On Error Resume Next ' 防止无符合条件行时SpecialCells报错 Set quickRange = dataSheet.UsedRange.SpecialCells(xlCellTypeVisible) On Error GoTo 0 If Not quickRange Is Nothing Then ' 统计可见行总数(需要排除表头的话最后减1即可) quickCount = 0 For Each area In quickRange.Areas quickCount = quickCount + area.Rows.Count Next ' 提取ID列的可见范围 Set idVisibleRange = dataSheet.UsedRange.Columns(idIndex).SpecialCells(xlCellTypeVisible) ' 新建工作表并粘贴 Set specialIdsSheet = Sheets.Add idVisibleRange.Copy specialIdsSheet.Cells(1, 1).PasteSpecial Paste:=xlPasteValues ' 只需要值的话保留该参数,不需要可以删除 Application.CutCopyMode = False ' 清除剪贴板 End If ' 可选:处理完成后关闭筛选 dataSheet.UsedRange.AutoFilter
补充说明
- 如果不需要保留原格式,直接用
specialIdsSheet.Cells(1, 1).Value = idVisibleRange.Value可以跳过剪贴板,执行效率更高 - 累加行数时如果不需要统计表头,最终
quickCount = quickCount - 1即可
内容的提问来源于stack exchange,提问作者lora
相关产品推荐
相关产品推荐

