【发布时间】:2021-01-29 14:17:02
【问题描述】:
我的代码将 Sheet1 上 C 列中的单元格值与 Sheet3 上的数据透视表相匹配,然后复制某些列。
- 代码将检查 Sheet1 上有多少条目需要检查
- 循环 2:对于 C/Sheet1 列中的每个值与工作表 2 上 A 列中的匹配项,它将复制 B、C、D、E 列中的相应数据。
- 由于值/表可能有多个匹配项,因此我将数据提取限制为三个匹配项(代码中的三个循环)。为了实现这一点,我正在增加 i +1 或 i+2 以获取数据透视表中的下一行。
Sheet 2 上的表格有时超过 10,000 行,Excel 崩溃。
有没有人知道如何加快循环代码(Loop2,3,4 相同)以减少工作强度,例如阵列可能?它们导致锁定,因为我认为代码一直在 A 列上下运行。
Set sheet3 = Sheets("OrbitPivotTable")
CellChanged = Sheet1.Range("A1").Value + 1
LastRow = sheet3.Cells(Rows.Count, "A").End(xlUp).Row
LastData = Sheet1.Cells(Rows.Count, "C").End(xlUp).Row
'Loop1
For i = 1 To LastRow
If Sheet1.Range("C" & CellChanged).Value = "" Then GoTo Nextstep2
If Sheet1.Range("C" & CellChanged).Value = sheet3.Range("A" & i) Then
Sheet1.Range("H" & CellChanged).Value = sheet3.Range("B" & i).Value 'Customer
Sheet1.Range("I" & CellChanged).Value = sheet3.Range("C" & i).Value 'Rate Val start
Sheet1.Range("J" & CellChanged).Value = sheet3.Range("D" & i).Value 'ATA All in
Sheet1.Range("K" & CellChanged).Value = sheet3.Range("E" & i).Value 'Special Remarks
Found = True
End If
If Found = True Or i = LastRow Then
If CellChanged = LastData Then
Exit For
End If
If Found = True Then
Found = False
Nextstep2:
CellChanged = CellChanged + 1
End If
i = 0
End If
Next i
'Loop2
等等……
【问题讨论】:
-
如果您使用
Application.Match()在每张纸上查找匹配项,它会比循环更快。我会避免使用“Sheet1”等工作表变量名称,因为它们与 Excel 分配的默认工作表代号相匹配 - 这没有错,但可能会造成混淆。最好使用与实际工作表目的相对应的变量名称 -wsComp、wsCPK等。仅供参考,如果您发布的代码更少,您更有可能得到响应。要经历很多事情。 -
好的,感谢您的反馈。我在其他帖子上读到没有发布足够的代码。让我缩小上面的请求,然后尝试 application.match。
-
@TimWilliams 我需要将所有 sheet1.range 通道转换为 application.match 还是仅将匹配所在的循环中的第一个通道转换为?将代码更改为:
If Application.Match(Sheet1.Range("C" & CellChanged).Value, Sheet2.Range("A" & i), 0) Then我需要保留 .Range 吗? -
您是否有机会分享工作簿或至少一些屏幕截图?我在弄清楚您的确切过程时遇到了问题 - 例如,通常在循环内修改
For循环计数器不是一个好主意,因此设置 i=0 很奇怪。如果您想这样做,您可以使用Exit For退出循环。 -
i = 0 '如果找到匹配项。检查将在第 1 行重新开始并继续直到找到下一个匹配项。似乎是双重“努力”