【发布时间】:2015-03-25 10:43:08
【问题描述】:
所以这是我的代码,我试图将包含 3000 行的工作表与另一个 5000 行的工作表进行比较,但是它的工作速度太慢,谁能帮忙?
Dim G As Long
Dim K As Long
Dim CardBrand As String
Dim STD As String
Dim CardBrand2 As String
Dim ASI
Dim ID As String
Dim X As Workbook
Dim FinalRow As Long
Dim Finalrow2 As Long
Dim I As Long
Dim TC_STD As String
Dim TC_ASI As String
Dim TC_Perc As Double
Dim TC_Base As Double
Dim TC_ID As String
Application.ScreenUpdating = False
FinalRow = Cells(Rows.Count, "I").End(xlUp).Row
For G = 5 To FinalRow
CardBrand = Sheets("sheet1").Cells(G, 9).Value
STD = Sheets("sheet1").Cells(G, 10).Value
ID = Sheets("sheet1").Cells(G, 5).Value
For K = 2 To 51
CardBrand2 = Sheets("sheet2").Cells(K, 3).Value
If CardBrand = CardBrand2 Then
ASI = Sheets("sheet2").Cells(K, 1).Value
Set X = Workbooks.Open("E:\Partner_Commission_Compiler\Repository\Transaction_Charges.xlsx")
Finalrow2 = X.ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
For I = 1 To Finalrow2
TC_ASI = X.ActiveSheet.Cells(I, 6).Value
TC_STD = X.ActiveSheet.Cells(I, 11).Value
TC_ID = X.ActiveSheet.Cells(I, 1).Value
If (TC_ASI = ASI) And (TC_STD = STD Or TC_STD = "All") And TC_ID = ID Then
TC_Perc = X.ActiveSheet.Cells(I, 19).Value
TC_Base = X.ActiveSheet.Cells(I, 20).Value
ThisWorkbook1.Sheets("Sheet1").Activate
Sheets("sheet1").Cells(G, 13).Value = TC_Perc
Sheets("sheet1").Cells(G, 14).Value = TC_Base
End If
Next I
End If
Next K
Next G
X.Close (False)
Application.ScreenUpdating = True
【问题讨论】:
-
如果缩进,您的代码会更容易阅读和理解。我懒得做,这取决于你。
-
嗨,马克,我更新了它,但是由于某种原因,缩进并没有出现。
-
这对您来说将是一个很大的改变,但是任何在很多单元格上循环的代码都可能需要很长时间,所以在这种情况下我总是使用数组。基本概念是读取单元的循环的每次迭代实际上是代码的软件层和工作表之间的 I/O,因此更多的单元 = 更多的 i/o。您是否使用数组方法,将两张表的内容读入一个数组(每个 1 个)= 2 个 I/O - 然后在代码中执行您想要的任何操作,可能写出另一个数组或更新现有数组,并且最后,将任何更新的或新的数组写回您的目标。 3 个 I/O
-
随着您的代码运行,尽管速度很慢,您的问题可能会在Code review得到更多答案