Вы можете просто сохранить формулу в столбце G и защитить этот диапазон, чтобы пользователь не мог ее изменить.
В качестве альтернативы, используя обработчик событий Worksheet_Change
:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Range
Dim val as Variant
' In case the change is NOT in column G, then Exit.
If Intersect(Target, Columns("G")) Is Nothing Then Exit Sub
For Each cl in Intersect(Target, Columns("G"))
val = Application.Vlookup(cl.Value, ThisWorkbook.Worksheets("Data").Range("B2:D13"), 3, False)
If IsError(val) Then
cl.Offset(0, 1).Value = 0
Else
cl.offset(0, 1).Value = val
End If
Next
End Sub
Если вам нужно выполнить одно и то же с несколькими столбцами, это немного сложнее, потому что вы можете иметь только один обработчик Worksheet_Change
на данном листе. Так что вам нужно изменить его, как показано ниже. Это может быть немного упрощено, чтобы уменьшить избыточность, но это упражнение для другого вопроса :)
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cl As Range
Dim val as Variant
' Handles column G
If Not Intersect(Target, Columns("G")) Is Nothing Then
For Each cl in Intersect(Target, Columns("G"))
val = Application.Vlookup(cl.Value, ThisWorkbook.Worksheets("Data").Range("B2:D13"), 3, False)
If IsError(val) Then
cl.Offset(0, 1).Value = 0
Else
cl.offset(0, 1).Value = val
End If
Next
End If
If Not Intersect(Target, Columns("J") Is Nothing Then
For Each cl in Intersect(Target, Columns("J"))
val = { your formula used for populating column J } '## UPDATE THIS WITH YOUR PROPER FORMULA/FUNCTION
If IsError(val) Then
cl.Offset(0, 3).Value = 0
Else
cl.offset(0, 3).Value = val
End If
Next
End Sub