【问题标题】:Detect the type of Selection in a Worksheet just deactivated检测刚刚停用的工作表中的选择类型
【发布时间】:2015-03-26 21:13:08
【问题描述】:

我想要一种方法来查询,在更改ActiveSheet 之后,无需额外的激活/停用:

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

这可能吗...?

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

【问题讨论】:

  • 您需要在书中的每张纸上使用Worksheet_SelectionChange 事件。但是您可能可以使用公共变量和TypeOf() 方法来实现这一点。
  • @SO - Worksheet_SelectionChange 在将 SelectionRange 更改为 Chart 时不会触发(实际上,ChartArea 通过鼠标单击),反之亦然,如果重新选择上次选择的Range。我想这直接意味着该事件对第 1 点没有用。
  • 是的,这就是我没有包含它的原因,它们是单独的事件。

标签: excel selection vba


【解决方案1】:

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

  1. Worksheet_SelectionChange 表示范围
  2. 图表对象的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

【讨论】:

    【解决方案2】:

    此答案适用于您问题的第 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。之后,它将打印一条消息,显示旧地址和新地址。

    【讨论】:

    • 我知道这不是一个完整的答案。由于该问题包含两个问题,因此我提供此答案是为了提供我能提供的帮助。它确实回答了问题的第 2 部分。
    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    相关资源
    最近更新 更多