5

我编写了一些自动创建图表的 VBA 代码。此图表上的一个轴不使用普通标签,而是使用图形。我已将图形存储为图像,并使用 .Copy 和 .Paste 方法将此图像的副本复制到图表上。

这是令人困惑的地方。我需要旋转图像以使其与轴对齐(使用 .rotation 属性)。但是当我设置 .top 和 .left 属性时,形状并没有达到我期望的位置。事实上,将属性设置为 0 和 0 也不符合我的预期。我尝试更改在图像对象上设置属性的方式的顺序,但它只出现在不同的(错误的)位置。

我确定我错过了 VBA/Excel 如何相对于我将顶部和左侧属性设置为的对象放置的一些重要方面。基本上我的目标是使图表左侧的图像具有与绘图区域的高度相同的宽度(由于图像被旋转,我推测这将使其大​​小相同)。

此代码不起作用:

Sheets(ImageSheet).Shapes("agreement").Copy
c.Chart.Paste
c.Chart.Shapes(1).Rotation=270
c.Chart.Shapes(1).width = c.Chart.PlotArea.height
c.Chart.shapes(1).left = 5
c.Chart.Shapes(1).top = c.Chart.PlotArea.top

我也试过这段代码

c.chart.Shapes(1).top = c.chart.PlotArea.top + c.Chart.PlotArea.height

因为我认为它可能在不旋转时将“顶部”计算为图像对象的左上角(旋转 270 度使该点位于应与绘图区域底部对齐的位置)。但这也没有达到我的预期。

该图像是一个细长的矩形,用作轴的标签。该图表最终将像这样布置:http: //imgur.com/NrSXR轴标签图像将是这样的http://imgur.com/08EWU

我在这里想念什么?

4

2 回答 2

1

您是否可以将图表对齐到形状可以对齐/在单元格上的位置?

如果是,那么这里是一个建议:-

  • 你可以定位shape到一个cell. 然后根据需要调整大小。并旋转。
  • 然后将其bring forward属性更改为显示在Chart.
  • 下一 ChartShape

PS:我录制了一个宏。但是,如果您能向我们展示您的问题的确切图片(=您的工作表/图表/图像应该是什么样子),那将是最好的。

于 2012-12-28T17:24:50.060 回答
1

在复制并粘贴到图表然后定位之前,我最终旋转并调整了图像大小。我不得不使用 IncrementLeft 和 IncrementTop 方法,而不是直接设置 left 和 top 属性,因为那样没有达到预期的效果。

当粘贴到图表中时,对象总是在左上角结束,所以我可以向左增加我想要的少量作为我想要的边距,然后将顶部增加 PlotArea.top 的值到将其与绘图区域对齐。

我也很惊讶,在创建图像的副本时,它保留了我将其复制到新工作表和图表时所指的“名称”。这对于在图表上定位图像特别有用。

我还需要在程序的最后执行此代码,在其他所有内容都已定位和对齐之后,或者当我为我的一个系列定位数据标签时,它们不会正确显示。

这是我最终使用的代码:

    'make a copy of the label image and refer to it with a variable for convenience
    Sheets(ImageSheet).Shapes("maturity").Copy
    i = Sheets(ImageSheet).Shapes.Count
    Sheets(ImageSheet).Paste
    Dim axisImage As Shape
    Set axisImage = Sheets(ImageSheet).Shapes(i + 1)

    'rotate and resize the image
    With axisImage
        .Rotation = 270
        .width = c.Chart.PlotArea.height
    End With

    'cut and paste the new image to the chart
    axisImage.Cut
    c.Chart.Paste

    'position it in the chart using IncrementTop and IncrementLeft because setting the properties directly does not have the desired effect
    c.Chart.Shapes("maturity").IncrementTop c.Chart.PlotArea.top
    c.Chart.Shapes("maturity").IncrementLeft c.Chart.PlotArea.left - c.Chart.Shapes("maturity").height
于 2015-05-28T00:43:38.747 回答