Восстановить поведение изменения размера диаграммы Excel по умолчанию с помощью VBA

Я ищу способ восстановить стандартное/собственное поведение изменения размера диаграммы в Excel 2010 после ее отключения (например, манипулируя диаграммой с помощью VBA).

Теперь я нигде не смог найти ничего о поведении, которое я имел в виду, поэтому я собираюсь предположить, что оно нуждается в подробном объяснении.

Введите и выберите случайные числовые данные в 4-5 ячейках Excel и вставьте новую диаграмму Clustered Columns. Вам нужно увидеть область графика диаграммы. Теперь выберите диаграмму и получите значение PlotArea.Top со следующей строкой.

ActiveChart.PlotArea.Top

Если вы не трогали диаграмму, это должно вернуть значение 7. Теперь используйте один из манипуляторов диаграммы, чтобы изменить размер диаграммы по вертикали, и снова используйте ту же командную строку.

activechart.plotarea.top

Обратите внимание, что возвращаемое значение по-прежнему равно 7. Теперь установите для этого свойства значение 7 в VBA.

ActiveChart.PlotArea.Top = 7

Снова возьмите один из рулей, измените размер диаграммы по вертикали и снова получите свойство .top, используя:

ActiveChart.PlotArea.Top

Обратите внимание, как изменилось значение. Оно будет либо меньше, либо больше 7 в зависимости от того, уменьшили или увеличили вы размер диаграммы.

Как только любой элемент диаграммы был перемещен вручную или с помощью кода VBA, он теряет это свойство «абсолютной позиции» и начинает перемещаться внутри ChartArea всякий раз, когда изменяется размер диаграммы. Хотя некоторые элементы можно сбросить с помощью .SetElement, это не работает для области графика. Например, следующие командные строки не восстанавливают поведение, которое я описываю.

ActiveChart.SetElement msoElementPlotAreaNone
ActiveChart.SetElement msoElementPlotAreaShow

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

Итак, вернемся к вопросу: кто-нибудь знает способ восстановить это поведение по умолчанию либо для всей диаграммы, либо, по крайней мере, конкретно для PlotArea?

Заранее спасибо всем, кто может помочь!

Винсент


person Vincent Courtemanche    schedule 08.12.2014    source источник
comment
У меня были смешанные результаты с использованием ActiveChart.ClearToMatchStyle.   -  person Jon Peltier    schedule 29.01.2015
comment
Спасибо за предложение! К сожалению, это не работает в моей ситуации (например, для участка)   -  person Vincent Courtemanche    schedule 29.01.2015
comment
Да... Excel иногда такой.   -  person Jon Peltier    schedule 12.02.2015


Ответы (1)


Я столкнулся с этим, когда вручную изменил размер области графика, а затем, когда легенда была перемещена, она вообще не изменила размер области графика.

Я пытался сохранить свою диаграмму в качестве шаблона (щелкните правой кнопкой мыши, чтобы сохранить как шаблон в Excel 2013), но область графика все еще была установлена ​​вручную.

Поэтому я бы рекомендовал сохранить поведение автоматического размера перед сохранением шаблона, поскольку единственный известный мне способ переустановить поведение автоматического размера диаграммы после того, как он был изменен вручную, — это использовать макрос

Вот макрос, который я использовал для восстановления поведения автоматического изменения размера.

Sub Macro1()
'
  ' this selects the chart based on the chart name
  ActiveSheet.ChartObjects("Chart 4").Activate
  ' this selects the plot area
  ActiveChart.PlotArea.Select
  ' this clears any custom formatting such as borders or fill colors
  ActiveChart.PlotArea.ClearFormats
  ' this resets the auto-sizing behavior after plot area manually re-sized
  ActiveChart.PlotArea.Position = xlChartElementPositionAutomatic
End Sub

использованная литература

person ClearBlueSky85    schedule 02.05.2016
comment
вау, не могу поверить, что кто-то наконец понял это :) после небольшого тестирования атрибут xlChartElementPositionAutomatic выглядит именно так, как я искал. Спасибо! - person Vincent Courtemanche; 22.12.2016