2017-04-12 87 views
0

我正在努力與此代碼請幫助我。我想記錄這個代碼所做的更改,但它逐個單元格,這使得它變慢。我的活動工作表運行時間爲200ms,在代碼執行其工作值更改時非常快。有沒有什麼方法可以同時顯示值而不是通過每個單元格。如果我的請求甚至沒有任何意義,請在我的腦海中充滿混亂。需要快速計算數據

Private Sub Worksheet_Change(ByVal Target As Range) 

Const Scope = "G9:H9,G11:H11,G13:H13,G15:H15,G17:H17,G19:H19,G21:H21,G23:H23,G25:H25,G27:H27,G29:H29,G31:H31,G33:H33,G35:H35,G37:H37,G39:H39,G41:H41,G43:H43,G45:H45,G47:H47,G49:H49,G51:H151,G53:H53,G55:H55,G57:H57,G59:H59,G61:H61,G63:H63,G65:H65,G67:H67" ' monitoring area 

Static oData As New Dictionary 
Dim rCells As Range 
Dim oCell 
Dim dDelta 

Set rCells = Application.Intersect(Target, Target.Parent.Range(Scope)) 
If Not rCells Is Nothing Then 
    For Each oCell In rCells 
     With oCell 
      dDelta = oData(.Address) 
      .Offset(0, 1).Value = dDelta 
      oData(.Address) = .Value 
     End With 
    Next 
End If 

末次

+0

使用數組在內存中執行所有操作會比在表單上直接進行每個更改要快。另外,請注意,表中的每個「更改」都會觸發另一個「更改事件」。所以,你編碼的子程序一遍又一遍地調用(遞歸)。在工作表上進行這些更改時,應關閉事件。另一點:字典「oData」在哪裏被填充?請將這部分包含到上面的代碼片段中。 – Ralph

回答

1

你試過關掉屏幕刷新?在你的Sub行下面加上這一行,看看它是否對速度有幫助。

Application.ScreenUpdating = False