使用Excel-VBA使用数组绘制XY散点图,并更改水平(类别)轴标签

时间:2020-09-16 10:54:52

标签: excel vba

我对Excel VBA相对较新,我正在尝试学习如何使用VBA脚本绘制图表。我有以下数据表(图1):

Data table

我想从此数据表中绘制出如下图(图2)。我已经用带有标记图表类型的线用Excel的内置函数绘制了图表:

Line with markers plot chart type

我已经在VBA中编写了一个简单的代码来绘制相似类型的图表,但是使用数组而不是直接从图纸中选择范围。我的VBA代码如下:

Sub plot_test2()

Dim ws2 As Worksheet
Dim i, j, c, m, n, a, lrow As Long
Dim frist_code, frist_value, frist_name As Variant
Dim xychart As Chart
Set ws2 = Worksheets("Sheet2")
i = 1: j = 1: a = 1
c = 4: lrow = 6: m = 2: n = 1

ReDim frist_code(i To lrow - 1, j To c)
ReDim frist_value(i To lrow - 1, j To c)
ReDim frist_name(i To lrow - 1, j To c)

For i = 1 To lrow - 1
    For j = 1 To c
        frist_value(i, j) = ws2.Cells(m, n)
        frist_code(i, j) = j
        frist_name(i, j) = ws2.Cells(1, n)
        n = n + 1
    Next j
    n = 1
    m = m + 1
Next i

Set xychart = ws2.Shapes.AddChart2(332, xlXYScatter, Left:=0, Top:=0, Width:=400, Height:=300).Chart

For i = 1 To lrow - 1
    For j = 1 To c
        xychart.SeriesCollection.NewSeries
        With xychart.SeriesCollection(a)
            .name = frist_name(i, j)         'series names are assigned by frist_name array 
            .Values = frist_value(i, j)      'series values are assigned by frist_value array
            .XValues = frist_code(i, j)      'series XValues are assigned by frist_code array
            .MarkerSize = 15
        End With
        a = a + 1
    Next j
    j = 1
Next i
xychart.Axes(xlCategory).TickLabelPosition = xlLow
End Sub

运行宏时,得到以下图(图3):

XY Scatter plot with VBA using arrays

我希望将水平轴标签重命名为A,B,C,D(如图2所示),而不是在VBA宏中使用数组重命名为1,2,3,4。一直试图解决这个问题,但是我在其他地方找不到正确的解决方案。

我还尝试使用xlLineMarkers而不是xlXYScatter图表类型来绘制图表。但是这些点绘制在同一条线上。

我还尝试使用xychart.Axes(xlCategory).CategoryNames = Array(“ A”,“ B”,“ C”,“ D”)。但是存在编译错误。

请让我知道是否有人能够找到解决方案或错误是我的VBA代码。多谢!

1 个答案:

答案 0 :(得分:0)

要使用文本标签,它不能是XY散点图。

您所拥有的是折线图类型数据。您需要绘制为折线图,按行,带有标记的线进行绘制,然后隐藏这些线。另外,我将标记变大了,因为这就是图表中的样子。

这是我录制并修改过的一个快捷方式:

Sub Macro1()
  ActiveSheet.Shapes.AddChart2(332, xlLineMarkers).Select
  ActiveChart.SetSourceData Source:=Range("Sheet1!$A$1:$D$6"), PlotBy:=xlRows
  Dim srs As Series
  For Each srs In ActiveChart.SeriesCollection
    srs.Format.Line.Visible = msoFalse
    srs.MarkerSize = 8
  Next
End Sub