Как привязать заголовок оси к оси x?

2

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

enter image description here

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

eirikdaude
источник
Одним из обходных путей, пока вы не найдете решение, является создание текстового поля без заливки и без строки. Здесь вы можете ввести название оси и разместить его там, где вам нравится.
Firee
Разве вы не можете просто перетащить его туда, куда хотите, или это не то, что вы подразумеваете под «якорем»?
Bandersnatch
@Firee Это мой текущий обходной путь. Тем не менее, я бы очень хотел, чтобы он автоматически перемещался по оси, в случае будущих изменений на графике.
eirikdaude
@eirikdaude Не могли бы вы загрузить файл Excel, чтобы мы могли лучше рассмотреть его?
Firee

Ответы:

3

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

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

Этот код обнаруживает изменения в диаграмме и повторно запускает функцию для установки заголовка оси. К сожалению мы ограничено в графике доступных событий ,

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

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

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

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

Ian
источник