所以这是我的代码,我试图将包含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
答案 0 :(得分:1)
一些建议:
由于您正在禁止ScreenUpdating,而且(非常正确)您没有使用复制和粘贴将数据从X.ActiveSheet移动到Sheet1,那么您真的不需要“ThisWorkbook1.Sheets”这一行。 Sheet1“)。激活”在循环中反复重复。即使Sheet1已经被激活,激活呼叫也可能非常耗时,并且它不像您正在翻转哪个工作表处于活动状态。
此外,您在循环中反复重新打开“E:\ Partner_Commission_Compiler \ Repository \ Transaction_Charges.xlsx”。再次不必要,毫无疑问,当您不需要时,会消耗越来越多的CPU时间。
在任何循环之前,应移动以下两行:
Set X = Workbooks.Open("E:\Partner_Commission_Compiler\Repository\Transaction_Charges.xlsx")
Finalrow2 = X.ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
答案 1 :(得分:1)
除了cybermike的好建议(不在每个循环上打开文件应节省大量时间),您可以尝试这些更改。
改变这个:
CardBrand2 = Sheets("sheet2").Cells(K, 3).Value
If CardBrand = CardBrand2 Then
到这个
If Sheets("sheet2").Cells(K, 3) = Sheets("sheet2").Cells(K, 3).Value
你有:
Dim ASI
其中声明为Variant
。每次代码使用ASI
时,Excel都必须解密ASI
中存储的数据类型,以确定如何分配或比较它。如果您将其声明为特定类型,则可以跳过该确定步骤,这将加快执行速度。由于您将其分配给单元格的内容,因此您可以指定String
或Integer
。如果它有时是一个,有时是另一个,Dim as String
,那么明确CStr(cell).value
并将所有比较作为字符串进行。它将再次消除Excel所需的时间,以确定如何处理这些值。
您可以替换:
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
使用:
If x.cells(i,6) = Sheets("sheet2").Cells(K, 1) AND _
(x.cells(1,11) = Sheets("sheet1").Cells(G, 10) OR _
x.cells(1,11) = "All") AND _
x.Cells(i,1) = Sheets("sheet1").Cells(G, 5) Then
Sheets("sheet1").Cells(G, 13).Value = X.Cells(I, 19)
Sheets("sheet1").Cells(G, 14).Value = X.Cells(I, 20)
在每个循环中删除所有这些分配将节省一些处理时间。但是,读取代码有点困难,因此您可能希望在注释中留下一些伪代码,以帮助记住所有这些不同单元格所代表的内容。