我想触发两个独立的宏,每个宏均基于不同的单元格。具体来说,我想在单击单元格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
答案 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
请注意,如果这是唯一需要调用Factiva
和Orange
过程的代码,则可以将它们都设置为Private
。另外,请考虑使用以动词开头的有意义的名称重命名您的过程,例如ShowFactivaShape
或ShowOrangeBusinessShape
。
实际上,您可以参数化代码并删除两者之一:
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