【发布时间】:2017-02-22 15:14:08
【问题描述】:
我有许多用于操作 Excel 图表的通用 VBA 宏(例如,将一个图表叠加在另一个图表之上;重新调整坐标轴;或将自定义曲线(例如“y = x^2 - 1”)添加到图表中在文本框中键入公式)。这些宏是不带任何参数的子程序,我将它们存储在 .xlam 加载项中,并从 Excel 功能区上的链接按钮运行它们。要在特定图表上运行宏,请选择图表,然后单击功能区上的按钮。
为了让宏知道它们在哪个图表上运行,我有一个这样的函数:
Function chart_from_selection() As Chart
If TypeName(Selection) = "ChartArea" Or TypeName(Selection) = "PlotArea" Then
Set chart_from_selection = Selection.Parent
ElseIf TypeName(Selection) = "Series" Then
Set chart_from_selection = Selection.Parent.Parent
Else
MsgBox ("Select a chart!")
End If
End Function
所以每个宏的前几行是
Dim cht As Chart
Set cht = chart_from_selection()
无论您选择了图表区域、绘图区域还是其中一个系列,宏都会识别图表。
如果您选择了图表轴之一,我也希望它能够工作,但问题是轴对象的父级是工作表而不是图表。有谁知道如何从其轴之一派生图表对象本身?我能想到的唯一方法是记录轴的位置,然后将其与工作表中所有图表的位置进行比较,直到找到并重叠,但这似乎很复杂,我想知道我是否忽略了更简单的方法...
【问题讨论】:
-
选择轴后,
? typename(selection.parent)为我提供Chart。此外,您应该真正使用TypeOf ... Is ...而不是字符串类型名称比较。 -
嗯,不,我肯定会得到
? TypeName(Selection.Parent)给Worksheet。应该说,我使用的是 Excel V14 (2010),VBA 7.0。TypeOf Selection.Parent is Chart也评估为假。选择 TypeOf 而不是 TypeName 的理由是什么? -
基本原理:类型安全、完全限定、更高效的检查,如果有人想出一个其非限定类型名称恰好也是 PlotArea 的 ActiveX 对象,则不会给出误报。关于工作表问题:确实返回 Office 2010 中的工作表,对我来说这看起来像是一个巨大的兼容性问题和/或错误。我现在想知道 v2013 会发生什么。
-
If TypeOf Selection Is Gridlines Or TypeOf Selection Is Axis Then Set parentChart = ActiveChart