VBA调用Excel多条件筛选快速提取数据

实例需求:

工作簿中共有两个工作表:

  • 工作表明细用于保存原始数据表,如下图所示

  • 工作表查询A1单元格输入年份,点击查询按钮,在A2开始的单元格展示查询结果,如下图所示

示例代码如下:

vb 复制代码
Sub Demo()
    Dim oSht1 As Worksheet: Set oSht1 = Sheets("查询")
    Dim oSht2 As Worksheet: Set oSht2 = Sheets("明细")
    Dim sDate: sDate = oSht1.[a1]
    If Len(Trim(sDate)) = 0 Then Exit Sub
    If Not IsNumeric(sDate) Then Exit Sub
    If oSht2.AutoFilterMode Then
        If oSht2.AutoFilter.FilterMode Then
            oSht2.ShowAllData
        End If
    End If
    Dim c As Range: Set c = oSht2.Range("A2").CurrentRegion
    c.AutoFilter Field:=1, Criteria1:=">=" & sDate * 1000, _
        Operator:=xlAnd, Criteria2:="<" & (sDate + 1) * 1000
    oSht1.Range("A1").CurrentRegion.Offset(1).ClearContents
    c.Copy oSht1.Range("A2")
    oSht2.ShowAllData
End Sub

【代码解析】

第1行代码定义子过程 Demo,作为整个宏的入口,用于执行后续所有操作逻辑。

第2-3行代码声明工作表对象 oSht1和oSht2,并获取相应工作表对象的引用。

第4行代码声明变量 sDate,并将"查询"工作表 A1 单元格的值赋给该变量,作为筛选日期条件。

第5行代码判断变量 sDate 去除空格后长度是否为 0,如果为空则直接退出子过程,避免无效筛选。

第6行代码判断变量 sDate 是否为数值类型,如果不是数值则退出子过程,防止后续数值计算出错。

第7行代码判断"明细"工作表是否处于自动筛选模式。

第8行代码进一步判断当前是否存在已生效的筛选条件。

第9行代码在存在筛选条件的情况下,调用 ShowAllData方法清除原有筛选,确保后续筛选基于完整数据集。

第12行代码声明 Range 对象变量 c,并将其设置为"明细"工作表中从 A2 开始的当前连续数据区域。

第13~14行代码对数据区域 c 应用自动筛选条件,筛选第1列中大于等于 sDate * 1000 的记录,并且小于 (sDate + 1) * 1000,从而实现按指定日期范围筛选数据。

第15行代码清除"查询"工作表 A1 单元格当前区域中除标题行以外的内容,为新的筛选结果腾出空间。

第16行代码将筛选后的数据区域 c 复制到"查询"工作表的 A2 单元格开始的位置,用于显示查询结果。

第17行代码调用ShowAllData方法,清除"明细"工作表上的筛选状态,恢复显示全部数据。

相关推荐
Serendipity_Carl15 天前
数据可视化实战之链家
python·数据可视化·数据清洗
阿杰学AI21 天前
AI核心知识47——大语言模型之Data Cleaning(简洁且通俗易懂版)
人工智能·ai·语言模型·aigc·数据清洗·模型训练·data cleaning
青云交23 天前
Java 大视界 -- Java 大数据在智能医疗电子病历数据分析与临床决策支持中的应用
java·flink·数据清洗·电子病历·智能医疗·医疗信息化·临床决策
黑客思维者23 天前
Python数据清洗实战:去重/标准化
开发语言·python·数据清洗·数据标准化
一晌小贪欢2 个月前
【Python数据分析】数据分析与可视化
开发语言·python·数据分析·数据可视化·数据清洗
不剪发的Tony老师2 个月前
OpenRefine:一款免费开源、功能强大的数据清洗工具
数据清洗
深蓝电商API2 个月前
数据清洗标准化:构建可复用的爬虫数据清洗管道(Pipeline)
爬虫·数据清洗
Serendipity_Carl2 个月前
爬虫数据清洗可视化案例之全球灾害数据
爬虫·python·pycharm·数据可视化·数据清洗