在图表旁边添加了一个刷新按钮,用于调整数据标签。下面是按钮背后的代码。
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
resetLabels dLabels
AdjustLabels dLabels ' This Sub is to deal with the overlaps
Next
End Sub
Private Sub AdjustLabels(ByRef v() As DataLabel)
Application.ScreenUpdating = False
Dim i As Long, j As Long, adj As Long
Dim temp_a As String, temp_b As String
For i = LBound(v) To UBound(v) - 1
For j = LBound(v) + 1 To UBound(v)
temp_a = v(i).Caption
temp_b = v(j).Caption
Debug.Print temp_a & " - | - " & temp_b
v(i).Caption = "a"
v(j).Caption = IIf(temp_a = temp_b, "a", "b")
ActiveSheet.ChartObjects("Chart 1").Activate
If ((v(j).Top = v(i).Top) And (v(i).Caption <> v(j).Caption) And (v(j).Left = v(i).Left)) Then
Select Case v(j).Position
Case xlLabelPositionAbove
v(j).Position = xlLabelPositionRight
Case xlLabelPositionRight
v(j).Position = xlLabelPositionBelow
Case xlLabelPositionBelow
v(j).Position = xlLabelPositionLeft
Case xlLabelPositionLeft
v(j).Position = xlLabelPositionAbove
End Select
End If
v(i).Caption = temp_a
v(j).Caption = temp_b
temp_a = vbNullString
temp_b = vbNullString
Next j, i
Application.ScreenUpdating = True
End Sub
Sub resetLabels(ByRef v() As DataLabel)
For i = LBound(v) To UBound(v) - 1
v(i).Position = xlLabelPositionAbove
Next
End Sub