在任何打开的工作簿中检测刚刚停用的工作表中的selecttypes
我想要一个方法来查询,更改ActiveSheet
( 编辑:任何打开的Workbook
)后:
- 检测上一个活动工作表(最重要的,如果是
ChartObject
或Range
)中的selecttypes。 - 如果它是一个
Range
,获取地址。
这可能吗 …?
编辑 :…(续)
- 没有额外的激活/去激活查询(首选)。
- 额外的激活/去激活询问。
请注意,将代码添加到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
笔记:
- 您可能需要closuresExcel并重新打开才能开始工作。
- 这将为您提供有关以前在任何打开的工作簿中的工作表上进行select的信息。 但是,如果select了新的工作簿,它将不会为您提供以前select的信息。 如果需要的话,可以添加更多的代码来捕获该片段。
- 此方法使用额外的激活/停用。 由于没有
Workbook_BeforeSheetDeactivate
,我不确定一种方法来完成你想要的,而不需要额外的激活/取消激活。 -
这将在您打开的任何工作簿上运行,即使您不希望它。 您最有可能想要将ThisWorkbook中的代码更改为如下所示:
If MsgBox("Turn on AppEvents?", vbYesNo) = vbYes Then Set cXLEvents.EventApp = Application
或者将其从Workbook_Open事件中取出并仅在需要时运行。
你可以将所需的行为从答案中拼凑到这个和你的另一个问题上。
- 使用应用程序级事件来处理
SelectionChange
和WorksheetDectivate
事件 - 使用
Chart
事件来处理在工作表上select图表 - 使用全局variables来跟踪当前select,无论它在哪个工作表/工作簿中
- 代码可以放在您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