【问题标题】:Get datalabel caption source cell address获取datalabel标题源单元格地址
【发布时间】:2019-12-02 14:57:36
【问题描述】:

我很茫然,不确定是否有办法做到这一点。

我有一个带有数据标签的图表。数据标签标题链接到单元格值。对于每个数据标签,我需要获取作为标题来源的单元格的地址。

数据标签源是使用格式数据标签属性管理器手动设置的。

不幸的是,我尝试过的所有操作都只返回标题的文本值 - 没有什么能给我所需的单元格地址。

例如,当我运行以下命令时,我得到所有这些行的相同值 - 它只是打印标题中的文本。

我可以使用dl.parent.parent.formula 获取整个系列的单元格范围($H$9:$H$22),但我需要的是每个数据标签的特定单元格地址(即第一个标签:$H$9,第二个标签:$H$10 等)

Private Sub test()
Dim C As Chart
Dim w As Worksheet
Set w = Sheet2
Set C = Sheet2.ChartObjects("Chart 1").Chart

Dim dl As DataLabel
    For Each dl In C.FullSeriesCollection(2).DataLabels
        Debug.Print dl.Text
        Debug.Print dl.Caption
        Debug.Print dl.Formula
        Debug.Print dl.FormulaLocal
        Debug.Print dl.FormulaR1C1
        Debug.Print dl.FormulaR1C1Local
    Next
End Sub

【问题讨论】:

  • 您是否尝试将字幕更改为:=CELL("address";A1)?
  • 嘿,Daghan,我没有。我可能会遗漏一些东西,但那不会设置标题来源吗?我不想更改标题的来源 - 我只想获取当前来源的地址。希望这是有道理的!
  • 你想对每个单元格地址做什么?您应该能够从系列公式中循环遍历单元格范围。我不确定是否有更简单的方法。
  • 这是一个条形图。我想将条形的颜色设置为源单元格的颜色。我可能会尝试这种方法。我可以在我的 for/each 循环中添加一个计数器,并使用计数器从源范围中选择单元格来索引...
  • 或者你可以循环源范围,但是几乎相同的想法。我最近answered了一个涉及轻松获取源范围的问题。

标签: excel vba


【解决方案1】:

这是遵循 BigBen 建议的有效解决方案。如果有人想发布更好/更清洁的方法,我很乐意将其标记为答案。

Sub ChartConditions()
Dim C As Chart
Dim W As Worksheet
Dim S As Series
Set W = Sheet2
Set C = Sheet2.ChartObjects("Chart 1").Chart
Set S = C.FullSeriesCollection(2)

Dim sForm As String
Dim sAdd As String
Dim sRange As Range

sForm = S.Formula
sAdd = Split(sForm, ",")(2)
Set sRange = Range(sAdd)

Dim dlRange As Range
Set dlRange = Intersect(Range("H1").EntireColumn, sRange.EntireRow)

Dim i As Long
i = 0

Dim dl As DataLabel
    For Each dl In S.DataLabels
        i = i + 1
        Dim r As Long, b As Long, g As Long
        getRGB3 dlRange(i, 1), r, b, g
        dl.Parent.Format.Fill.ForeColor.RGB = RGB(r, g, b)
    Next
End Sub

Private Sub getRGB3(rcell As Range, r As Long, b As Long, g As Long)
    Dim C As Long

    C = rcell.DisplayFormat.Interior.Color
    r = C Mod 256
    g = C \ 256 Mod 256
    b = C \ 65536 Mod 256

End Sub

【讨论】:

  • 你为什么用 H 列做intersect?另外,请注意,如果您的工作表不是ActiveSheet,则代码将失败,因为不合格的Range 将引用ActiveSheet
  • @FunThomas - 实际上 Range 传递了一个包含工作表名称的地址。在我已经提到的answer 中,一个不合格的Range 调用有效,即使在该设置中,数据已经在不同的工作表上。这是一个极端情况,不合格的Range 调用实际上有效。
  • @funthomas - 系列的数据范围与提供字幕的范围不同。数据在 S 列中,标题文本在 H 列中。相交让我得到带有标题的范围,这是颜色编码的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多