检测刚刚停用的工作表中的选择类型

时间:2015-01-16 00:00:56

标签: excel excel-vba selection vba

我想要一个方法在更改ActiveSheet之后查询,而不需要额外的激活/取消激活:

  1. 上一个有效工作表中Selection的类型(最重要的是,如果它是ChartObjectRange)。
  2. 如果是Range,请获取地址。
  3. 这可能吗??

    PS:这个问题的答案将帮助我找到Detect the type of Selection in a Worksheet just deactivated, in any open Workbook的答案。但它们不一样。

2 个答案:

答案 0 :(得分:1)

您需要两个单独的事件来捕获选择,另外还需要一个全局变量来存储先前的对象类型和名称/位置。

  1. Worksheet_SelectionChange了解范围
  2. 图表对象的Chart_Select事件
  3. 对于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。之后,它将打印一条显示旧地址和新地址的消息。