我想要一个方法在更改ActiveSheet
之后查询,而不需要额外的激活/取消激活:
Selection
的类型(最重要的是,如果它是ChartObject
或Range
)。Range
,请获取地址。这可能吗??
PS:这个问题的答案将帮助我找到Detect the type of Selection in a Worksheet just deactivated, in any open Workbook的答案。但它们不一样。
答案 0 :(得分:1)
您需要两个单独的事件来捕获选择,另外还需要一个全局变量来存储先前的对象类型和名称/位置。
Worksheet_SelectionChange
了解范围Chart_Select
事件对于Excel 2013中的(2)有这样的事件,但对于早期版本,我们需要一个类模块
这是以Jon Peltier's code为基础
完成的下面有三个代码部分,使用指示的名称和位置将它们添加到工作簿中。然后运行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
答案 1 :(得分:0)
这个答案适用于你的问题的第2部分。
在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
注意:强> 您进行的第一个选择将没有oldTarget。之后,它将打印一条显示旧地址和新地址的消息。