当我点击图表时,我需要在Excel VBA中捕获事件。
我想把图表放到前面,当它被激活时,我找不到合适的事件。
对于不在表格上的图表(单独的全屏图表),有Chart_Activate()
个事件。
当图表在某张纸上时,如何调用同一事件?
答案 0 :(得分:3)
如果您有一组要自动化的图表,无论是在特定工作表上还是整个工作簿,那么我建议您使用类模块来捕获而不是按图表绑定代码图
Jon Peltier(按照惯例)详细介绍了此图表代码选项,请参阅Chart Events in Microsoft Excel。
在名为CEventChart的类模块中放置:
Option Explicit
' Declare object of type "Chart" with events
Public WithEvents EvtChart As Chart
Private Sub EvtChart_Activate()
EvtChart.ChartObjects msoBringToFront
End Sub
在普通模块中放
Option Explicit
Dim clsEventChart As New CEventChart
Dim clsEventCharts() As New CEventChart
Sub Set_All_Charts()
' Enable events on sheet if it is a chart sheet
If TypeName(ActiveSheet) = "Chart" Then
Set clsEventChart.EvtChart = ActiveSheet
End If
' Enable events for all charts embedded on a sheet
' Works for embedded charts on a worksheet or chart sheet
If ActiveSheet.ChartObjects.Count > 0 Then
ReDim clsEventCharts(1 To ActiveSheet.ChartObjects.Count)
Dim chtObj As ChartObject
Dim chtnum As Integer
chtnum = 1
For Each chtObj In ActiveSheet.ChartObjects
' Debug.Print chtObj.Name, chtObj.Parent.Name
Set clsEventCharts(chtnum).EvtChart = chtObj.Chart
chtnum = chtnum + 1
Next ' chtObj
End If
End Sub
Sub Reset_All_Charts()
' Disable events for all charts previously enabled together
Dim chtnum As Integer
On Error Resume Next
Set clsEventChart.EvtChart = Nothing
For chtnum = 1 To UBound(clsEventCharts)
Set clsEventCharts(chtnum).EvtChart = Nothing
Next ' chtnum
End Sub
然后运行Set_All_Charts,选择工作表,将图表发送到前面,Jon使用这些工作表事件设置和禁用特定工作表上的图表代码
Private Sub Worksheet_Activate()
Set_All_Charts
End Sub
Private Sub Worksheet_Deactivate()
Reset_All_Charts
End Sub
答案 1 :(得分:1)
如果我理解了这个问题,我就遇到了同样的问题。只要有多个重叠图表,其可视化优先级就会跟在ZOrder
。
在Excel 2003中,当一个人选择了一个图表时,它就到了前台(至少对于可视化,我不知道它的ZOrder
是否被临时更改)。取消选择图表后,其可视化优先级将恢复为“正常”。
从Excel 2007开始,图表在选择时不会暂时显示为可视化,因此如果它们被隐藏在其他图表(或可能是其他Shape
)后面,则完全查看它们的唯一选择是把它们带到前面。这有两个缺点:1)需要更多点击次数,2)(可能有意)ZOrder
丢失。
Jon Peltier ,在post from 5th May 2009中,提到没有解决方法。
我尝试过基于以下方案的解决方案:
ZOrder
以供日后使用。ZOrder
。这是基本的想法,该方案运作良好,有一些小问题。我实际上是将我的代码基于brettdj引用的page by Jon Peltier。 其中一项修改是
Private Sub EvtChart_Activate()
Application.EnableEvents = False
ActivatedChart = EvtChart.name
If (TypeName(EvtChart.Parent) = "ChartObject") Then
' Chart is in a worksheet
Dim chObj As ChartObject
Set chObj = EvtChart.Parent
chObj.BringToFront
Else
' Chart is in its own sheet
End If
Application.EnableEvents = True
End Sub
对EvtChart_Deactivate
使用类似的内容。
我希望这个想法很有用。
答案 2 :(得分:0)
在工作表中创建一个处理程序:
Public Sub ChartSelected(ByVal Name As String)
Me.ChartObjects(Name).BringToFront
End Sub
右键单击图表并选择“指定宏”,然后键入类似
的内容
'Sheet1.ChartSelected "Chart 1"'
其中Chart 1
是图表的名称。
要以编程方式分配此处理程序,请使用
ChartObject.OnAction = "'Sheet1.ChartSelected ""Chart 1""'"
答案 3 :(得分:0)
真的很容易。将此VBA过程放入常规代码模块中:
Sub ClickChart()
ActiveSheet.ChartObjects(Application.Caller).BringToFront
End Sub
将宏ClickChart
分配给您希望出现此行为的所有图表。
当您点击任何图表时,它会在工作表上的所有其他图表前移动。
发帖后,我看到@timwilliams在对另一个答案的评论中提出了这个建议。