2

非常に複雑な Excel ファイルがあり、かなり前にデータベースに置き換える必要がありましたが、現時点では不可能です。特定の列にいつ変更が加えられたかを記録し、変更が行われた日付を記録する方法を実装する必要があります。

次のスクリプトを書きました。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim VRange As Range, cell As Range
Dim Vrange2 As Range, cell2 As Range
Dim Vrange3 As Range, Cell3 As Range
Dim Vrange4 As Range, Cell4 As Range
Dim Vrange5 As Range, Cell5 As Range
Dim Vrange6 As Range, Cell6 As Range

Application.Calculation = xlCalculationManual
Set VRange = Range("J5:J7000")
For Each cell In Target
If Union(cell, VRange).Address = VRange.Address Then
cell.Offset(, 8) = "TS on " & Date
End If
Next cell

Set Vrange2 = Range("K5:K7000")
For Each cell2 In Target
If Union(cell2, Vrange2).Address = Vrange2.Address Then
cell2.Offset(, 7) = "GS on " & Date
End If
Next cell2

Set Vrange3 = Range("M5:M7000")
For Each Cell3 In Target
If Union(Cell3, Vrange3).Address = Vrange3.Address Then
Cell3.Offset(, 5) = "P on " & Date
End If
Next Cell3

Set Vrange4 = Range("O5:O7000")
For Each Cell4 In Target
If Union(Cell4, Vrange4).Address = Vrange4.Address Then
Cell4.Offset(, 3) = "GD on " & Date
End If
Next Cell4

Set Vrange5 = Range("P5:P7000")
For Each Cell5 In Target
If Union(Cell5, Vrange5).Address = Vrange5.Address Then
Cell5.Offset(, 2) = "TD on " & Date
End If
Next Cell5

Application.Calculation = xlCalculationAutomatic 'doesnt do anything
End Sub

時計仕掛けとして機能しますが、スプレッドシートの性質上、複数のセルが変更された場合、再計算に永遠に時間がかかります (セルが変更された後に再計算され、マクロが実行され、別のセルが変更されるため、再度再計算されます)。変更されたすべての単一のセルに対してプロセスが繰り返されます) 50 個のセルを変更すると、1.5 秒の計算時間は耐えられなくなります。

マクロの実行が終了した後に自動化する必要があるため、挿入Application.Calculation=xlCalculationManualは役に立たなかったのでApplication.Calculation=xlCalculationAutomatic、最後に挿入する必要があります。

私はここで私の深みから抜け出しているので、助けていただければ幸いです。

4

1 に答える 1

1

モードの変更とWorksheet_Change一緒にイベントを処理する場合は、常にこれを使用します。Calculation

Application.EnableEvents = False

すべてのセルが変更されたら、反対の方法を使用して再度有効にします。

Application.EnableEvents = True
于 2015-02-08T01:10:55.397 に答える