【问题标题】:How to move a rotated shape to a specific location in excel 2010 using vba如何使用vba将旋转的形状移动到excel 2010中的特定位置
【发布时间】:2012-12-28 08:54:08
【问题描述】:

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

我在这里错过了什么?

【问题讨论】:

  • +1 表示经过深思熟虑的书面问题。如果您可以提供一个包含您的图像的虚拟文件的链接,这可能会有所帮助。

标签: vba excel excel-2010


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为你是对的。后来我意识到它可能没有达到我的预期,因为当脚本对其执行操作时,图像撞到了图表的两侧。在将其放置在图表上之前对其进行大小调整和定位将消除该问题。我打算在星期一试一试。
【解决方案2】:

我最终在复制和粘贴到图表然后定位之前旋转并调整了图像大小。我不得不使用 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

【讨论】:

  • 两年半之后……您找到了答案
猜你喜欢
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多