【发布时间】:2018-06-13 06:31:20
【问题描述】:
我正在使用循环在 excel 上编写 VBA 代码以通过 10000+ 行。
这是一个表格的例子
这是我写的代码:
Sub Find_Matches()
Dim wb As Workbook
Dim xrow As Long
Set wb = ActiveWorkbook
wb.Worksheets("Data").Activate
tCnt = Sheets("Data").UsedRange.Rows.Count
Dim e, f, a, j, h As Range
xrow = 2
Application.ScreenUpdating = False
Application.Calculation = xlManual
For xrow = 2 To tCnt Step 1
Set e = Range("E" & xrow)
Set f = e.Offset(0, 1)
Set a = e.Offset(0, -4)
Set j = e.Offset(0, 5)
Set h = e.Offset(0, 3)
For Each Cell In Range("E2:E" & tCnt)
If Cell.Value = e.Value Then
If Cell.Offset(0, 1).Value = f.Value Then
If Cell.Offset(0, -4).Value = a.Value Then
If Cell.Offset(0, 5).Value = j.Value Then
If Cell.Offset(0, 3).Value = h.Value Then
If (e.Offset(0, 7).Value) + (Cell.Offset(0, 7).Value) = 0 Then
Cell.EntireRow.Interior.Color = vbYellow
e.EntireRow.Interior.Color = vbYellow
End If
End If
End If
End If
End If
End If
Next
Next
End Sub
您可以想象,这需要花费大量时间来处理 10000 多行,我想找到一个更快的解决方案。必须有一种我认为不会避免过度循环
的方法条件如下:
对于每一行,如果文件中任何位置的另一行具有完全相同的 :
- 买家 ID(E 栏)
- `# 已购买(F 列)
- 产品 ID (col.A)
- 付款(J 栏)
- 购买日期(H 栏)
那么,如果金额的总和(col. L)那两个匹配的行是 0,然后将两行都涂成黄色。
请注意,存在额外的列并且未进行比较(例如,B 列),但对文档仍然很重要,不能删除以简化流程。
【问题讨论】:
-
如果您的代码已经可以工作,这可能是Stack Exchange: Code Review 的一个更好的问题。
-
请注意,当您对变量进行调暗时,只有 h 是一个范围。所有其他(e,f,a,j)都是变体。你需要在每一个之后写上“As Range”。关于速度 - 您是否尝试在循环遍历数组之前将所有单元格复制到二维数组中?使用数组比不断地与工作表交互要快。
-
不,我没有。这正是我正在寻找的那种输入:“我没有想到什么?”谢谢!
-
谢谢@Pᴇʜ 我不会说代码本身可以工作,因为它太慢而无法使用。它只满足规定的条件。如果您认为它仍然可以工作并且应该去 Stack Exchange,我会很乐意将帖子转移到那里!
-
哇。该死的,这是一个很大的SORRY!你是对的。=)
标签: vba excel performance