【发布时间】:2018-12-24 08:00:54
【问题描述】:
最初,我的代码在标题中使用了数据过滤器,并循环遍历特定行中的每个条件,将该工作表上的所有可见数据复制并粘贴到各个相应的工作表中。我觉得这太初级了,在 SO 的一些帮助下,编写了如下所示的新代码。由于我不确定的原因,我的宏现在挂起 5-10 分钟来处理数据。与需要大约 10-15 秒的数据过滤方法相比。通常我的工作表少于 1000 行。但我们只是说,绝对最坏的情况,它不超过 2000 行。
每行包含大约 50 个连续的文本单元格,其中一些单元格的内部用颜色填充,50 个中的大约 10 个具有精确或简单的 SUM 公式。
如果有人有任何指示我应该改变什么可以加快速度,那就太好了!或者,如果您认为数据过滤方法是最好的。
Const TERR As String = "NA,AU,BR,CAen,CAfr,DE,ES,FR,IT,MX,USA,UK"
Sub CATsplit(wb2)
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim wbMacro As ThisWorkbook
Dim dict As New Scripting.Dictionary
Dim t As Variant
Dim newSheet As Worksheet
Dim LC As Long
LC = Sheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
For Each t In Split(TERR, ",")
' Create each sheet
Set newSheet = Sheets.Add(after:=ActiveSheet)
newSheet.Name = t
With newSheet
dict.Add t, .Cells(.Rows.Count, 2).End(xlUp).Row
End With
Next
Sheets("NA").Name = "No Result"
Sheet(1).Activate
For r = 2 To LR Step 1
If Application.WorksheetFunction.IsNA(Sheets(1).Range("K" & r)) Then
Range(Cells(r, 1), Cells(r, LC)).Copy Destination:=Sheets("No Result").Cells(dict("NA") + 1, 1)
dict("NA") = Sheets("NA").Cells(Rows.Count, "B").End(xlUp).Row
GoTo Nxt
End If
If Sheets(1).Range(Cells(r, 14)).Value = "Australia" Then
Range(Cells(r, 1), Cells(r, LC)).Copy Destination:=Sheets("AU").Cells(dict("AU") + 1, 1)
dict("AU") = Sheets("AU").Cells(Rows.Count, "B").End(xlUp).Row
GoTo Nxt
End If
If Sheets(1).Range(Cells(r, 14)).Value = "Brazil" Then
Range(Cells(r, 1), Cells(r, LC)).Copy Destination:=Sheets("BR").Cells(dict("BR") + 1, 1)
dict("BR") = Sheets("BR").Cells(Rows.Count, "B").End(xlUp).Row
GoTo Nxt
End If
'''' 9 other IF statements structured the same way
Nxt:
Next r
【问题讨论】:
-
LC 不是从新工作簿的第一个工作表中获取价值吗?限定工作表的父工作簿。
-
将Option Explicit 放在
Const TERR As String = ...上方并重新运行您的代码。 -
@Jeeped - 我试图只发布我的代码的相关部分。将错误的部分复制到这篇文章中。编辑以简化
-
您的代码清单有问题,看起来第一个缩进部分周围应该有某种
With ... End With? -
也对。对不起。应该刚刚粘贴了所有内容。
标签: excel vba dictionary for-loop if-statement