如何通过vba代码只获取Excel图表的可见类别标签

问题描述 投票:0回答:1

1) 请运行以下代码。

Public Sub Macro1()
    
    'Delete all charts
    For i = ActiveSheet.Shapes.Count To 1 Step -1
        If ActiveSheet.Shapes(i).Type = msoChart Then
            ActiveSheet.Shapes(i).Delete
        End If
    Next i
    
    'Add a chart.
    With ActiveSheet.ChartObjects.Add(Left:=10, Top:=10, Width:=500, Height:=300)
        .Chart.Axes(xlCategory).TickLabels.Font.Size = 40
    End With
    
    'Add a serie.
    With ActiveSheet.ChartObjects(1).Chart.SeriesCollection.NewSeries
        .ChartType = xlLine
        .XValues = Array(1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000)
        .Values = Array(150, 200, 800, 1200, 900, 600, 900, 850, 1500, 1600, 1900, 1700, 600, 500, 450, 300, 500, 750, 900, 850)
    End With
    
    'Print all XValues
    For Each i In ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).XValues
        Debug.Print i
    Next
    
    'The following code is doing same task comparing to above code.
    'For Each i In ActiveSheet.ChartObjects(1).Chart.Axes(xlCategory).CategoryNames
        'Debug.Print i
    'Next
    
    'The following code needs to be repaired.
    'For Each i In ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).XValues
        'If i Is Visible Then
            'Debug.Print i
        'End If
    'Next
    
End Sub

2)运行上面的代码后,检查你的Excel表格中是否有以下图表。

Picture of the chart

3)这是我的问题:

如何通过vba代码只获取Excel图表的可见类别标签?

请注意,可见的类别名称为 1000、4000、7000、10000、13000、16000、19000,如上表所示。

4)这是我的脚注:

请注意,我正在寻找动态解决方案。因为可见的类别标签是可变的。

可见类别名称可以是 1000、4000、7000、10000、13000、16000、19000。

或者可能是

1000、3000、5000、7000、9000、11000、13000、15000、17000、19000

或者可能是

1000、5000、9000、13000、17000、20000

或者可能是

其他可能性。

excel vba graph charts
1个回答
0
投票

轴上的可见标签是 TickLabels。 它们之间的间距在

Axis.TickLabelSpacing
下指定(如果您强制将其设置为特定值,则可以使用
Axis.TickLabelSpacingIsAuto
将其重置为自动)

所以,如果

Axis.TickLabelSpacing=3
,那么你只想输出每三个
CategoryName
10002000,3000,40005000,6000,7000,等等

您可以通过使用增量变量来告诉您是否应该保留或忽略它来做到这一点:

Dim ToShow AS Long: ToShow = 0

For Each j In Sheet1.ChartObjects(1).Chart.Axes(xlCategory).CategoryNames
    If ToShow =0 Then Debug.Print j
    ToShow = ToShow+1 mod Sheet1.ChartObjects(1).Chart.Axes(xlCategory).TickLabelSpacing
Next

或者你可以使用

Step
ped 循环:

Dim NameList() AS Variant, CurrentName As Long
NameList = Sheet1.ChartObjects(1).Chart.Axes(xlCategory).CategoryNames

For CurrentName = LBound(NameList) To UBound(NameList) Step Sheet1.ChartObjects(1).Chart.Axes(xlCategory).TickLabelSpacing
    Debug.Print NameList(CurrentName)
Next

根据设置方式,您可能需要在代码中包含

Axis.Crosses
作为偏移量

© www.soinside.com 2019 - 2024. All rights reserved.