Como ancorar o título do eixo no eixo x?

2

Após reverter a ordem numérica no eixo y, e definir o eixo x para cruzar em 1 em vez de em 0, o título do eixo x não está mais próximo ao eixo:

Existe alguma maneira de ancorar o título do eixo ao eixo, idealmente na área branca abaixo dele? Pesquisando as propriedades do título do eixo, não encontro nada sobre onde ele está posicionado.

    
por eirikdaude 16.06.2017 / 11:56

1 resposta

3

Não é possível sem usar o VBA, mas com o VBA ele pode ser automatizado para acionar qualquer alteração no gráfico. Este código assume que o gráfico é um gráfico incorporado (incorporado em uma planilha), em oposição a uma planilha de gráficos .

  1. Selecione a guia Developer ( instruções se não for mostrado ).
  2. Selecione Editor .
  3. Na janela Project, clique com o botão direito do mouse em qualquer lugar e selecione Insert , Module .
  4. Com a nova janela Module selecionada, pressione F6 (ou clique em View then Properties Window ).
  5. Altere o nome para ChartEventModule e feche a janela Propriedades.
  6. Cole o seguinte código na janela ChartEventModule :

Código 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

Eu não gostei disso quando configurei o gradiente Eu tive que definir um ângulo estático, então eu configurei no código. Ele é definido como DiagonalDown , que calcula automaticamente o ângulo, dependendo da proporção do gráfico.

  1. Certifique-se de definir as duas constantes chartSheet e chartNumber apropriadamente na parte superior do código.
  2. De volta à janela Project, clique com o botão direito e crie um Class Module .
  3. Usando a mesma janela de propriedades ( F6 ), defina o nome como ChartEventClassModule .
  4. Cole o seguinte código na janela ChartEventClassModule :

Código 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

Este código detecta alterações no gráfico e executa novamente a função para definir o título do eixo. Infelizmente, estamos limitados nos eventos do Gráfico disponíveis .

  1. Na janela Project, clique duas vezes em ThisWorkbook e cole o seguinte código:

Código do ThisWorkbook:

Private Sub Workbook_Open()
    ChartEventModule.Initialise
End Sub
  1. Salve a pasta de trabalho como uma pasta de trabalho habilitada para macro (.xlsm). Feche e reabra a pasta de trabalho.

Presto! Agora, em quaisquer alterações nos dados, séries ou tamanho do gráfico, será acionado um evento que faz com que ele recalcule a posição do título do eixo:

    
por 06.07.2017 / 07:04