2

После изменения порядка чисел на оси Y и установки пересечения оси X на 1 вместо 0, заголовок оси X больше не находится рядом с осью:

Есть ли способ прикрепить заголовок оси к оси, в идеале в белой области под ней? Ища свойства для заголовка оси, я не нахожу ничего о том, где он расположен.

1 ответ1

3

Это невозможно без использования VBA, но с VBA его можно автоматизировать для запуска любых изменений диаграммы. В этом коде предполагается, что диаграмма является встроенной диаграммой (встроенной в лист), а не диаграммой.

  1. Выберите вкладку Developer (инструкция, если она не отображается).
  2. Выберите Editor .
  3. В окне проекта щелкните правой кнопкой мыши в любом месте и выберите Insert , Module .
  4. Выбрав новое окно Module, нажмите F6 (или нажмите View затем Properties Window).
  5. Измените имя на ChartEventModule и закройте окно свойств.
  6. Вставьте следующий код в окно 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 которое автоматически рассчитывает угол в зависимости от соотношения сторон диаграммы.

  1. Обязательно установите 2 константы chartSheet и chartNumber соответственно в верхней части кода.
  2. Вернувшись в окно проекта, щелкните правой кнопкой мыши и создайте Class Module .
  3. Используя то же окно свойств (F6), установите имя ChartEventClassModule .
  4. Вставьте следующий код в окно 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.

  1. В окне Project дважды щелкните ThisWorkbook и вставьте следующий код:

Код этой рабочей книги:

Private Sub Workbook_Open()
    ChartEventModule.Initialise
End Sub
  1. Сохраните книгу как макрокоманду (.xlsm). Закройте и снова откройте рабочую книгу.

Presto! Теперь при любых изменениях данных, серии или размера диаграммы будет вызываться событие, которое заставляет его пересчитать положение заголовка оси:Окончательное изображение диаграммы Excel

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .