2015-07-15 4 views
2

Ну, я написал этот код, который больше, чем просто добавление вторичной оси. Однако иногда он возвращает ошибку во время выполнения С командой, на .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 
+0

Когда это происходит, вы можете «продолжить», и макрос продолжает работать, как и должно быть? Какая ошибка возникает, когда это происходит? Или это заставляет вас остановиться и ожидает, что вы что-то исправите? – BruceWayne

+0

@ user3578951 Если я в Excel, то получаю ошибку времени выполнения -2147467259 (80004005). Если я в режиме отладки, то также получаю сообщение о том, что метод «Оси» объекта «Графики» не удался. В обеих ситуациях макрос останавливается. –

+0

Просто оглядываясь в сети, это работает? Вместо этой строки попробуйте '.Axes (xlValue, xlSecondary) .SetElement (msoElementChartTitleAboveChart)'. Обратите внимание, что непроверено и может также дать ошибку ... – BruceWayne

ответ

0

Отказ от ответственности: Это не строго говоря, ответ, так как он не содержит новой информации, только повторяет его. Но поскольку этот вопрос остается без ответа (за исключением намека @An old man in the sea., скрытого глубоко в комментариях), я хотел бы записать его здесь обычным способом, чтобы помочь другим людям.

У меня также есть некоторые полезные сообщения об ошибках, такие как System.Runtime.InteropServices.COMException (0x80004005): Error HRESULT E_FAIL has been returned from a call to a COM component..

Как было предложено в комментариях к @An old man in the sea., я затронул проблематичную часть, касающуюся оцифровки овальной формы, шкалы и т. Д. После того, как у оси были некоторые данные, связанные с ней. Это привело к исчезновению исключения и после нескольких дней был достигнут прогресс :-)

Таким образом, в псевдокоде вместо

FormatSecondaryAxis(chart); 
DrawDataToSecondaryAxis(chart); 

просто поменять порядок и сделать чертеж первым и вторым форматирование.


Да, и кстати, это C# код:

chart.HasAxis[Excel.XlAxisType.xlValue, Excel.XlAxisGroup.xlSecondary] = true; 
chart.HasAxis[Excel.XlAxisType.xlCategory, Excel.XlAxisGroup.xlSecondary] = true; 
chart.SetElement(Microsoft.Office.Core.MsoChartElementType.msoElementSecondaryValueAxisTitleAdjacentToAxis); 

не делает трюк. Последняя строка генерирует исключение, если фактические данные не связаны с осью.

Смежные вопросы