438 Ошибка времени выполнения

Я пытаюсь сделать так, чтобы при изменении одной из конкретных ячеек в моем коде отображалось сообщение, но я получаю следующее сообщение об ошибке «объект ошибки времени выполнения 438 не поддерживает это свойство или метод». Не совсем уверен, что это значит. может кто-нибудь, пожалуйста, помогите мне понять. Вот код:

 Private Sub Worksheet_Change(ByVal Target As Range)

 If Target.Adress = "F48,I48,L48,F50,I50,L50,I52,L52,N52" Then
     MsgBox "You are about to change an AP-42 Emision Factor"

 End If
 End Sub

person David Van der Vieren    schedule 04.04.2013    source источник
comment
Target.Address правильное имя свойства !!   -  person Kazimierz Jawor    schedule 05.04.2013
comment
Я сделал глупую ошибку! По-прежнему кажется, что сообщение не отображается при изменении ячеек ... любые идеи   -  person David Van der Vieren    schedule 05.04.2013


Ответы (3)


Это то, что вы пытаетесь?

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("F48,I48,L48,F50,I50,L50,I52,L52,N52")) Is Nothing Then
        MsgBox "You are about to change an AP-42 Emision Factor"
    End If
End Sub

Стоит прочитать: MS Excel аварийно завершает работу, когда код vba работает

person Siddharth Rout    schedule 04.04.2013
comment
Я думал об использовании Intersect, но не смог найти быстрого решения, в котором Intersect проверял бы, точно ли совпадают и Target, и другой диапазон. В вашем коде один диапазон должен находиться внутри другого, но Target может быть больше, чтобы вернуть истину. У вас есть какие-нибудь простые идеи, как использовать intersect для точного соответствия? Если да, добавьте в качестве дополнительной опции для +1 :) - person Kazimierz Jawor; 05.04.2013
comment
Я считаю, и могу ошибаться, но то, что Дэвид пытается сделать (и он должен это подтвердить), даже если одна из ячеек в диапазоне "F48,I48,L48,F50,I50,L50,I52,L52,N52" изменится, должно появиться окно сообщения, о котором позаботится приведенный выше код. - person Siddharth Rout; 05.04.2013
comment
давайте продолжим обсуждение в чате - person Siddharth Rout; 05.04.2013
comment
Это правильно, это то, что я пытаюсь сделать. Однако у меня возникла проблема с кодом, который вы создали, потому что он не запускается автоматически. Этот код должен быть модулем или под конкретным листом будут внесены изменения? - person David Van der Vieren; 05.04.2013

1-й, как указано в комментарии, используйте Target.Address, которое является правильным именем свойства.

2-е, ваше if утверждение никогда не вернет истину. Target.Address всегда будет возвращать что-то вроде этого: $E$2, $E$3:$E$4 и так далее ... В вашей ситуации вы должны использовать что-то вроде методов Intersect или Union.

Отредактировано - возможное решение с использованием метода Union:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngTMP As Range
    Set rngTMP = Range("F48,I48,L48,F50,I50,L50,I52,L52,N52")

If Union(Target, rngTMP).Address = Union(rngTMP, rngTMP).Address Then
        MsgBox "Ok"
End If
End Sub
person Kazimierz Jawor    schedule 04.04.2013
comment
Что такое метод пересечения союза - person David Van der Vieren; 05.04.2013
comment
кстати, вы уверены, что измените все 9 ячеек сразу, что трудно представить, если эта область не является непрерывной. - person Kazimierz Jawor; 05.04.2013
comment
+1 за предложение Intersect - person Siddharth Rout; 05.04.2013

Кодекс, который дал Сиддхарт, творит чудеса, поэтому большое спасибо. У меня возникла проблема, потому что я пытался создать два события Worksheet_Change, написав код следующим образом:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$D$8" Then
    Toggle_Rows
End If
End Sub

Private Sub Worksheet_Change(Byval Target As Range)
    If Not Intersect(Target, Range("F48,I48,L48,F50,I50,L50,I52,L52,N52")) Is Nothing Then
        MsgBox "You are about to change an AP-42 Emision Factor"
    End If
End Sub

Как вы понимаете, это не сработало, я получил ошибку «Неопределенное имя». Итак, после некоторого исследования, двое могут записать эти две функции как одну:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$D$8" Then
    Toggle_Rows
End If

    If Not Intersect(Target, Range("F48,I48,L48,F50,I50,L50,I52,L52,N52")) Is Nothing Then
        MsgBox "You are about to change an AP-42 Emision Factor"
    End If
End Sub

Спасибо всем за помощь!

person David Van der Vieren    schedule 05.04.2013