如何用VBA提取筛选后最近6个对应工作日的日期与现金头寸数据
实现方案
你可以通过VBA识别筛选后的可见单元格,自动定位最后6条匹配的工作日数据,不需要手动定义行范围,参考代码如下:
Sub 提取指定周次最近6天现金流数据() Dim ws As Worksheet Dim visibleRange As Range Dim rowArr() As Long Dim i As Long, rowCount As Long, targetNum As Long ' 绑定当前操作工作表,可替换为你自己的表名,比如Set ws = Sheets("现金流表") Set ws = ThisWorkbook.ActiveSheet targetNum = 6 ' 要提取的最近数据条数,可按需调整 ' 获取G列(星期几列)排除表头的所有可见单元格 On Error Resume Next Set visibleRange = ws.Range("G2:G" & ws.Cells(Rows.Count, "G").End(xlUp).Row).SpecialCells(xlCellTypeVisible) On Error GoTo 0 ' 无匹配数据直接退出 If visibleRange Is Nothing Then MsgBox "当前筛选条件下没有符合要求的数据" Exit Sub End If rowCount = visibleRange.Cells.Count ' 兼容可见数据不足6条的场景 If rowCount < targetNum Then targetNum = rowCount ReDim rowArr(1 To targetNum) i = 1 ' 倒序遍历可见单元格,收集最后N条的行号 For areaIdx = visibleRange.Areas.Count To 1 Step -1 For cellIdx = visibleRange.Areas(areaIdx).Cells.Count To 1 Step -1 rowArr(i) = visibleRange.Areas(areaIdx).Cells(cellIdx).Row i = i + 1 If i > targetNum Then Exit For Next If i > targetNum Then Exit For Next ' ---------------------- ' 下面是自定义操作部分,按需修改 ' 示例1:选中A列和F列对应范围 Union(ws.Range("A" & Join(rowArr, ",A")), ws.Range("F" & Join(rowArr, ",F"))).Select ' 示例2:复制到其他位置,比如从J1开始粘贴 ' For k = 1 To targetNum ' ws.Cells(k, "J") = ws.Cells(rowArr(k), "A") ' ws.Cells(k, "K") = ws.Cells(rowArr(k), "F") ' Next ' 示例3:直接计算现金头寸平均值 ' Dim avg As Double ' For k = 1 To targetNum ' avg = avg + ws.Cells(rowArr(k), "F") ' Next ' avg = avg / targetNum ' MsgBox "最近" & targetNum & "个工作日的平均现金头寸为:" & avg End Sub
关键说明
- 代码用
SpecialCells(xlCellTypeVisible)专门读取筛选后的可见内容,自动跳过隐藏行,不需要手动数行号 - 适配筛选后可见行分段的场景(筛选后隐藏行把可见行拆成多个不连续区域),不会漏读数据
- 已经做了数据量不足6条的兼容,不会出现索引越界报错
- 代码里注释了三种常用操作,你可以根据自己的需求注释/打开对应代码段即可
内容的提问来源于stack exchange,提问作者DallasJ
相关产品推荐
相关产品推荐

