|
仅仅是针对一个表进行查询,没必要遍历Sheets,然后运行时间就降下来了。
如果你的数据一、数据二每列标题修改好(不能重复),用SQL方式会更快。
附件中,我修改的代码在 模块1。
- Private Sub jigouhuizong_old()
- ' 变量定义最好集中在过程顶部,不要在程序中间定义,并不会节省内存,却不方便阅读和维护代码
- ' 另外,有些变量并没有定义哦!
- ' 建议在 工具 - 选项 - 编辑器 中选中 “要求变量声明”
- Dim dClk As Date
- Dim ar As Variant
- Dim br()
- Dim cr
- Dim i As Long
- Dim n As Long
- Dim m As Long
- Dim d As Object
-
- dClk = Timer()
- Application.ScreenUpdating = False
-
- 'Set d = CreateObject("scripting.dictionary") ' 这句多余,因为在后面重复定义了。
-
- With Sheets("结果")
- n = .Cells(Rows.Count, "A").End(xlUp).Row
- If n < 13 Then Exit Sub
- Set d = CreateObject("scripting.dictionary") ' 建议保留这句,删除上面的字典定义
- For i = 13 To n
- d(Trim(.Range("A" & i).Value)) = ""
- Next
- End With
-
- cr = Sheets("结果").[a13].Resize(d.Count, 47) ' 不知道实际需求,是否有必要这么大?
-
- ''---------------------------------------------
- '' 既然只需要查询“数据一”,就不要访问所有Sheets
- '' 仅仅是这个修改,就把运行时间降下来了,看图片。
- ''---------------------------------------------
- dz = 48
- hs = 19
- qt = 28
-
- ' 从程序分析,仅仅处理 3 列数据,但却读取了 48 列到内存
- ' 可以考虑用三个数组,分别读取 1 列(DZ、HS、QT)
- ar = Sheets("数据一").Range("a1").CurrentRegion
-
- For Each k In d.keys
- n = 0
- m = m + 1
- ReDim br(1 To 100000, 1 To 6)
-
- For i = 3 To UBound(ar)
- If Trim(ar(i, dz)) = k Then
- n = n + 1
- br(n, 1) = ar(i, dz)
- br(n, 2) = ar(i, hs)
- br(n, 3) = ar(i, qt)
- End If
- Next i
-
- For i = 1 To n
- cr(m, 10) = cr(m, 10) + br(i, 2) / 10000
-
- If Trim(br(i, 3)) > 120 Then
- cr(m, 12) = cr(m, 12) + br(i, 2) / 10000
- End If
- Next i
- Next k
-
- With Sheets("结果")
- ws = .Cells(Rows.Count, 1).End(xlUp).Row + 3
- Range("a13:i" & ws).Borders.LineStyle = xlNone
-
- .[a13].Resize(m, 47) = cr
- .[a13].Resize(m, 47).Borders.LineStyle = 1
- End With
-
- Erase ar: Erase br: Erase cr
- Set d = Nothing
-
- Application.ScreenUpdating = True
- dClk = Timer() - dClk
- MsgBox "查询成功!!!用了" & Format(dClk, "#,##0.0000s") & "时间"
- End Sub
复制代码 |
|