VBA,优化VLookup /公式

我有一个代码,主要是从macroslogging器完成的。 运行速度非常慢。 我认为这是由于vlookups或公式,任何人都可以帮助使这个代码更快?

我也有过滤和复制和粘贴,怀疑这些正在放慢速度。 也许只是因为它被用在一个大的数据集上。 什么都可以做?

Sub filtering() ' ' filtering Macro ' Dim Rng1 As Range, Rng2 As Range Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet Dim src As Range Set ws1 = ThisWorkbook.Sheets("eodcpos") Set ws2 = ThisWorkbook.Sheets("valumeasure3") Set ws3 = ThisWorkbook.Sheets("File") Set ws4 = ThisWorkbook.Sheets.Add ws4.Name = "lookup" Set ws5 = ThisWorkbook.Sheets("Sample File") Set Rng1 = ws1.UsedRange Set Rng2 = ws2.UsedRange Set src = Worksheets("File").Range("2:757") Set src1 = Worksheets("lookup").Range("2:17783") ' Rng1.AutoFilter Field:=11, Criteria1:= _ "=Traded Position" Rng1.AutoFilter Field:=2, Criteria1:= _ "<>*-C*", Operator:=xlAnd, Criteria2:="<>*-P*" Rng1.AutoFilter Field:=109, Criteria1:=Array _ ("Foreign Exchange Forward", "Foreign Exchange Spot", "Foreign Exchange Swap"), _ Operator:=xlFilterValues Rng1.AutoFilter Field:=33, Criteria1:= _ "<>NA" Rng1.AutoFilter Field:=63, Criteria1:= _ "<>129540", Operator:=xlAnd, Criteria2:="<>135845" Rng2.AutoFilter Field:=5, Criteria1:= _ "=Buy Notional Amount", Operator:=xlOr, Criteria2:="=Sell Notional Amount" '' vlookup file ws4.Activate Range("A1").Value = "val pos id" ws2.Columns(3).Copy Destination:=Sheets("lookup").Columns(1) ws4.Range("A:A").RemoveDuplicates Columns:=Array(1) Range("B1").Value = "eodc pos id" ws1.Columns(2).Copy Destination:=Sheets("lookup").Columns(2) Range("C1").Value = "eodc pos decor id" ws1.Columns(41).Copy Destination:=Sheets("lookup").Columns(3) Range("D1").Value = "pos id lookup" Range("D2").Select ActiveCell = "=VLOOKUP(A2,B:B,1,FALSE)" Selection.AutoFill Destination:=src1.Columns("D") Range("E1").Value = "pos decor id lookup" Range("E2").Select ActiveCell = "=VLOOKUP(fxpd!B2,C:C,1,FALSE)" Selection.AutoFill Destination:=src1.Columns("E") ''Filtering File data ws4.UsedRange.AutoFilter Field:=4, Criteria1:= _ "<>#N/A" ''creating File tab ws4.Columns(4).Copy Destination:=Sheets("File").Columns(1) ''copy and paste filtered values from valuation measure file ws4.Columns(5).Copy Destination:=Sheets("File").Columns(2) ''copy and paste filtered values from fxpd ws3.Activate Range("X2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:BP,COLUMNS(B:BP),FALSE)" ''product classification code Selection.AutoFill Destination:=src.Columns("X") '' ActiveCell.FormulaR1C1 = _ '' "=IF(RIGHT(LEFT(RC[20],64),40)=""ProductType:'FXD';ProductSubType:'SWLEG'"",""XSW"",IF(RIGHT(LEFT(RC[20],64),40)=""ProductType:'FXD';ProductSubType:'FXD'"",""FXD"",""NA""))" '' Range("D2").Select '' Selection.AutoFill Destination:=src.Columns("D") Range("D2").Select ActiveCell = "=IF(RIGHT(LEFT(X2,64),40)=""ProductType:'FXD';ProductSubType:'SWLEG'"",""XSW"",IF(RIGHT(LEFT(X2,64),38)=""ProductType:'FXD';ProductSubType:'FXD'"",""FXD"",""NA""))" Selection.AutoFill Destination:=src.Columns("D") Range("E2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:BK,62,FALSE)" ''counterparty short name / client id Selection.AutoFill Destination:=src.Columns("E") Range("F2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:BK,17,FALSE)" ''source trade id / deal id Selection.AutoFill Destination:=src.Columns("F") Range("G2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:BK,27,FALSE)" ''trade date / contract date Selection.AutoFill Destination:=src.Columns("G") Range("H2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:V,COLUMNS(B:V),FALSE)" ''settlement date / actual settlement date Selection.AutoFill Destination:=src.Columns("H") Range("I2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:BG,COLUMNS(B:BG),FALSE)" ''book runner / source book name Selection.AutoFill Destination:=src.Columns("I") ''lookup into fxpd now Range("J2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:AO,COLUMNS(B:AO),FALSE)" ''pull in pos decorator id Selection.AutoFill Destination:=src.Columns("J") Range("K2").Select ActiveCell = "=VLOOKUP(B2,fxpd!B:U,COLUMNS(B:U),FALSE)" ''spot rate / forward rate Selection.AutoFill Destination:=src.Columns("K") ws3.Columns(12).Copy Destination:=Sheets("File").Columns(11) ''outright rate / forward rate Range("M2").Select ActiveCell = "=VLOOKUP(B2,fxpd!B:I,COLUMNS(B:I),FALSE)" ''buy currency code / buy curency Selection.AutoFill Destination:=src.Columns("M") Range("N2").Select ActiveCell = "=VLOOKUP(B2,fxpd!B:AK,COLUMNS(B:AK),FALSE)" ''sell currency code / sell curency Selection.AutoFill Destination:=src.Columns("N") src.Columns("O") = "LIVE" ''hardcode type name src.Columns("P") = "1" ''hardcode leg number src.Columns("Q") = "S" ''hardcode leg duration code src.Columns("R") = "" ''hardcode option value date Range("S2").Select ActiveCell = "=IF(valumeasure3!E2=""Buy Notional Amount"",VLOOKUP(A2,valumeasure3!C:U, COLUMNS(C:U),FALSE),0)" ''buy currency amt Selection.AutoFill Destination:=src.Columns("S") Range("T2").Select ActiveCell = "=IF(valumeasure3!E2=""Sell Notional Amount"",VLOOKUP(A2,valumeasure3!C:U, COLUMNS(C:U),FALSE),0)" ''sell curency amt Selection.AutoFill Destination:=src.Columns("T") Range("U2").Select ActiveCell = "=VLOOKUP(A2,eodcpos!B:I,8,FALSE)" ''setup for buy risk currency flag Selection.AutoFill Destination:=src.Columns("U") Range("V2").Select ActiveCell = "=IF(U2=""Long"",""B"",""S"")" ''buy risk currency flag Selection.AutoFill Destination:=src.Columns("V") Range("W2").Select ActiveCell = "=IF(S2<>""0"",T2/S2,""0"")" '' Selection.AutoFill Destination:=src.Columns("W") ''headers Range("C1").Value = "" Range("D1").Value = "Product Family Name" Range("E1").Value = "Client name" Range("F1").Value = "deal ID" Range("G1").Value = "trade Date" Range("H1").Value = "settlement" Range("I1").Value = "source book" Range("J1").Value = "PD ID" Range("K1").Value = "forward rate" Range("L1").Value = "forward rate" Range("M1").Value = "buy currency" Range("N1").Value = "sell currency" Range("O1").Value = "type name" Range("P1").Value = "leg number" Range("Q1").Value = "duration" Range("R1").Value = "option value date" Range("S1").Value = "buy ccy amt" Range("T1").Value = "sell ccy amt" Range("U1").Value = "N/A" Range("V1").Value = "buy risk ccy flag" Range("W1").Value = "sell buy ratio" 'headers for Sample Data sheet Range("A1").Value = "Product Family Name" Range("B1").Value = "Client Name" Range("C1").Value = "Deal ID" Range("D1").Value = "Amendment Number" Range("E1").Value = "Trade Date" Range("F1").Value = "Settlement Date" Range("G1").Value = "Book Runner" Range("H1").Value = "Leg Status Type Name" Range("I1").Value = "Leg Number" Range("J1").Value = "Leg Duration Code" Range("K1").Value = "Spot Rate" Range("L1").Value = "Outright Rate" Range("M1").Value = "Buy Currency Code" Range("N1").Value = "Sell Currency Code" Range("O1").Value = "Buy Currency Amt" Range("P1").Value = "Sell Currency Amt" Range("Q1").Value = "Buy Risk Currency Flag" Range("R1").Value = "Option Value Date" Range("S1").Value = "Sell Buy Ratio" ' Copying data from File sheet ws3.Columns(4).Copy Destination:=Sheets("Sample File").Columns(1) ws3.Columns(5).Copy Destination:=Sheets("Sample File").Columns(2) ws3.Columns(6).Copy Destination:=Sheets("Sample File").Columns(3) src.Columns("D") = "1" ''hardcode amendment number ws3.Columns(7).Copy Destination:=Sheets("Sample File").Columns(5) ws3.Columns(8).Copy Destination:=Sheets("Sample File").Columns(6) ws3.Columns(9).Copy Destination:=Sheets("Sample File").Columns(7) src.Columns("H") = "LIVE" ''hardcode type name src.Columns("I") = "1" ''hardcode leg number src.Columns("J") = "S" ''hardcode leg duration code ws3.Columns(11).Copy Destination:=Sheets("Sample File").Columns(11) ws3.Columns(11).Copy Destination:=Sheets("Sample File").Columns(12) ws3.Columns(13).Copy Destination:=Sheets("Sample File").Columns(13) ws3.Columns(14).Copy Destination:=Sheets("Sample File").Columns(14) ws3.Columns(19).Copy Destination:=Sheets("Sample File").Columns(15) ws3.Columns(20).Copy Destination:=Sheets("Sample File").Columns(16) ws3.Columns(21).Copy Destination:=Sheets("Sample File").Columns(17) src.Columns("R") = "" ''hardcode option value date ws3.Columns(22).Copy Destination:=Sheets("Sample File").Columns(19) End Sub 

不要Select单元格!

  Range("D2").Select ActiveCell = whatever Selection.AutoFill Destination:=src.Columns("D") 

应该

  With Range("D2") .formula = whatever .autofill Destination := src.columns(4) end with 

使用所有VLookup方程,您可能会在macros的一开始就使用Application.Calculation = xlCalculationManual来加快速度,而当您的macros完成时,您应该将计算设置回Application.Calculation = xlCalculationAutomatic ,并且可能使用error handling请确保这发生在这里讨论: https : //stackoverflow.com/a/31923310/3546415

另外,您正在自动填充整个列。 这可能不是你想要的,它会真的放慢你的速度。

如果您将自动填充限制在这样的有限范围内,则自动填充在第99行停止,您将加快速度。

 Range("E2").AutoFill Destination:=Range("E2:E99") 

而你的VLookups可能会被改进,如果你把它们限制在特定的范围内,比如这个eodcpos!$B$1:$BK$9而不是像这个eodcpos!B:BK那样的整个列eodcpos!B:BK

 Range("E2") = "=VLOOKUP(A2,eodcpos!$B$1:$BK$99,62,FALSE)" 

不妨也做Application.ScreenUpdating = False 。 而且,如果您使用Google VBA优化或其它方式,则可以使用其他一般性改进function来减less几秒钟的时间。

除此之外,你已经有了很多的代码,可能还有很大的改进空间。 就像你说的,由于实际的电子表格,你可能会遇到缓慢。

如果你仍然有问题。 我build议通过你的代码,并在这样的各个点报告时间…

 Debug.Print Now & "Say what the code just did here" 

然后,您可以将您的慢节缩减为特定的操作,并将重点放在最耗费时间的部分。

我想这是所有VLookups的自动填充和重新计算。 当广泛使用VLookup会真的放慢速度。 如果缓慢仍然是一个问题,即使不是自动重新计算,然后Id考虑如何重新devise电子表格和/或VBA使用VLookupsless。

至于速度,你可以在子的开头使用以下内容:

 With Application .ScreenUpdating = False .DisplayAlerts = False End With 

并在子结尾恢复它们

 With Application .ScreenUpdating = True .DisplayAlerts = True End With 

这个代码的主要标志是它非常脆弱。 行和列的范围和引用是硬编码的整个子,稍有改变就会导致事情崩溃。

另外,您正在复制整个列,您可以将副本限制在数据的范围内,并可能将连续的副本组合到单个事务中。

您可以尝试在代码开始时closures屏幕更新。 Application.ScreenUpdating = False

请记住在代码结束时将其重新打开。 Application.ScreenUpdating = True