我正在尝试创建一个代码,当特定工作表中单元格的值更改时,该代码将执行宏。我在工作表模块中使用以下代码:
Private Sub Worksheet_Change (ByVal Target As Range)
If Target.Address = Range("C3") Then
Macro2
End If
End Sub
但是,我收到“语句结尾预期”错误。
谢谢!
答案 0 :(得分:4)
如果您采用帖子中显示的代码(不是呈现的代码,而是帖子中的实际字符/编辑问题以到达此处),请从此处复制代码,并将其粘贴到VBE中,{ {1}}(加上怪异的尾随空格)被认为是一个单词(Ctrl + ArrowLeft或Ctrl + ArrowRight一直跳跃而不停,确认这一点)
这完全弄乱了所有内容,并且您会得到奇怪的编译器和语法错误:
VBA期望令牌由ASCII码32(一个普通的旧空格字符)分隔,但是介于Private Sub Worksheet_Change
,Private
,Sub
和开头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