Попробуйте
Я намеренно с разбивкой код на несколько Если заявления и дублировать коды для понимания перспективы. Например,
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
. Эти два являются ДОЛЖНЫ при работе с 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
Followup
я выбираю один из затрат (первый из Cost1), сделайте Ctrl + C, выберите все ячейки по цене 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
Ваш вопрос? – texasbruce
Считаете ли вы использование формул и использование VBA (двойной щелчок/кнопка,/etc), чтобы восстановить формулу в случае, если пользователь захочет? – CaBieberach