Vba 更改单元格(列表值)值时的消息

Vba 更改单元格(列表值)值时的消息,vba,validation,popup,Vba,Validation,Popup,我对VBA比较陌生 我有一个表范围(E16:DW39),其中每个单元格都有一个下拉菜单(数据验证=列表),用于手动选择值,但同时我有一个宏用于从另一个工作表复制数据(填充表的两种方式) 每次用户手动更改任何单元格值时,我都希望收到一条消息 我希望仍然能够独立地运行宏(正如我注意到的,在添加以下代码之后,我不能这样做)。这个交叉检查我只想用于手动数据输入 为了进行此检查,我有以下代码(在具体表格中): 我得到以下错误 运行时错误91:未设置对象变量或带块变量 当我试图从下拉菜单中将一个单元格值更改

我对VBA比较陌生

我有一个表
范围(E16:DW39)
,其中每个单元格都有一个下拉菜单
(数据验证=列表)
,用于手动选择值,但同时我有一个宏用于从另一个工作表复制数据(填充表的两种方式)

每次用户手动更改任何单元格值时,我都希望收到一条消息

我希望仍然能够独立地运行宏(正如我注意到的,在添加以下代码之后,我不能这样做)。这个交叉检查我只想用于手动数据输入

为了进行此检查,我有以下代码(在具体表格中):

我得到以下错误

运行时错误91:未设置对象变量或带块变量

当我试图从下拉菜单中将一个单元格值更改为另一个单元格值时,我得到了上面的错误,你知道如何解决这个问题吗


请注意,由于此代码,我无法运行以前运行的精细复制宏。

错误代码是因为当两个范围不相交时,您引用的是空对象。修正:

If Intersect(myRange, Target) Is Nothing then...
如果要处理仅从Excel GUI而非代码中发生的更改,通常的方法是在宏的开头使用
Application.EnableEvents=False
,然后在宏的结尾使用
Application.EnableEvents=true
。这样,宏内部所做的任何更改都不会切换事件处理

Private Sub Worksheet_Change(ByVal Target As Range)
        On Error goto finish
        Dim myRange As Range

        Set myRange = Range("E16:DW39") ' <~~ dont forget "Set"
        If Not Intersect(myRange, Target) Is Nothing Then
            MsgBox ...
        End If
    finish:
        Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
错误转到完成时
将myRange变暗为Range

设置myRange=Range(“E16:DW39”)“A.S.H谢谢您的回复,但即使添加Nothing也不会改变任何内容,同样的错误再次出现。我进一步根据您的建议更改了代码,现在可以运行上一个宏,但当我更改单元格值时,仍然无法获得所需的弹出警告/消息。私有子工作表_更改(ByVal目标作为范围)错误转到完成Dim myRange作为范围myRange=Range(“E16:DW39”)->任务混合表如果Intersect(myRange,目标)为空,则Application.EnableEvents=False MsgBox“任务计划未加工”结束如果完成:Application.EnableEvents=True结束Sub@Yanis我懂了,这是因为您应该为对象使用Set:
Set myRange=Range(“E16:DW39”)
(编辑了答案)@Yanis,如果目标和范围重叠,您想调用您的子例程,如果不重叠,则调用消息框,我是否理解正确?我不想调用任何子例程。子例程在单击按钮时执行,但在您提出建议之前被阻止。弹出消息仍然不起作用,这是否与单元格正在使用值列表有关,因此无法识别显示的值是否已更改?这里只是猜测。
Private Sub Worksheet_Change(ByVal Target As Range)
        On Error goto finish
        Dim myRange As Range

        Set myRange = Range("E16:DW39") ' <~~ dont forget "Set"
        If Not Intersect(myRange, Target) Is Nothing Then
            MsgBox ...
        End If
    finish:
        Application.EnableEvents = True
End Sub