我想要一个方法来查询,改变后ActiveSheet
(编辑:任何开放的Workbook
):
- 检测类型
Selection
在上一个活动表中(最重要的是,如果它是ChartObject
or Range
).
- 如果它是一个
Range
,获取地址。
这可能吗 ...?
EDIT:...(续)
- 无需额外的激活/停用来查询(首选)。
- 通过额外的激活/停用来查询。
请注意,将代码添加到ThisWorkbook
仅影响该工作簿。
所以,我想 Jon Peltier 为图表事件发布的内容可能会起作用(http://peltiertech.com/chart-events-microsoft-excel/ http://peltiertech.com/chart-events-microsoft-excel/)。
我一直在寻找 Excel VBA 原生的东西(第一选择),或者对我提到的选项或其他替代方案(第二选择)的一些见解。
到目前为止,通过使用基于Section的代码4. 启用所有工作簿中所有工作表上的所有图表的应用程序事件 of 上面的链接 http://peltiertech.com/chart-events-microsoft-excel/,我已成功检测到任何工作簿中任何工作表的停用。
然后,我可以想象点代码2. 额外开启/关闭查询。
但我不知道第1点。
(勉强?)相关问题:VBA:获取工作表中选择的范围,其中选择是图表 https://stackoverflow.com/questions/24965291/vba-get-selected-range-in-a-worksheet-where-the-selection-is-a-chart
尝试将其放在下面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
EDIT
要检测任何打开的工作簿中最近停用的工作表的选择类型,请在 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
在本工作簿下:
Private Sub Workbook_Open()
Set cXLEvents.EventApp = Application
End Sub
Notes:
- 您可能需要关闭 Excel 并重新打开才能开始工作。
- 这将为您提供有关任何打开的工作簿中的工作表中先前选择的信息。但是,如果选择了新工作簿,它不会为您提供有关先前选择的信息。如有必要,可以添加更多代码来捕获该片段。
- 此方法使用额外的激活/停用。既然没有
Workbook_BeforeSheetDeactivate
,我不确定是否有一种方法可以在不额外激活/停用的情况下完成您想要的任务。
-
这将在您打开的任何工作簿上运行,即使您不希望它这样做。您很可能希望将 ThisWorkbook 中的代码更改为如下所示:
If MsgBox("Turn on AppEvents?", vbYesNo) = vbYes Then Set cXLEvents.EventApp = Application
或者将其从 Workbook_Open 事件中取出并仅在需要时运行它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)