检测刚刚停用的工作表中的selecttypes

我想要一个方法来查询,更改ActiveSheet ,没有额外的激活/取消激活:

  1. 上一个活动工作表中的Selectiontypes(最重要的,如果它是ChartObjectRange )。
  2. 如果它是一个Range ,获取地址。

这可能吗 …?

PS:这个答案将帮助我find在任何打开的工作簿中检测刚停用的工作表中的selecttypes的答案。 但他们不一样。

您需要两个单独的事件来捕获select,再加上一个全局variables来存储先前的对象types和名称/位置。

  1. 一个范围的Worksheet_SelectionChange
  2. Chart_Select事件

对于(2)在Excel 2013中有这样一个事件,但对于早期版本,我们将需要一个类模块

这是用Jon Peltier的代码作为基础完成的

有三个代码部分下面,将它们添加到您的工作簿与指定的名称和位置。 然后运行Set_All_Charts以初始化图表类模块的第一个图表中的图表

类模块叫做clsEventChart

 Option Explicit Public WithEvents evtchart As Chart Private Sub EvtChart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long) MsgBox "Changed from : " & TypeName(X) & " " & StrPos & " to" & vbNewLine & "Chart: " & evtchart.Name StrPos = evtchart.Name Set X = evtchart End Sub 

正常模块

 Option Explicit Public StrPos As String Public X As Object Dim clsEventCharts() As New clsEventChart Sub Set_All_Charts() Dim ws As Worksheet Set ws = Sheets(1) With ws If .ChartObjects.Count > 0 Then ReDim clsEventCharts(1 To ws.ChartObjects.Count) Dim chtObj As ChartObject Dim chtnum As Integer chtnum = 1 For Each chtObj In ws.ChartObjects ' Debug.Print chtObj.Name, chtObj.Parent.Name Set clsEventCharts(chtnum).evtchart = chtObj.Chart chtnum = chtnum + 1 Next ' chtObj End If End With End Sub 

表单事件

 Public Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox "Changed from " & TypeName(X) & ": " & StrPos & " to: " & vbNewLine & "Range: " & Target.Address Set X = Selection StrPos = Target.Address End Sub 

这个答案是针对你的问题的第二部分。

在SelectionChange事件之外声明oldTarget,以便可以从其他事件(如更改事件)中使用它。

放置在工作表代码中:

 Dim oldTarget As Variant Public Sub Worksheet_SelectionChange(ByVal Target As Range) MsgBox ("Address changed from : " & oldTarget & vbNewLine & _ " to: " & Target.Address) oldTarget = Target.Address End Sub 

注意:你所做的第一个select将不会有一个oldTarget。 之后,它将打印显示旧地址和新地址的消息。