Это невозможно без использования VBA, но с VBA его можно автоматизировать для запуска любых изменений диаграммы. В этом коде предполагается, что диаграмма является встроенной диаграммой (встроенной в лист), а не диаграммой.
- Выберите вкладку
Developer
(инструкция, если она не отображается).
- Выберите
Editor
.
- В окне проекта щелкните правой кнопкой мыши в любом месте и выберите
Insert
, Module
.
- Выбрав новое окно Module, нажмите F6 (или нажмите
View
затем Properties Window
).
- Измените имя на
ChartEventModule
и закройте окно свойств.
- Вставьте следующий код в окно
ChartEventModule
:
Код ChartEventModule:
Option Explicit
Dim chartEventClassModule As New chartEventClassModule
Private Const chartSheet = "Sheet1"
Private Const chartNumber = 1
Sub RecalculateXAxisTitlePosition()
Dim chart As chart, plot As PlotArea, axis As axis, title As AxisTitle, titleXPos As Double, titleYPos As Double
Set chart = Worksheets(chartSheet).ChartObjects(chartNumber).chart
Set plot = chart.PlotArea
Set axis = chart.Axes(xlCategory) ' xlCategory is X axis, xlValue is Y axis
' If the X axis doesn't have a title, exit out
If Not axis.HasTitle Then Exit Sub
Set title = axis.AxisTitle
' Not necessary to set font size and text each time
title.Text = "Verknadsgrad"
title.Font.Size = 12
' .Position can be xlChartElementPositionAutomatic (-4105) or xlChartElementPositionCustom (-4114)
title.Position = xlChartElementPositionCustom
' Without a title the plotarea top is 9
' With a title font size 12 the title height is 17.4, and the plotarea top is 26.4
plot.Top = 9
' The PlotArea includes the axes. The Y axis throws off our centering if we center based on the PlotArea.
titleXPos = axis.Left + (axis.Width / 2) - (title.Width / 2)
titleYPos = plot.Top + plot.Height
title.Left = titleXPos
title.Top = titleYPos
' OPTIONAL CODE
' This code sets the background fill to DiagonalDown, which ensures it goes exactly from corner to corner
With plot.Format.Fill
.Visible = msoTrue
.TwoColorGradient Style:=msoGradientDiagonalDown, variant:=1
' Green color
.ForeColor.RGB = RGB(0, 176, 0)
' Red color
.BackColor.RGB = RGB(255, 0, 0)
' Percentage to be fully red (<=15%)
.GradientStops(1).Position = 0.15
' Percentage to be fully green (>=85%)
.GradientStops(2).Position = 0.85
' Middle color (yellow), center point (50%), Transparency (0%), Point to insert into list of gradients (1)
.GradientStops.Insert RGB(255, 255, 0), 0.5, 0, 1
End With
End Sub
Sub Initialise()
Set chartEventClassModule.myChart = Worksheets(chartSheet).ChartObjects(chartNumber).chart
End Sub
Мне не понравилось, когда я устанавливал градиент, я должен был установить статический угол, поэтому я установил его в коде. Для него установлено значение DiagonalDown
которое автоматически рассчитывает угол в зависимости от соотношения сторон диаграммы.
- Обязательно установите 2 константы
chartSheet
и chartNumber
соответственно в верхней части кода.
- Вернувшись в окно проекта, щелкните правой кнопкой мыши и создайте
Class Module
.
- Используя то же окно свойств (F6), установите имя
ChartEventClassModule
.
- Вставьте следующий код в окно
ChartEventClassModule
:
Код ChartEventClassModule:
Option Explicit
' https://msdn.microsoft.com/VBA/Excel-VBA/articles/using-events-with-embedded-charts
Public WithEvents myChart As chart
Private Sub myChart_Calculate()
Call ChartEventModule.RecalculateXAxisTitlePosition
End Sub
Private Sub myChart_Resize()
Call ChartEventModule.RecalculateXAxisTitlePosition
End Sub
Private Sub myChart_SeriesChange(ByVal SeriesIndex As Long, ByVal PointIndex As Long)
Call ChartEventModule.RecalculateXAxisTitlePosition
End Sub
Этот код обнаруживает изменения в диаграмме и перезапускает функцию для установки заголовка оси. К сожалению, мы ограничены в доступных событиях Chart.
- В окне Project дважды щелкните
ThisWorkbook
и вставьте следующий код:
Код этой рабочей книги:
Private Sub Workbook_Open()
ChartEventModule.Initialise
End Sub
- Сохраните книгу как макрокоманду (.xlsm). Закройте и снова откройте рабочую книгу.
Presto! Теперь при любых изменениях данных, серии или размера диаграммы будет вызываться событие, которое заставляет его пересчитать положение заголовка оси: