VBA中Target.Address的“语句的预期结尾”错误

时间:2019-10-03 20:27:16

标签: excel vba

我正在尝试创建一个代码,当特定工作表中单元格的值更改时,该代码将执行宏。我在工作表模块中使用以下代码:

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

但是,我收到“语句结尾预期”错误。

谢谢!

3 个答案:

答案 0 :(得分:4)

如果您采用帖子中显示的代码(不是呈现的代码,而是帖子中的实际字符/编辑问题以到达此处),请从此处复制代码,并将其粘贴到VBE中,{ {1}}(加上怪异的尾随空格)被认为是一个单词(Ctrl + ArrowLeft或Ctrl + ArrowRight一直跳跃而不停,确认这一点)

这完全弄乱了所有内容,并且您会得到奇怪的编译器和语法错误:

compile error: invalid outside procedure

VBA期望令牌由ASCII码32(一个普通的旧空格字符)分隔,但是介于Private Sub Worksheet_ChangePrivateSub和开头Worksheet_Change之间(以及此后的每个空格)看起来像一个空格,但实际上是一个特殊字符,经常在网站和博客文章中看到(例如,使代码块正确包装),称为不间断(HTML实体()。

请勿直接从网站上复制粘贴代码(尤其是博客文章;特别是Stack Overflow很好,除非文章作者有意地种植了不间断的空格)。自己输入。

实际上,当涉及到事件处理程序时,甚至不要自己键入它们-让VBE为您创建过程存根,这样就可以确保您具有正确的签名。只需从代码窗格顶部的左侧下拉列表中选择 ,然后在右侧下拉列表中选择Worksheet-Change处理程序将自动添加。

答案 1 :(得分:1)

target.address returns a string with the address of the range。我认为您要尝试做的是查看target是否实际上是range("C#")。在这种情况下,最好使用Intersect

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

基本上,您是说“ if经历了变化的范围与单元格C3相交(交集不算什么)then

答案 2 :(得分:1)

这可能是使用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