Как перемещать повернутую форму в определенное место в excel 2010 с помощью vba

Я написал код VBA, который автоматически создает диаграмму. Одна из осей на этой диаграмме не использует обычные метки, а графику. Я сохранил изображение как образ, и я использую методы .Copy и .Paste, чтобы получить копию этого изображения на диаграмме.

Вот где это запутывает. Мне нужно повернуть изображение, чтобы совместить его с осью (используя свойство .rotation). Но когда я устанавливаю свойства .top и .left, форма не заканчивается там, где я ожидал бы. Фактически установка свойств на 0 и 0 не делает то, что я ожидаю. Я попытался изменить порядок того, как я устанавливаю свойства объекта изображения, но он отображается только в другом (неправильном) месте.

Я уверен, что мне не хватает какого-то жизненно важного аспекта того, как VBA/Excel помещает объект относительно того, к чему я устанавливаю свойства top и left. В основном моя цель - сделать изображение на левой стороне диаграммы с той же шириной, что и высота участка графика (поскольку изображение повернуто, я теоретизирую, что это сделает его того же размера).

Этот код не работает:

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 градусов делает эту точку в месте, где она должна совпадать с нижней частью участка графика). Но это не делает то, что я ожидал.

The image is a skinny rectangle that acts as a label for the axis. The chart will end up being laid out like this: http://imgur.com/NrSXR and the axis label image would be something like this http://imgur.com/08EWU

Что мне здесь не хватает?

5
nl ja de
+1 для задумчиво написанного вопроса. Это может помочь, если вы можете предоставить ссылку на какой-нибудь фиктивный файл с вашим изображением.
добавлено автор Scott Holtzman, источник

2 ответы

Возможно ли, чтобы вы выстроили диаграмму в положение, в котором форма могла бы выровняться по ячейке?

ЕСЛИ ДА, то вот предложение: -

  • Вы можете поместить shape в ячейку . Затем отрегулируйте размер так, как вам нужно. И повернуть.
  • Затем измените свойство bring forward на Chart .
  • Следующая Группа Диаграмма и Shape

PS: Я записал макрос. Однако лучше всего, если бы вы могли показать нам, каково ваше точное изображение (= как должен выглядеть ваш рисунок/диаграмма/изображение) вашего вопроса.

1
добавлено
Я думаю ты прав. Позже я понял, что это, вероятно, не делает того, чего я ожидал, потому что изображение попадало в стороны диаграммы, поскольку сценарий выполнял на нем действия. Определение размера и позиционирование, прежде чем размещать его на диаграмме, устранит эту проблему. Я собираюсь попробовать это в понедельник.
добавлено автор Mike D., источник

Я закончил поворот и изменение размера изображения перед копированием и вставкой на график, а затем позиционированием его. Мне пришлось использовать методы IncrementLeft и IncrementTop, а не устанавливать свойства слева и сверху напрямую, потому что это не имело желаемого эффекта.

Когда вы делаете пасту в диаграмме, объект всегда оказывался в верхнем левом углу, поэтому я мог бы увеличивать влево небольшую сумму, которую я хотел в качестве поля, который я хотел там, и увеличивать вершину на значение 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
1
добавлено
Через 2 с половиной года ... вы нашли ответ .
добавлено автор bonCodigo, источник