|
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
本帖最后由 网海遨游 于 2019-9-23 22:08 编辑
在你原代码基础上,略有改动
Option Explicit
Sub 字典的筛选多行区域()
Dim d As Object, ar, i&, m As Byte, k, Im '声明变量类型
Application.ScreenUpdating = False '禁止刷新
Set d = CreateObject("Scripting.Dictionary") '调用字典
With Sheets("sheet1")
ar = .Range("a1:i" & .[b65536].End(3).Row) '给数组赋值
For i = 2 To UBound(ar) '从第2行开始循环,第1行是标题
If IsDate(ar(i, 2)) Then '如果是时间格式
m = Month(ar(i, 2)) '获取月份
If Not d.Exists(m) Then Set d(m) = .[a1:i1] '如果字典键为空,月份当字典的键,B1单元格作为条目
Set d(m) = Union(d(m), .Range(.Cells(i, 1), .Cells(i, 9))) '如果字典有此键,就将相应单元格链接起来。
End If
Next
End With
On Error Resume Next '有错误,继续执行。(防止对工作表命名时,因重名而报错)
For Each k In d.Keys '遍历字典键
With Sheets(k & "月")
.[b:b].ClearContents '清除内容
d(k).Copy .[a1] '复制相应键的条目到[a1]单元格
End With
If Err.Number <> 0 Then '程序出错了(无此表),Err.Number的值就不等于零,常用在On Error Resume Next之后
Sheets.Add after:=Sheets(Sheets.Count) '就在最后新建一个工作表
With ActiveSheet
.Name = k & "月" '对新建工作表取名
d(k).Copy .[a1] '复制相应键的条目到[a1]单元格
End With
Err.Clear '清空Err对象,使之变成0
End If
Next
Sheets("Sheet1").Activate '激活“源”工作表
Set d = Nothing '字典初始化,释放内存
Erase ar '清空数组,释放内存
Application.ScreenUpdating = False '允许刷新
End Sub
|
|