Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 检测刚停用的工作表中的选择类型_Excel_Selection_Vba - Fatal编程技术网

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

Excel 检测刚停用的工作表中的选择类型,excel,selection,vba,Excel,Selection,Vba,我想要一种方法,在更改ActiveSheet后,无需额外激活/停用: 上一个活动工作表中的选择类型(如果是图表对象或范围,则最重要) 如果是范围,则获取地址 这可能吗 附言:这个问题的答案将帮助我得到这个问题的答案。但是它们不一样。这个答案是针对你问题的第二部分 在SelectionChange事件之外声明oldTarget,以便可以从其他事件(如更改事件)中使用它 放入工作表代码: Dim oldTarget As Variant Public Sub Worksheet_Selection

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

  • 上一个活动工作表中的
    选择类型
    (如果是
    图表对象
    范围
    ,则最重要)
  • 如果是
    范围
    ,则获取地址
  • 这可能吗


    附言:这个问题的答案将帮助我得到这个问题的答案。但是它们不一样。

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

    在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
    
    注意:
    您所做的第一个选择将没有旧目标。之后,它将打印一条消息,显示旧地址和新地址。

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

  • 工作表\u选择更改范围
  • 一个
    图表\u为图表对象选择
    事件
  • 对于中的(2),有这样一个事件,但对于早期版本,我们需要一个类模块

    这是通过使用作为基础来实现的

    下面有三个代码部分,请使用所示的名称和位置将它们添加到工作簿中。然后运行
    Set_All_Charts
    初始化图表类模块第一页中的图表

    类模块称为clsEventChart

    正常模块

    工作表事件


    您需要在书中的每个工作表中使用
    工作表\u selection change
    事件。但可能您可以使用公共变量和
    TypeOf()
    方法来实现这一点。@SO-
    工作表_SelectionChange
    在将
    选择
    范围更改为
    图表
    时不会触发(实际上,只需单击鼠标,
    图表区域
    ),如果重新选择上次选择的
    范围
    ,则反之亦然。我想这直接意味着该事件对第1点没有用处。是的,这就是为什么我没有包括它,它们是独立的事件。我知道这不是一个完整的答案。因为这个问题包含两个问题,我提供这个答案是为了提供我所能提供的帮助。它确实回答了问题的第二部分。
    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