Vba 选择数据验证后运行事件宏

Vba 选择数据验证后运行事件宏,vba,excel,events,Vba,Excel,Events,我在工作表上建立了一个名为“报告”的数据验证列表,每次从列表中选择一项时,我都需要运行一个宏。现在我有了下面的代码,但它不起作用。它确实在VBA中运行,但当我在工作表中选择项目时,它不会运行,似乎我没有引用宏 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address(True, True) = "$B$3" Then Select Case Target

我在工作表上建立了一个名为“报告”的数据验证列表,每次从列表中选择一项时,我都需要运行一个宏。现在我有了下面的代码,但它不起作用。它确实在VBA中运行,但当我在工作表中选择项目时,它不会运行,似乎我没有引用宏

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Address(True, True) = "$B$3" Then
        Select Case Target
             Case "ABCP"
                Call Macro1
             Case "Accounting Policy"
                Call Macro2
             Case Else
                  'Do Nothing
        End Select
    End If
End Sub

如果要在更改B3(从数据验证列表中选取)中的值时运行此过程,则需要的是事件宏,而不是工作表\u SelectionChange

此外,如果工作表上的任何内容将要更改,则您需要禁用事件,以便事件宏不会试图在其自身上运行

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$3" Then
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        Select Case Target.Value2
             Case "ABCP"
                Call Macro1
             Case "Accounting Policy"
                Call Macro2
             Case Else
                  'Do Nothing
        End Select
    End If
bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

当B3从列表中选择了一个新值时,这将启动正确的子过程。如果m Macro1和Macro2仍然存在问题,则必须提供更多详细信息(和代码)。

如果您希望在更改B3中的值时运行该过程(从数据验证列表中选择,则需要一个事件宏,而不是工作表\u选择更改

此外,如果工作表上的任何内容将要更改,则您需要禁用事件,以便事件宏不会试图在其自身上运行

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$B$3" Then
        On Error GoTo bm_Safe_Exit
        Application.EnableEvents = False
        Select Case Target.Value2
             Case "ABCP"
                Call Macro1
             Case "Accounting Policy"
                Call Macro2
             Case Else
                  'Do Nothing
        End Select
    End If
bm_Safe_Exit:
    Application.EnableEvents = True
End Sub

当B3从列表中选择了一个新值时,这将启动正确的子过程。如果m Macro1和Macro2仍然存在问题,您必须提供更多详细信息(和代码)。

以上代码对我来说似乎工作正常

您是否将代码放在工作表代码中?相对于模块


以上代码对我来说似乎很好

您是否将代码放在工作表代码中?相对于模块


每次您在工作表中选择范围时,都会调用
工作表\u SelectionChange(ByVal Target As Range)
sub。您选择的范围将作为sub中的
Target
参数传递。只有在您选择“$B$3”时,才会执行
If
语句中的代码单元格。如果我使用工作表\u更改怎么办?每次单元格值更改
工作表\u SelectionChange(ByVal Target作为范围)时,都会调用sheet.Change每当您在工作表中选择范围时,都会调用
sub。您选择的范围将作为sub中的
Target
参数传递。只有在您选择“$B$3”时,才会执行
If
语句中的代码单元格。如果我使用“工作表更改”会怎么样?每次单元格值更改时都会调用“工作表更改”。谢谢您这么快的回答。只是一个愚蠢的问题,我应该将此代码放在模块中的宏代码之后,还是应该将其放在工作表中?类似“工作表更改”的事件宏仅从工作表代码表而不是模块代码表中操作。在工作表的“名称”选项卡上单击鼠标右键,然后选择“查看代码”。当VBE打开时,将其粘贴到名为“Book1-Sheet1(代码)”的工作表中。我觉得它现在离我很近了,但为什么在我运行宏后要求我选择它?我从未见过VBA问我任何问题,除非我专门为此编写了代码。请检查您的代码。@Jeeped我的宏没有启动(我已将代码放在模块2中),知道为什么吗?感谢您这么快的回答。只是一个愚蠢的问题,我应该将此代码放在模块中的宏代码之后,还是应该将其放在工作表中?类似“工作表更改”的事件宏仅从工作表代码表而不是模块代码表中操作。右键单击工作表的“名称”选项卡并选择“查看代码”。当VBE打开时,粘贴到名为Book1-Sheet1(Code)的工作表中。我觉得它现在离我很近,但为什么它要求我在运行宏后选择它?我从未见过VBA问我任何问题,除非我专门为此编码。检查你的代码。@Jeeped我的宏没有启动(我已将代码放在模块2中),知道为什么吗?