У меня есть диапазон (объединенная ячейка) M5:O5, который должен вызвать MsgBox следующим образом:
Что у меня есть на данный момент:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim billtoanswer As Integer
'If IsNull(Range("M5:O5")) Then <-- other stuff I was trying
'End
If (Application.Intersect(Range("M5:O5"), Target) Is Nothing) Then
End If
billtoanswer = MsgBox("Use this address for Bill To?", vbYesNo + vbQuestion, "Bill To?")
If billtoanswer = vbYes Then
Range("F26").Value = Range("M4").Value & ", " & Range("M5").Value
End If
End If
End Sub
Microsoft® Excel® для Microsoft 365 MSO (версия 2404, сборка 16.0.17531.20190), 64-разрядная версия


Private Sub Worksheet_Change(ByVal Target As Range)
Dim billtoanswer As Integer
If (Application.Intersect(Range("M5:O5"), Target) Is Nothing) Then
' Skip
Else
If Trim(CStr(Target.Text)) = "" Then
' Skip
Else
billtoanswer = MsgBox("Use this address for Bill To?", vbYesNo + vbQuestion, "Bill To?")
If billtoanswer = vbYes Then
Range("F26").Value = Range("M4").Value & ", " & Range("M5").Value
End If
End If
End If
End Sub
Приложение.EnableEvents
If Intersect..., но в худшем случае, если вы, например, запись в целевую ячейку (M5) во время выполнения кода события, повторное срабатывание события приведет к сбою Excel.Цель
Target — это ссылка на все ячейки, которые были изменены. Если вы отслеживаете изменение в одной (целевой) ячейке, используйте переменную (targetCell) в продолжении кода, ссылаясь на пересечение ее (одной ячейки) и Target (не обязательно это должна быть одна ячейка). Используйте Target только в том случае, если вы убедились, что это одна ячейка, например. If Target.Cells.CountLarge = 1 Then.Листовой модуль, например. Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
ChangeBillingAddress Target
End Sub
Стандартный модуль, например. Module1, modEvents... (или тот же модуль листа)
Sub ChangeBillingAddress(ByVal Target As Range)
Dim ws As Worksheet: Set ws = Target.Worksheet
Dim targetCell As Range: Set targetCell = ws.Range("M5")
If Intersect(targetCell, Target) Is Nothing Then Exit Sub
If Len(CStr(targetCell.Value)) = 0 Then Exit Sub
Dim BillToAnswer As Long
BillToAnswer = MsgBox("Use this address for Bill To?", _
vbYesNo + vbQuestion, "Bill To?")
If BillToAnswer = vbNo Then Exit Sub
Application.EnableEvents = False ' prevent retriggering the event
ws.Range("F26").Value = CStr(ws.Range("M4").Value) _
& ", " & CStr(targetCell.Value)
Application.EnableEvents = True
End Sub
Я был так близко!!! Но не смог выяснить определение, если отредактировано ничего: If Trim(CStr(Target.Text)) = "" Тогда... и вот оно!!! Спасибо @Tin Bun