实例需求:
工作簿中共有两个工作表:
-
工作表
明细用于保存原始数据表,如下图所示

-
工作表
查询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方法,清除"明细"工作表上的筛选状态,恢复显示全部数据。