VBA图例和绘图区调整大小

4

我有一个Excel图表,根据切片器中做出的选择而改变。 我发现绘图区域和图例区域会根据所选内容而改变。

我尝试使用vba固定绘图区域的位置和大小,但很遗憾这并不起作用。

绘图区域和图例仍然会调整大小,导致图例重叠在绘图区域上。显然,我是不想要这样的结果的。

我将以下代码放置在vba编辑器的工作表页面中:

Option Explicit
Private Sub Chart_Calculate()

ChartObjects("grafiek 4").Activate
ActiveChart.PlotArea.Width = 637.783
ActiveChart.Legend.Left = 716.514
ActiveChart.Legend.Width = 176.735
ActiveChart.Legend.Height = 295.334

End Sub

有了这段代码,我以为自动调整大小的问题会消失,但是我发现图例有时仍然会与绘图区域重叠。

有没有一种永久性解决这个问题的方法?

编辑1:

昨天,我仅为绘图区域添加了一些参数。当时似乎起作用了。但现在我再次尝试,发现图例又重叠到了绘图区域。

我将代码更改为:

Option Explicit
Private Sub Chart_Calculate()

ChartObjects("grafiek 4").Activate
ActiveChart.PlotArea.Top = 33.102
ActiveChart.PlotArea.Left = 67.1
ActiveChart.PlotArea.Width = 637.783
ActiveChart.Legend.Top = 7
ActiveChart.Legend.Left = 716.514
ActiveChart.Legend.Width = 176.735
ActiveChart.Legend.Height = 329.667

End Sub

因此,需要为绘图区域添加两个参数。

编辑2: 我已经在Excel中检查了图例属性。 在“图例选项”下有一个复选框:显示图例而不重叠绘图区域(我不知道确切的英语文本)。 这个框已被勾选,但它确实重叠在绘图区域上。

为什么无法实现这一点? 固定绘图区域和图例的尺寸不应该太难。

编辑3: 我现在在我的工作簿中有这个例程:

Option Explicit
Private Sub Chart_Calculate()

ChartObjects("grafiek 4").Activate
With ActiveChart
    With .PlotArea
        .Top = 33.102
        .Left = 67.1
        .Width = 637.783
    End With
    With .Legend
        .IncludeInLayout = True
        .Position = xlLegendPositionRight
        .AutoScaleFont = False
        .Font.Size = 8
        .Top = 5
        .Left = 706.899
        .Width = 179.735
        .Height = 336.681
    End With
End With

End Sub
Sub kopieergrafiek()

ActiveSheet.ChartObjects("Grafiek 4").Copy

End Sub

(包括我帖子下面的评论中的建议)
看起来似乎不起作用。worksheet_change事件可能更有效吗?
编辑4: 我仍然没有解决这个问题。当一个图例项的名称太长而无法适应空间时,它已经发生了。当图例中有太多项目无法适应可用空间时,也会发生这种情况。
我认为这没有解决办法。除非我能告诉Excel最大化图例中的项目数量。或者最大化系列名称的长度。

2
可能不完全符合您的要求,但您可以像这样将图例与绘图区分离:ActiveChart.Legend.IncludeInLayout = True,然后设置位置,如下所示:ActiveChart.Legend.Position = xlLegendPositionRight - Automate This
3个回答

3

我自己也遇到了这个问题,传说调整图区大小的问题。我尝试了 Portland Runner 建议的方法,只将 .Legend.IncludeInLayout 设置为 false(因此将图例与图区分开,就像他建议的那样,也许他打错了?),我的图区不再被调整大小。


当我再次使用这个模板时,我想添加一列,用于创建较短的项目名称。这些较短的名称可以用于图表/系列。进一步思考后,我认为可能可以使用公式来命名系列,例如:left(cell, 30),将系列名称限制为项目名称的前30个字符。然后,系列名称永远不会超过30个字符,这将使图例不再调整大小。我不知道这是否可以通过VBA实现。 - DutchArjo
我只是简单地更改了我的VBA代码。我添加了一个新的变量,现在用于显示sku,但现在使用较短的名称。此变量的所有项目现在都有不超过60个字符的名称。这对我来说是最容易实现所需结果的方法。该代码仅使用=left(RC, 60)创建较短的名称,之后,所有公式都存储为值,并使用range().value = range().value - DutchArjo
奇怪 - 我也对每个图表运行了 Portlands 的两行代码,现在它们的表现正常了,即当图例中的条目数量发生变化时,图例不会重叠在图表上。 - whytheq

2

我知道这是一个旧的帖子,但由于我遇到了同样的问题并成功解决了它,但没有在这个帖子中找到正确的答案,所以我认为发表我的解决方案是很好的。非常重要的一点是刷新数据透视图布局,否则您将看不到图例的区别。这将调整图例,使其不会重叠绘图区域。它还会增加图表的大小,因此如果您不想要这样做,您需要使用其他代码。

 Sub AdjustChartLegendActiveSheet()
Dim j
    For j = 1 To ActiveSheet.Shapes.count
        If ActiveSheet.Shapes(j).Type = msoChart Then
            ActiveSheet.Shapes(j).chart.Legend.IncludeInLayout = True
            ActiveSheet.Shapes(j).chart.PivotLayout.PivotTable.PivotCache.Refresh
        End If
    Next j
    End Sub

1
我也遇到了这个问题,并找到了答案。我找到了适合我的解决方法。不确定为什么它有效,但我执行以下步骤:
  • 设置图例位置
  • 取消图例的停靠(legend.includeLayout = false)
  • 调整绘图区域大小以符合要求
  • 重新停靠图例(legend.includeLayout = True)
  • 设置图例左侧位置 之后,图例将正确定位并对齐。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接