Excel图表中的点(VBA)

Excel图表中的点(VBA),excel,charts,series,vba,Excel,Charts,Series,Vba,在VBA中,有没有一种方法可以在图表中用数字参考以外的其他东西来标识点 将指针放在图表的某一部分上方时,它会显示序列号和一些叙述。这是该点的“名称”吗 例如:意甲1分“欧洲”“价值:12(51%) 我正试图摆脱: 工作表(1).图表对象(1).图表_ 序列集合(1).点(3).标记样式=xlDiamond 和写作: 工作表(1).图表对象(1).图表_ SeriesCollection(1).Points(“Europe”).MarkerStyle=xlDiamond该名称不指具有给定名称(如S

在VBA中,有没有一种方法可以在图表中用数字参考以外的其他东西来标识点

将指针放在图表的某一部分上方时,它会显示序列号和一些叙述。这是该点的“名称”吗

例如:意甲1分“欧洲”“价值:12(51%)

我正试图摆脱:

工作表(1).图表对象(1).图表_
序列集合(1).点(3).标记样式=xlDiamond

和写作:

工作表(1).图表对象(1).图表_

SeriesCollection(1).Points(“Europe”).MarkerStyle=xlDiamond

该名称不指具有给定名称(如S1P1)的点

您可以做的是将XValues的名称和索引存储在一个集合中,然后使用该集合

Dim myValues As Collection
Dim xv As Variant
Dim i As Long

    Set myValues = New Collection

    With Worksheets(1).ChartObjects(1).Chart.SeriesCollection(1)

        For Each xv In .XValues

            i = i + 1
            myValues.Add i, xv
        Next xv

        .Points(myValues.Item("Europe")).MarkerStyle = xlDiamond
    End With

该名称不是指具有给定名称(如S1P1)的点

您可以做的是将XValues的名称和索引存储在一个集合中,然后使用该集合

Dim myValues As Collection
Dim xv As Variant
Dim i As Long

    Set myValues = New Collection

    With Worksheets(1).ChartObjects(1).Chart.SeriesCollection(1)

        For Each xv In .XValues

            i = i + 1
            myValues.Add i, xv
        Next xv

        .Points(myValues.Item("Europe")).MarkerStyle = xlDiamond
    End With

也许有更好的方法可以做到这一点,但根据我的经验,这是在循环图表时测试类别轴标签并根据类别轴标签对系列进行操作的唯一方法

为了尽可能清楚,我对代码进行了大量注释:

Sub LoopAxisLabels()

Dim ws As Worksheet
Dim c As ChartObject
Dim sc As SeriesCollection

Set ws = Worksheets(1)
Set c = ws.ChartObjects(1)
Set sc = c.Chart.SeriesCollection

Dim aForm() As String
aForm() = Split(sc.Item(1).Formula, ",")
'^^^
'|||get formula (chart data source) for the series collection (Item(1) denotes first series collection on chart
'   assumes only 1 collection on chart)
'   places formula into array separate by comma, based on =SERIES(Sheet1!$F$3,Sheet1!$E$4:$E$8,Sheet1!$F$4:$F$8,1) as example

Dim rLabel As Range, cel As Range
Set rLabel = Range(aForm(1)) 'set the label range (Sheet1!$E$4:$E$8 in the example)

Dim i As Long

For Each cel In rLabel 'loop through actual cells of label and test for label values

    i = i + 1 'use counter to refer to specific chart points (since points will be in order of data listed in range

    Select Case cel.Value2

        Case Is = "Europe": sc.Item(1).Points(i).MarkerStyle = xlDiamond 'Points(i) matches the relative range reference

        Case Is = "...":

        'continue with other Cases...

    End Select

Next

End Sub

也许有更好的方法可以做到这一点,但根据我的经验,这是在循环图表时测试类别轴标签并根据类别轴标签对系列进行操作的唯一方法

为了尽可能清楚,我对代码进行了大量注释:

Sub LoopAxisLabels()

Dim ws As Worksheet
Dim c As ChartObject
Dim sc As SeriesCollection

Set ws = Worksheets(1)
Set c = ws.ChartObjects(1)
Set sc = c.Chart.SeriesCollection

Dim aForm() As String
aForm() = Split(sc.Item(1).Formula, ",")
'^^^
'|||get formula (chart data source) for the series collection (Item(1) denotes first series collection on chart
'   assumes only 1 collection on chart)
'   places formula into array separate by comma, based on =SERIES(Sheet1!$F$3,Sheet1!$E$4:$E$8,Sheet1!$F$4:$F$8,1) as example

Dim rLabel As Range, cel As Range
Set rLabel = Range(aForm(1)) 'set the label range (Sheet1!$E$4:$E$8 in the example)

Dim i As Long

For Each cel In rLabel 'loop through actual cells of label and test for label values

    i = i + 1 'use counter to refer to specific chart points (since points will be in order of data listed in range

    Select Case cel.Value2

        Case Is = "Europe": sc.Item(1).Points(i).MarkerStyle = xlDiamond 'Points(i) matches the relative range reference

        Case Is = "...":

        'continue with other Cases...

    End Select

Next

End Sub


另外,图表点
(值12)
和数据标签
(欧洲)
都是基于
索引的(按编号),只能在VBA中按索引编号引用。也就是说,如果希望基于标签或值应用格式或其他条件,可以循环每个标签/值,并在设置条件之前根据其值进行测试。在某些情况下,我发现有必要在绘制数据的实际范围内循环,并在该范围内测试我的条件。您能举一个如何循环标签总体的示例吗?您是指x轴(图例)标签吗?或者实际的数据标签?这些是水平(类别)轴标签在我的情况下是什么类型的图表,这样我就可以确定了?好的,图表点
(值12)
和数据标签
(欧洲)
都是基于
索引
(按编号)的,只能在VBA中按其索引编号引用。也就是说,如果希望基于标签或值应用格式或其他条件,可以循环每个标签/值,并在设置条件之前根据其值进行测试。在某些情况下,我发现有必要在绘制数据的实际范围内循环,并在该范围内测试我的条件。您能举一个如何循环标签总体的示例吗?您是指x轴(图例)标签吗?或者实际的数据标签?在我的例子中,这些是水平(类别)轴标签什么类型的图表,我可以确定?显然,这不适用于饼图,但适用于柱状图。谢谢Xvalues已经是一个数组了。使用收藏不是一个额外的步骤吗?在数组中循环,直到找到“Europe”,这就是你想要的点的索引。是的,很明显XValues是一个数组,但我这样做有两个原因。首先,在回答问题时,OP似乎想通过名称来引用该点。其次,该集合允许他们通过名称引用执行进一步的操作,而无需不断循环。显然,这不适用于饼图,但适用于柱状图。谢谢Xvalues已经是一个数组了。使用收藏不是一个额外的步骤吗?在数组中循环,直到找到“Europe”,这就是你想要的点的索引。是的,很明显XValues是一个数组,但我这样做有两个原因。首先,在回答问题时,OP似乎想通过名称来引用该点。其次,该集合允许他们通过名称引用执行进一步的操作,而无需不断循环。此外,这似乎不适用于饼图,但适用于柱状图(可能也适用于折线图!)。谢谢你还有兴趣看看派是否可以做点什么吗chart@ProtoVB为什么饼图不起作用?我确实看到的一个问题是,不能在饼图上设置图例标记样式,因为默认情况下,每个系列都是饼图的
填充
部分。代码结构本身在饼图上工作,只是它不会更新
标记样式
,因为这是不可能的(也没有意义)。糟糕,我更改了“显示”(PlotBy:=xlColumns/xlRows)。“选择案例”不起作用,可以使用名称而不是索引修改数据。实际上,我并没有使用“MarkerStyle”,而是使用“Interior.Color”(适用于任何类型图表的任何点)。这已经解决了,谢谢you@ProtoVB-很高兴它成功了:)你可以将我的公式与@Bob Phillips在下面所做的结合起来,通过循环
.XValues
并测试xv值,完全不用将公式加载到数组中并循环范围。为了清楚起见,没有必要像他那样增加收藏。的确,这是一个更优雅的解决方案。此外,这似乎不适用于饼图,但适用于柱形图(可能也适用于折线图!)。谢谢你还有兴趣看看派是否可以做点什么吗chart@ProtoVB为什么饼图不起作用?我确实看到的一个问题是,不能在饼图上设置图例标记样式,因为默认情况下,每个系列都是饼图的
填充
部分。代码结构本身在饼图上工作,只是它不会更新
标记样式
,因为这是不可能的(也没有意义)。糟糕的是,我更改了“显示”(PlotBy:=xlCo)