Ошибка «Ожидаемый конец оператора» для Target.Address в VBA - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь создать код, который выполняет макрос при изменении значения ячейки на конкретном листе. Я использую следующий код в модуле Sheet:

Private Sub Worksheet_Change (ByVal Target As Range)
  If Target.Address  =  Range("C3") Then
    Macro2
  End If
End Sub

Однако я получаю сообщение об ошибке «Ожидаемый конец заявления».

Спасибо!

Ответы [ 3 ]

4 голосов
/ 04 октября 2019

Если вы возьмете код, который отображается в вашем сообщении (не отображенный код, а действительные символы в сообщении / отредактируйте вопрос, чтобы попасть туда), скопируйте код оттуда и вставьте его в VBE, Private Sub Worksheet_Change (плюс странный завершающий пробел) считается одним словом (Ctrl + ArrowLeft или Ctrl + ArrowRight, перепрыгивая весь путь без всяких остановок, подтверждает это)

Это по-королевски все запутывает, и вы становитесь страннымошибки компилятора и синтаксиса:

compile error: invalid outside procedure

VBA ожидает, что токены будут разделены кодом ASCII 32 (простой старый символ пробела), но между Private, Sub, Worksheet_Change, и открытие ( (и каждый пробел после этого) выглядит как пробел, но на самом деле это специальный символ, часто встречающийся на веб-сайтах и ​​в блогах (например, для правильного переноса блоков кода). неразрывный пробел (сущность HTML  ).

Не копируйте и не вставляйте код напрямую с веб-сайтов ( особенно сообщений в блоге; переполнение стекаобычно едаже если автор сообщения специально не посадил неразрывные пробелы). Введите его сами.

На самом деле, когда речь идет об обработчиках событий, даже не вводите их сами - позвольте VBE создать для вас заглушку процедуры, чтобы вы гарантированно имели правильную подпись. Просто выберите Worksheet в раскрывающемся меню слева в верхней части панели кода, затем выберите Change в раскрывающемся меню справа - обработчик Private Sub Worksheet_Change будет добавлен автоматически.

1 голос
/ 03 октября 2019

Это, вероятно, самый классический способ использования Intersect(Target, Range()):

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C3")) Is Nothing Then
        Debug.Print Target.Address
    End If
End Sub

Однако, если по какой-то причине необходим .Address, то это работаетточно так же:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = Range("C3").Address Then
        Debug.Print Target.Address
    End If
End Sub
1 голос
/ 03 октября 2019

target.address возвращает строку с адресом диапазона . Я думаю, что вы пытаетесь сделать, это посмотреть, если target на самом деле range("C#"). В этом случае вам лучше использовать Intersect:

 If Not Intersect(Target, Range("C3")) Is Nothing Then

По сути, вы говорите: "if диапазон, в котором произошли изменения, пересекается с ячейкой C3 (пересечение не является ничем) then"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...