我有许多用于操作 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()
无论您是否选择了图表区域、绘图区域或其系列之一,宏都会识别图表。
如果您选择了图表轴之一,我也希望它能够工作,但问题是轴对象的父级是工作表而不是图表。有谁知道如何从其轴之一导出图表对象本身?我能想到的唯一方法是记录轴的位置,然后将其与工作表中所有图表的位置进行比较,直到找到并重叠,但这似乎很复杂,我想知道我是否忽略了一个更简单的方法...
好的,所以我想我可以为你提供一个解决方案:
Sub Find_Chart()
Dim C As ChartObject
Dim sAx As Axis
Dim Axs As Object
'Check if selection is axis
If TypeOf Selection Is Axis Then
Set sAx = Selection
End If
'Loop through charts
For Each C In ActiveSheet.ChartObjects
'Loop through axes
For Each Axs In C.Chart.Axes
If Axs.AxisTitle.Caption = sAx.AxisTitle.Caption Then
Debug.Print C.Name
End If
Next Axs
Next C
End Sub
为了使上述代码正常工作,您的图表轴必须都有标题...如果您的图表没有标题(并且您希望保持这种方式),您可以添加标题并将字体更改为白色以保持你的图表看起来很干净。每个标题也必须是唯一的。设计一个 ID 系统以确保所有标题都是唯一的(例如 Chart1AxV、Chart1AxH、Chart2AxV 等)。如果您有预先存在的标题并且其中一些标题重复,您可以在标题末尾添加唯一 ID,并将标签的 ID 部分格式设置为白色。
上面的代码循环遍历工作表中的每个图表并检查图表中的每个轴。如果轴标题与所选轴的标题相同,则图表的名称将打印到立即窗口。
希望这对您有帮助!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)