答案1
这是一个更出色的例程,它只查看图表系列,而不假设工作表中的任何数据。它从系列公式开始,将其拆分为一个数组,反转数组的 X 和 Y 元素,然后将元素重新合并为修改后的公式,并重新应用新公式。
Sub SwitchXY()
If Not ActiveChart Is Nothing Then
Dim srs As Series
For Each srs In ActiveChart.SeriesCollection
Dim SrsFmla As String
SrsFmla = srs.Formula
'' =SERIES(name,xvalues,yvalues,number)
Dim vFmla As Variant
vFmla = Split(SrsFmla, ",")
'' array {"=SERIES(name","xvalues","yvalues","number)"}
Dim temp As String
temp = vFmla(LBound(vFmla) + 1) ' xvalues
vFmla(LBound(vFmla) + 1) = vFmla(LBound(vFmla) + 2)
vFmla(LBound(vFmla) + 2) = temp
'' array {"=SERIES(name","former yvalues","former xvalues","number)"}
SrsFmla = Join(vFmla, ",")
'' =SERIES(name,former yvalues,former xvalues,number)
srs.Formula = SrsFmla
Next
End If
End Sub
下面是一些虚拟数据、由 Excel 绘制的 X 和 Y 数据制作的 XY 图表以及运行代码后的相同图表。
更新:
我以这个问题和答案为灵感,并在我的博客上的新教程中添加了一些更好的代码来解释更复杂的级数公式,在散点图中切换 X 和 Y 值
答案2
Sub CommonYGraph()
Dim ws As Worksheet
Dim Chart1 As Chart
Dim rowcount As Long
Dim colcount As Long
Dim x As Long
Dim Yvalues As Range
Dim Series_Name As Range
Dim DataRange As Range
Set ws = ActiveSheet
rowcount = Selection.Rows.Count
colcount = Selection.Columns.Count - 1
Set DataRange = Selection.Offset(0, 1).Resize(rowcount, colcount)
Set Yvalues = DataRange(1, 1).Resize(1, colcount)
Set Series_Name = Selection.Range(Cells(2, 1), Cells(rowcount, 1))
Set Chart1 = ws.Shapes.AddChart.Chart
Chart1.ChartType = xlXYScatterLines
For x = Chart1.FullSeriesCollection.Count To 1 Step -1
Chart1.FullSeriesCollection(x).Delete
Next x
For x = 1 To rowcount - 1
Chart1.SeriesCollection.NewSeries
With Chart1.SeriesCollection(x)
.Xvalues = DataRange(1 + x, 1).Resize(1, colcount)
.Values = Yvalues
.Name = Series_Name(x)
End With
Next x
End Sub
我运行了上述代码,它或多或少根据您的图像生成了图形(网格线、图例位置、系列颜色和标记以及 x 值可能不同)。
在这种情况下,您已经选择了 C3 到 J3,然后运行 vba 代码。
代码会根据您选择的范围将图表添加到现有工作表中,删除可能已生成的任何现有系列,然后分别添加每个系列,每个系列的 Y 值相同,X 值也不同。它还会添加系列名称。