如何使用vba将旋转的形状移动到excel 2010中的特定位置

时间:2012-12-28 08:54:08

标签: vba excel-vba excel-2010 excel

我写了一些自动创建图表的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

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

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

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

  • 您可以将shape置于cell。然后根据需要调整大小。并旋转。
  • 然后更改bring forward上显示的Chart属性。
  • 下一步群组 ChartShape

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

答案 1 :(得分: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