I have a spreadsheet containing two charts, in which I want to add some textboxes next to one of the series' points, based on values in a table.
I have created two procedures for this, each with its own pros and cons:
Sub add_comments(apply_to As Series, source_range As Range)
Dim i As Long
Dim c As Range
If source_range.Count > apply_to.Points.Count Then
Set source_range = source_range.Resize(apply_to.Points.Count, 1)
End If
i = 1
For Each c In source_range
If Not IsError(c) And i <= apply_to.Points.Count Then
If Len(c.Text) <> 0 Then
apply_to.Points(i).HasDataLabel = True
apply_to.Points(i).DataLabel.Text = c.Value2
apply_to.Points(i).DataLabel.Format.AutoShapeType = msoShapeRectangularCallout
With apply_to.Points(i).DataLabel.Format.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
apply_to.Points(i).DataLabel.Position = xlLabelPositionAbove
Else
If apply_to.Points(i).HasDataLabel Then
apply_to.Points(i).DataLabel.Delete
End If
End If
End If
i = i + 1
Next c
End Sub
The above code uses labels, which is pretty ideal, except I can't reposition the labels and it can get a bit ugly when they overlap.
Sub alternative_comments(apply_to As Series, source_range As Range)
Dim c As Range
Dim i As Long
If source_range.Count > apply_to.Points.Count Then
Set source_range = source_range.Resize(apply_to.Points.Count, 1)
End If
i = 1
For Each c In source_range
If Not IsError(c) And i <= apply_to.Points.Count Then
If Len(c.Text) <> 0 Then
With SPC_01.Shapes.AddLabel(msoTextOrientationHorizontal, 100, 100, 10, 10)
.TextFrame2.TextRange.Characters.Text = c.Text
With .Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
.Top = apply_to.Points(i).Top - .Height
.Left = apply_to.Points(i).Left - .Width
Debug.Print apply_to.Points(i).Top & " - " & .Top
Debug.Print apply_to.Points(i).Left & " - " & .Left
End With
End If
End If
i = i + 1
Next c
End Sub
The other solution uses textboxes, which is great for moving around and resizing, but the do not automatically scale to fit the text, and I can't find any sensible way to do that either.
As you can see I am stuck on both approaches, although I feel the downsides for using labels are somewhat less severe than for using textboxes. However, I wonder if any of you can tell me what the best approach is for automatically adding comments to datapoints in a series? Am I on the right track?
I have also posted this question to the VBAExpress forums, if any of you want to have a look at the entire workbook.