Ну, я написал этот код, который больше, чем просто добавление вторичной оси. Однако иногда он возвращает ошибку во время выполнения С командой, на .Axes(xlValue, xlSecondary).HasTitle = True
в конце кода. Ради полноты я переписал всю программу. Эта ошибка во время выполнения не всегда происходит, но я не понимаю, когда это происходит, или почему ... Вы знаете, как решить эту проблему?Добавление вторичной оси в Excel VBA
Любая помощь будет оценена
Private Sub criargraf()
Dim cont, cont2 As Integer
Application.ScreenUpdating = False
If Sheets("SubUN").ChartObjects.Count > 0 Then
Sheets("SubUN").ChartObjects.Delete
End If
Sheets("SubUN").Shapes.AddChart
Set graf = Sheets("SubUN").ChartObjects(1)
If graf.Chart.SeriesCollection.Count > 0 Then
cont = graf.Chart.SeriesCollection.Count
Do While cont > 0
graf.Chart.SeriesCollection(1).Delete 'às vezes,Quando se cria um gráfico, este já vem com uma série, portanto tens de fazer um Newseries a menos
cont = cont - 1
Loop
End If
With graf.Chart
.ChartArea.Width = 878
.Parent.Height = 470
.Parent.Top = 37
.Parent.Left = 575
.HasLegend = True
.Legend.Left = 215
.Legend.Top = 400
.Legend.Height = 100
.Legend.Width = 500
.PlotArea.Height = 350
.PlotArea.Width = 830
.PlotArea.Left = 20
.PlotArea.Top = 30
.ChartType = xlLine
.HasTitle = True
.ChartTitle.Characters.Text = Range("E134")
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "Meses"
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = Range("E131")
End With
cont = 1
cont2 = 1
Do While Range("L" & 121 + cont).Value <> ""
If Sheets("SubUN").Rows(120 + cont).EntireRow.Hidden = False Then
With graf.Chart
.SeriesCollection.NewSeries
.SeriesCollection(cont2).Values = Sheets("SubUN").Range("M" & (120 + cont) & ":X" & (120 + cont))
.SeriesCollection(cont2).Name = Sheets("SubUN").Range("L" & (120 + cont))
.SeriesCollection(cont2).XValues = Range("M120:X120")
End With
cont2 = cont2 + 1
End If
cont = cont + 1
Loop
cont = 1
Do While Range("L" & 145 + cont).Value <> ""
If Sheets("SubUN").Rows(145 + cont).EntireRow.Hidden = False Then
With graf.Chart
.SeriesCollection.NewSeries
.SeriesCollection(cont2).Values = Sheets("SubUN").Range("M" & (145 + cont) & ":X" & (145 + cont))
.SeriesCollection(cont2).Name = Sheets("SubUN").Range("L" & (145 + cont))
.SeriesCollection(cont2).XValues = Range("M145:X145")
End With
cont2 = cont2 + 1
End If
cont = cont + 1
Loop
cont = 1
Do While Range("L" & 168 + cont).Value <> ""
If Sheets("SubUN").Rows(168 + cont).EntireRow.Hidden = False Then
With graf.Chart
.SeriesCollection.NewSeries
.SeriesCollection(cont2).Values = Sheets("SubUN").Range("M" & (168 + cont) & ":X" & (168 + cont))
.SeriesCollection(cont2).Name = Sheets("SubUN").Range("L" & (168 + cont))
.SeriesCollection(cont2).XValues = Range("M168:X168")
.SeriesCollection(cont2).AxisGroup = xlSecondary
.SeriesCollection(cont2).ChartType = xlColumnClustered
.SeriesCollection(cont2).ApplyDataLabels
'.SeriesCollection(cont2).DataLabels.Position = xlLabelPositionAbove
End With
cont2 = cont2 + 1
End If
cont = cont + 1
Loop
If cont2 > 2 Then
graf.Chart.HasAxis(xlValue, xlSecondary) = True
With graf.Chart
'.Legend.Left = 2000 * (cont2)^-1
.Legend.Width = 100 * (cont2)
.Axes(xlValue, xlSecondary).HasTitle = True
.Axes(xlValue, xlSecondary).AxisTitle.Characters.Text = " Variação (%)"
.Axes(xlValue).HasMajorGridlines = True
.Axes(xlValue).MajorGridlines.Border.LineStyle = xlDashDotDot
.Axes(xlValue).MajorGridlines.Border.Color = RGB(190, 190, 190)
End With
End If
End Sub
Когда это происходит, вы можете «продолжить», и макрос продолжает работать, как и должно быть? Какая ошибка возникает, когда это происходит? Или это заставляет вас остановиться и ожидает, что вы что-то исправите? – BruceWayne
@ user3578951 Если я в Excel, то получаю ошибку времени выполнения -2147467259 (80004005). Если я в режиме отладки, то также получаю сообщение о том, что метод «Оси» объекта «Графики» не удался. В обеих ситуациях макрос останавливается. –
Просто оглядываясь в сети, это работает? Вместо этой строки попробуйте '.Axes (xlValue, xlSecondary) .SetElement (msoElementChartTitleAboveChart)'. Обратите внимание, что непроверено и может также дать ошибку ... – BruceWayne