これを試して
パースペクティブを理解するために、意図的にコードをいくつかの If ステートメントと重複コードに分割しました。例えば
Cells(Target.Row, 4) = "Some Calculation" '<~~ TotalCost Changes
Cells(Target.Row, 6) = "Some Calculation" '<~~ Margin$ Changes
Cells(Target.Row, 7) = "Some Calculation" '<~~ Price Changes
共通の手順で入れてください。
Error Handling
との使用にも注意してくださいApplication.EnableEvents
。を使用する場合、これら 2 つは必須Worksheet_Change
です。再帰的なアクションがある場合に、コードが無限ループにApplication.EnableEvents = False
陥らないようにします。Error Handling
エラーを処理するだけでなく、エラーメッセージを表示してからコードをリセットApplication.EnableEvents
しTrue
、最後にコードを正常に終了することで、コードが壊れるのを防ぎます。
コード
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Whoa
Application.EnableEvents = False
If Not Intersect(Target, Columns(1)) Is Nothing Then '<~~ When Cost 1 Changes
Cells(Target.Row, 4) = "Some Calculation" '<~~ TotalCost Changes
Cells(Target.Row, 6) = "Some Calculation" '<~~ Margin$ Changes
Cells(Target.Row, 7) = "Some Calculation" '<~~ Price Changes
ElseIf Not Intersect(Target, Columns(2)) Is Nothing Then '<~~ When Cost 2 Changes
Cells(Target.Row, 4) = "Some Calculation" '<~~ TotalCost Changes
Cells(Target.Row, 6) = "Some Calculation" '<~~ Margin$ Changes
Cells(Target.Row, 7) = "Some Calculation" '<~~ Price Changes
ElseIf Not Intersect(Target, Columns(3)) Is Nothing Then '<~~ When Cost 3 Changes
Cells(Target.Row, 4) = "Some Calculation" '<~~ TotalCost Changes
Cells(Target.Row, 6) = "Some Calculation" '<~~ Margin$ Changes
Cells(Target.Row, 7) = "Some Calculation" '<~~ Price Changes
ElseIf Not Intersect(Target, Columns(7)) Is Nothing Then '<~~ When Cost Price Changes
Cells(Target.Row, 5) = "Some Calculation" '<~~ Margin% Changes
Cells(Target.Row, 6) = "Some Calculation" '<~~ Margin$ Changes
End If
LetsContinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
行 1 は保護されており、ユーザーはそれを変更しないと想定しています。ヘッダー行が保護されていない場合は、If
ステートメント内の行番号をチェックして、行 1 を除外します。
ファローアップ
コストの 1 つ (Cost1 の最初) を選択し、Ctrl+C を実行し、Cost 3 の下のすべてのセルを選択して Crl+V を実行すると、値がコピーされますが、選択の最初のセルの TotalCost のみが再計算されます。助けてくれてありがとう!!! – ロナルド・バルディビア 24分前
ああ、あなたが何をしようとしているのかわかります:)
このコードを使用
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Range
On Error GoTo Whoa
Application.EnableEvents = False
If Not Intersect(Target, Columns(1)) Is Nothing Then
For Each cl In Target
Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3)
Next
ElseIf Not Intersect(Target, Columns(2)) Is Nothing Then
For Each cl In Target
Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3)
Next
ElseIf Not Intersect(Target, Columns(3)) Is Nothing Then
For Each cl In Target
Cells(cl.Row, 4) = Cells(cl.Row, 1) + Cells(cl.Row, 2) + Cells(cl.Row, 3)
Next
End If
LetsContinue:
Application.EnableEvents = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub