单击特定单元格时如何触发宏

时间:2019-09-17 14:25:18

标签: excel vba

我想触发两个独立的宏,每个宏均基于不同的单元格。具体来说,我想在单击单元格E8时触发Orange宏。单击单元格E9时的Factiva宏。到目前为止,这是我想出的代码,但是不起作用...这两个宏与显示图形(普通条形图)有关!

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count = 1 Then
        If Not Intersect(Target, Range("E9")) Is Nothing Then
            Call Factiva
        End If
    End If
End Sub

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count = 1 Then
        If Not Intersect(Target, Range("E8")) Is Nothing Then
            Call Orange
        End If
    End If
End Sub

Sub Factiva()
'
' Factiva Macro
'

'
    ActiveSheet.Shapes.Range(Array("factiva")).Visible = msoFalse
    ActiveSheet.Shapes.Range(Array("factiva")).Visible = msoTrue
    Application.CommandBars("Selection").Visible = False
End Sub

Sub Orange()
'
' Orange Macro
'

'
    ActiveSheet.Shapes.Range(Array("Orange Business")).Visible = msoFalse
    ActiveSheet.Shapes.Range(Array("Orange Business")).Visible = msoTrue
    Application.CommandBars("Selection").Visible = False
End Sub

1 个答案:

答案 0 :(得分:1)

在同一模块中不能有两个具有相同名称的过程,在Worksheet模块中不能具有两个用于相同工作表事件的处理程序。 Option Explicit在模块顶部的声明部分中无效(在过程之间不能使用它)。

您需要SelectionChange处理程序来确定选择了哪个单元格,并决定要相应地调用哪个宏。

Option Explicit

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count <> 1 Then Exit Sub 'bail out immediately instead of nesting

    Select Case True
        Case Not Intersect(Target, Range("E9")) Is Nothing
            Factiva 'note: Call keyword is redundant

        Case Not Intersect(Target, Range("E8")) Is Nothing
            Orange 'note: Call keyword is redundant

        'Case ...

    End Select
End Sub

请注意,如果这是唯一需要调用FactivaOrange过程的代码,则可以将它们都设置为Private。另外,请考虑使用以动词开头的有意义的名称重命名您的过程,例如ShowFactivaShapeShowOrangeBusinessShape

实际上,您可以参数化代码并删除两者之一:

Private Sub ShowShape(ByVal shapeName As String)
    ActiveSheet.Shapes(shapeName).Visible = msoTrue
    Application.CommandBars("Selection").Visible = False
End Sub

请注意,在将msoFalse设置为msoTrue之前,无需将其设置为可见性,并且Shapes.Range(Array(...))是多余的,因为您只对单名为Shape

SelectionChange处理程序将如下所示:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Selection.Count <> 1 Then Exit Sub 'bail out immediately instead of nesting

    Select Case True
        Case Not Intersect(Target, Range("E9")) Is Nothing
            ShowShape "Factiva"

        Case Not Intersect(Target, Range("E8")) Is Nothing
            ShowShape "Orange Business"

        'Case ...

    End Select
End Sub

如果在显示“ Factiva”时需要隐藏“ Orange Business”,请考虑执行类似的HideShape程序,反之亦然,或者考虑将Optional ByVal isVisible As Boolean = True参数添加到{{1 }},然后您可以将相同的过程用于这两个目的:

ShowShape

这样,您可以根据需要轻松显示/隐藏形状:

Private Sub ShowShape(ByVal shapeName As String, Optional ByVal isVisible As Boolean = True)
    ActiveSheet.Shapes(shapeName).Visible = IIf(isVisible, msoTrue, msoFalse)
    Application.CommandBars("Selection").Visible = False
End Sub