[英]How to optimize Excel VBA code
How can I optimize this code? 如何优化此代码? It is taking a lot of time to execute.
执行需要很多时间。
Time of Execution 执行时间
What it does: compares a list of cells in a range with another list of cells in another range and if they match, it will replace first value of first range with adjacent value of second value in the other range. 它的作用:将一个范围内的一个单元格列表与另一个范围内的另一个单元格列表进行比较,如果它们匹配,它将用另一个范围内的第二个值的相邻值替换第一个范围的第一个值。
Note: This is a macro that will run on 2000-5000 rows. 注意:这是一个将在2000-5000行上运行的宏。
Sub Update_Btn()
Application.ScreenUpdating = False
Application.Cursor = xlWait
Dim status As Range, r_status As Range, l_status As Range, rl_status As Range
lastRowcs = Worksheets("Lists").Range("E" & Rows.Count).End(xlUp).Row
Set status = Range("D2:D" & lastRow)
Set l_status = Worksheets("Lists").Range("E3:E" & lastRowcs)
For Each r_status In status
For Each rl_status In l_status
If r_status.Value = rl_status.Value Then
rl_status.Offset(0, 1).Copy r_status
End If
Next rl_status
Next r_status
MsgBox "Done"
Application.Cursor = xlDefault
Application.ScreenUpdating = True
Exit Sub
Using arrays - Sheet "GB_Data" Rows: 5,001; Sheet "Lists" Rows: 5,001; Time: 6.438 sec
使用数组-工作
Sheet "GB_Data" Rows: 5,001; Sheet "Lists" Rows: 5,001; Time: 6.438 sec
Sheet "GB_Data" Rows: 5,001; Sheet "Lists" Rows: 5,001; Time: 6.438 sec
Option Explicit
Public Sub UpdateBtn()
Const WS1_NAME = "GB_Data"
Const WS2_NAME = "Lists"
Const START_ROW1 = 2 'in GB_Data
Const START_ROW2 = 2 'in Lists
Const COL1 = "D" 'in GB_Data
Const COL2 = "E" 'in Lists
Const COL3 = "F" 'in Lists
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Worksheets(WS1_NAME)
Dim ws2 As Worksheet: Set ws2 = ThisWorkbook.Worksheets(WS2_NAME)
Dim lr1 As Long: lr1 = ws1.Cells(ws1.Rows.Count, COL1).End(xlUp).Row
Dim lr2 As Long: lr2 = ws2.Cells(ws2.Rows.Count, COL2).End(xlUp).Row
Dim arr1 As Variant: arr1 = ws1.Range(COL1 & START_ROW1 & ":" & COL1 & lr1).Formula
Dim arr2 As Variant: arr2 = ws2.Range(COL2 & START_ROW2 & ":" & COL3 & lr2).Formula
Dim r1 As Long, r2 As Long
For r1 = 1 To UBound(arr1)
For r2 = 1 To UBound(arr2)
If arr1(r1, 1) = arr2(r2, 1) Then arr1(r1, 1) = arr2(r2, 2)
Next r2
Next r1
ws1.Range(COL1 & START_ROW1 & ":" & COL1 & lr1).Formula = arr1
End Sub
. 。
Test data 测试数据
Sheet "GB_Data" - Before 工作表“ GB_Data”- 之前
Sheet "Lists" 工作表“列表”
. 。
Sheet "GB_Data" - After 工作表“ GB_Data”- 之后
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.