Excel 宏修复折线图中重叠的数据标签

标签 excel charts excel-2007 vba

我正在搜索/尝试创建一个宏来修复具有一个或多个系列集合的折线图中数据标签的位置,以便它们不会相互重叠。

我正在为我的宏考虑一些方法,但是当我尝试实现它时,我明白这对我来说太难了,而且我很头疼。

有什么我错过的吗?你知道这样的宏吗?

以下是带有重叠数据标签的示例图表:

enter image description here

这是一个示例图表,我在其中手动修复了数据标签:

enter image description here

最佳答案

此任务基本上分为两个步骤:访问Chart对象以获取Labels,以及操作 标签位置以避免重叠。

对于给定的示例,所有系列都绘制在公共(public) X 轴上,并且 X 值充分分布,标签在此维度上不会重叠。因此,提供的解决方案仅依次处理每个 X 点的标签组。

访问标签

Sub解析图表并依次为每个X点创建一个Labels数组

Sub MoveLabels()
    Dim sh As Worksheet
    Dim ch As Chart
    Dim sers As SeriesCollection
    Dim ser As Series
    Dim i As Long, pt As Long
    Dim dLabels() As DataLabel

    Set sh = ActiveSheet
    Set ch = sh.ChartObjects("Chart 1").Chart
    Set sers = ch.SeriesCollection

    ReDim dLabels(1 To sers.Count)
    For pt = 1 To sers(1).Points.Count
        For i = 1 To sers.Count
            Set dLabels(i) = sers(i).Points(pt).DataLabel
        Next
        AdjustLabels dLabels  ' This Sub is to deal with the overlaps
    Next
End Sub

检测重叠

这会使用Labels数组调用AdjustLables。需要检查这些标签是否重叠

Sub AdjustLabels(ByRef v() As DataLabel)
    Dim i As Long, j As Long

    For i = LBound(v) To UBound(v) - 1
    For j = LBound(v) + 1 To UBound(v)
        If v(i).Left <= v(j).Left Then
            If v(i).Top <= v(j).Top Then
                If (v(j).Top - v(i).Top) < v(i).Height _
                And (v(j).Left - v(i).Left) < v(i).Width Then
                    ' Overlap!

                End If
            Else
                If (v(i).Top - v(j).Top) < v(j).Height _
                And (v(j).Left - v(i).Left) < v(i).Width Then
                    ' Overlap!

                End If
            End If
        Else
            If v(i).Top <= v(j).Top Then
                If (v(j).Top - v(i).Top) < v(i).Height _
                And (v(i).Left - v(j).Left) < v(j).Width Then
                    ' Overlap!

                End If
            Else
                If (v(i).Top - v(j).Top) < v(j).Height _
                And (v(i).Left - v(j).Left) < v(j).Width Then
                    ' Overlap!

                End If
            End If
        End If
    Next j, i
End Sub

移动标签

当检测到重叠时,您需要一种策略来移动一个或两个标签而不创建另一个重叠。
这里有很多可能性,您没有提供足够的详细信息来判断您的要求。

有关 Excel 的注意事项

要使此方法发挥作用,您需要具有 DataLabel.Width 和 DataLabel.Height 属性的 Excel 版本。版本 2003 SP2(以及可能更早的版本)没有。

关于Excel 宏修复折线图中重叠的数据标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8770429/

相关文章:

excel - 基于先前列数据的条件格式

excel - saveAs 操作时出现 vba 'Compiler error expected: ='

javascript - 使用chartjs的getContext错误

Excel 2010 VBA 删除图表

angularjs - 如何构建这个圆形的两色调 donut chart ?

vba - 在列中的每个单元格中查找特定内容,并在某些情况下删除该行

vba - 格式化以在组合框和链接单元格输出中显示时间到毫秒值

c# - 以编程方式在 Excel 中嵌入对象

vba - 让用户单击单元格作为使用 VBA 的 Excel InputBox 的输入

Excel - 多个值,需要从查找中添加值