在任何打开的工作簿中检测刚刚停用的工作表中的selecttypes

我想要一个方法来查询,更改ActiveSheet编辑:任何打开的Workbook )后:

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

这可能吗 …?

编辑 :…(续)

  1. 没有额外的激活/去激活查询(首选)。
  2. 额外的激活/去激活询问。

请注意,将代码添加到ThisWorkbook只影响该工作簿。 所以,我猜像Jon Peltier发布的Chart事件的东西可能会工作( http://peltiertech.com/chart-events-microsoft-excel/ )。 我一直在寻找Excel VBA(第一select)的本地特性,或者对我提到的选项或其他select(第二select)有所了解。

到目前为止,通过使用基于第4节的应用程序事件来启用 上述链接的 所有工作簿中的 所有图表上的所有图表 ,我已经设法检测任何工作簿中任何工作表的停用。 然后,我可以想象点2的代码。有额外的激活/去激活查询 。 但是我不知道第一点。

(Marginally?)相关问题: VBA:在工作表中获取所选范围,其中select是图表

尝试把这个下ThisWorkbook

 Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) Dim Sh2 As Worksheet Dim rAddress As String Set Sh2 = ActiveSheet Application.EnableEvents = False Application.ScreenUpdating = False Sh.Activate If TypeName(Selection) = "Range" Then rAddress = Selection.Address Sh2.Activate MsgBox rAddress Application.EnableEvents = True Application.ScreenUpdating = True End Sub 

编辑

若要检测任何打开的工作簿中最近停用的工作表的selecttypes,请在PERSONAL.XLSB文件(如果是Windows XP)中添加以下内容(PERSONAL.XLS):

名为cAppEvent的类模块:

 Option Explicit Public WithEvents EventApp As Excel.Application Private Sub EventApp_SheetDeactivate(ByVal Sh As Object) Dim wb As Workbook Dim ws As Worksheet Set ws = Sh Set wb = ws.Parent CheckPreviousSelection ws, wb End Sub 

常规模块,无论你想要什么名字:

 Public cXLEvents As New cAppEvent Sub CheckPreviousSelection(Sh As Worksheet, wb As Workbook) Dim Sh2 As Worksheet Dim wb2 As Workbook Dim r As Range Dim cht As ChartObject Dim chk As Long Set Sh2 = ActiveSheet Set wb2 = Sh2.Parent Application.EnableEvents = False Application.ScreenUpdating = False Sh.Activate If TypeName(Selection) = "ChartArea" Then Set cht = Sh.ChartObjects(Right(ActiveChart.Name, Len(ActiveChart.Name) - Len(Sh.Name) - 1)) chk = 1 ElseIf TypeName(Selection) = "Range" Then Set r = Selection chk = 2 End If Sh2.Activate If chk = 1 Then MsgBox wb.Name & vbNewLine & Sh.Name & vbNewLine & cht.Name 'Do whatever you need to for a chart here. ElseIf chk = 2 Then MsgBox wb.Name & vbNewLine & Sh.Name & vbNewLine & r.Address 'Do whatever you need to for a range here. End If Application.EnableEvents = True Application.ScreenUpdating = True End Sub 

在ThisWorkbook下:

 Private Sub Workbook_Open() Set cXLEvents.EventApp = Application End Sub 

笔记:

  1. 您可能需要closuresExcel并重新打开才能开始工作。
  2. 这将为您提供有关以前在任何打开的工作簿中的工作表上进行select的信息。 但是,如果select了新的工作簿,它将不会为您提供以前select的信息。 如果需要的话,可以添加更多的代码来捕获该片段。
  3. 此方法使用额外的激活/停用。 由于没有Workbook_BeforeSheetDeactivate ,我不确定一种方法来完成你想要的,而不需要额外的激活/取消激活。
  4. 这将在您打开的任何工作簿上运行,即使您不希望它。 您最有可能想要将ThisWorkbook中的代码更改为如下所示:

    If MsgBox("Turn on AppEvents?", vbYesNo) = vbYes Then Set cXLEvents.EventApp = Application

    或者将其从Workbook_Open事件中取出并仅在需要时运行。

你可以将所需的行为从答案中拼凑到这个和你的另一个问题上。

  1. 使用应用程序级事件来处理SelectionChangeWorksheetDectivate事件
  2. 使用Chart事件来处理在工作表上select图表
  3. 使用全局variables来跟踪当前select,无论它在哪个工作表/工作簿中
  4. 代码可以放在您select的工作簿中,如果需要,还可以包含AddIn。

将此代码放置在ThisWorkbook模块中

 Private WithEvents App As Application Private WithEvents Cht As Chart Private sel As Variant Private Sub App_SheetActivate(ByVal Sh As Object) If Sh.ChartObjects.Count > 0 Then Set Cht = Sh.ChartObjects(1).Chart Else Set Cht = Nothing End If End Sub Private Sub Cht_Activate() Set sel = Cht End Sub Private Sub Workbook_Open() Set App = Application Set sel = Selection If ActiveSheet.ChartObjects.Count > 0 Then Set Cht = ActiveSheet.ChartObjects(1).Chart Else Set Cht = Nothing End If End Sub Private Sub App_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Set sel = Selection End Sub Private Sub App_WorkbookActivate(ByVal Wb As Workbook) Set sel = Selection End Sub Private Sub App_SheetDeactivate(ByVal Sh As Object) Debug.Print Sh.Name If TypeName(sel) = "Range" Then Debug.Print sel.Address Else Debug.Print TypeName(sel) End If Set sel = Selection End Sub