2017-04-12 6 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 

End Subの

+0

アレイでメモリ内のすべてを行うのは、シート上のすべての変更を直接行うよりも速くなります。また、シート上の各「変更」が別の「変更イベント」を引き起こすことにも注意してください。だから、あなたがコード化したサブは繰り返し呼び出されています(再帰的に)。これらの変更をシート上で行っている間は、イベントをオフにする必要があります。もう1つのポイント:辞書 'oData'にはどこに値が入りますか?上記のコードスニペットにこの部分を含めてください。 – Ralph

答えて

1

を使用すると、画面更新をオフにしようとしたことがありますか?あなたのSubラインのすぐ下にこのラインを追加し、それがスピードを助けるかどうかを見てください。

Application.ScreenUpdating = False 
関連する問題