【问题标题】:Points in Excel Charts (VBA)Excel 图表中的点 (VBA)
【发布时间】:2016-03-06 20:26:18
【问题描述】:

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

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

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

我正在尝试远离:

Worksheets(1).ChartObjects(1).Chart. _ SeriesCollection(1).Points(3).MarkerStyle = xlDiamond

和写作:

Worksheets(1).ChartObjects(1).Chart. _ SeriesCollection(1).Points("Europe").MarkerStyle = xlDiamond

【问题讨论】:

  • AFAIK,图表点(Value 12) 和数据标签(Europe) 都是基于index(按数字),并且只能在VBA 中通过它们的索引号引用。也就是说,如果您想根据标签或值应用格式或其他条件,您可以循环每个标签/值并在设置条件之前测试它的值。在某些情况下,我发现有必要遍历绘制数据的实际范围并测试我的条件。
  • 你能举个例子来说明如何在标签群中循环吗?
  • 您的意思是 x 轴(图例)标签吗?还是实际的数据标签?
  • 在我的情况下,这些是水平(类别)轴标签
  • 什么类型的图表,这样我才能确定?

标签: excel charts series vba


【解决方案1】:

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

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

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

【讨论】:

  • 显然这不适用于饼图,但它适用于柱形图。谢谢
  • XValues 已经是一个数组。使用集合不只是一个额外的步骤吗?遍历数组,直到找到“Europe”,这就是您想要的点的索引。
  • 是的,显然 XValues 是一个数组,但我这样做有两个原因。首先,在回答这个问题时,OP 似乎想通过名称来引用这一点。其次,该集合允许他们通过名称引用执行进一步的操作,而无需不断循环。
【解决方案2】:

可能有更好的方法来做到这一点,但 AFAIK 并从我的经验中记住,这是在循环遍历图表并根据类别轴标签对系列采取行动时测试类别轴标签的唯一方法。

我已经对代码进行了大量注释以使其尽可能清晰:

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

【讨论】:

  • 另外,这似乎不适用于饼图,但它适用于柱形图(可能也适用于折线图!)。谢谢
  • 仍然有兴趣了解饼图是否可以做某事
  • @ProtoVB 为什么它不适用于饼图?我确实看到的一个问题是您无法在饼图上设置图例标记样式,因为默认情况下每个系列都是饼图的fill 切片。代码结构本身适用于饼图,只是它不会更新MarkerStyle,因为这是不可能的(也没有意义)。
  • 我的错,我改变了“显示”(PlotBy:=xlColumns/xlRows)。选择案例确实有效,并且可以使用名称而不是索引来修改数据。我实际上没有使用“MarkerStyle”,而是“Interior.Color”(它适用于任何类型图表的任何点)。已解决,谢谢
  • @ProtoVB - 很高兴它起作用了 :) 你可以通过循环 .XValues 并测试值 xv 并完全摆脱将公式加载到数组和循环遍历范围。为了清楚起见,没有必要像他那样添加到收藏中。确实是一个更优雅的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2015-06-13
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多