Vba 在图表中定位标签

Vba 在图表中定位标签,vba,excel,excel-2016,Vba,Excel,Excel 2016,我有一个包含两个图表的电子表格,其中我想根据表格中的值在系列的某个点旁边添加一些文本框 我为此创建了两个程序,每个程序都有自己的优缺点: 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 = sour

我有一个包含两个图表的电子表格,其中我想根据表格中的值在系列的某个点旁边添加一些文本框

我为此创建了两个程序,每个程序都有自己的优缺点:

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 
子添加注释(将注释应用于As系列,源代码范围作为范围)
我想我会坚持多久
调光范围
如果source_range.Count>将_应用于.Points.Count,则
设置源范围=源范围。调整大小(应用到.Points.Count,1)
如果结束
i=1
对于源_范围内的每个c

如果文本框方法不是iError(c)和i,则可以使用以下方法将其设置为自动调整大小:

.TextFrame2.AutoSize = msoAutoSizeShapeToFitText
然后有两个文本换行选项将更改外观。您可以将文本设置为换行:

.TextFrame2.WordWrap = True
这不会改变文本框的宽度,它会像上面那样垂直地显示文本框

也可以将其设置为不换行:

.TextFrame2.WordWrap = False
这将使其水平排列,直到遇到断线


因此,您可以根据需要设置文本框宽度并打开换行,或者在源文本中添加显式换行符(Alt+Enter)并关闭换行。

我认为最好的办法是首先计算哪些点将获得数据标签,然后计算出数据标签可以具有的最大宽度。这个宽度可能太小,您可以使用datalabel.top属性更改数据标签相对于图表顶部的位置,并将标签相互重叠。@Luuklag是的,这似乎是我最好的选择。但是,找出防止它们重叠的方法将是一件非常痛苦的事情:-非常感谢你的建议,我已经在使用它方面取得了一些进展。谢谢-正如你从图片中看到的,文本框会自动调整大小,严格地说,问题是它只在一个维度上自动调整大小!当然,用一个设定的宽度创建它们,然后从那里开始工作可能是一个解决方案。您是否尝试过关闭自动换行功能?这是一种选择吗?
.TextFrame2.WordWrap = False