Добрый день, коллеги! Столкнулся с одной неприятностью при программной работе с диаграммами (Excel 2013). Я динамически формирую ряды и вывожу их на диаграмму. И всё просто замечательно, пока я не начинаю выводить ряды, которые должны отображаться на альтернативной шкале (то есть на графике 2 шкалы и часть рядов выводятся, базируясь на левой, часть - на правой). При каждом изменении настроек я полностью удаляю все ряды и наполняю диаграмму ими заново. Так вот для двойной шкалы на 2-3 раз диаграмма ломается. Вначале она перестаёт отображать ряды и выводит неправильную легенду, потом и вовсе чистый лист без легенды, но её можно починить, если войти в диалог Выбрать данные... и просто нажать OK. После этого диаграмма отрисовывается нормально, то есть ряды задаются абсолютно корректно. Код выкладываю, но к сожалению, он довольно запутанный, так как обрабатывает массу чек-боксов и радио-переключателей... в общем обращайте больше внимания на то, что я делаю с объектами диаграммы. Если кто-то сможет подсказать куды копать и где я могу быть неправым, то буду крайне благодарен. [vba]
Код
Public Sub RepaintD1()
'On Error Resume Next
Dim serNew As Series Dim i As Integer, r As Integer, iOffset1 As Integer, iOffset2 As Integer Dim arrSeries() As Integer Dim iFirstScale As Integer, iSecondScale As Integer, iScale As Integer Dim iCount As Integer, AxisGroup1ChartType, AxisGroup2ChartType Dim chtTemp As Chart
RefreshSheetVars
ReDim Preserve arrSeries(2, cConstr3_End_Row - cConstr3_Start_Row) For r = cConstr3_Start_Row To cConstr3_End_Row If wsC1.Cells(r, cConstr3_MainStatus_Col) = 1 Then
iScale = wsC1.Cells(r, cConstr3_Scale_Col)
If iFirstScale = 0 Or iFirstScale = iScale Then iFirstScale = iScale iCount = iCount + 1 arrSeries(1, iCount) = r arrSeries(2, iCount) = 1 ElseIf iSecondScale = 0 Or iSecondScale = iScale Then iSecondScale = iScale iCount = iCount + 1 arrSeries(1, iCount) = r arrSeries(2, iCount) = 2 Else MsgBox "Поскольку на диаграмме одновременно может быть только 2 разных шкалы, " & vbCr & _ "то график '" & wsC1.Cells(r, cC1_Header_Col) & "' не будет построен. " & vbCr & _ "Удалите прежде какой-нибудь показатель, чтобы освободить шкалу.", vbExclamation End If
End If Next
ActiveSheet.ChartObjects(cD1).Activate With ActiveChart Do While .FullSeriesCollection.Count > 0 .FullSeriesCollection(1).Delete Loop End With
If iCount = 0 Then Exit Sub
ReDim Preserve arrSeries(2, iCount)
Set chtTemp = ActiveSheet.ChartObjects(cD1).Chart 'chtTemp.Activate
With wsC1 iOffset1 = .Range(cC1_MonthStart) iOffset2 = .Range(cC1_MonthFinish) For i = LBound(arrSeries, 2) To UBound(arrSeries, 2) Set serNew = chtTemp.SeriesCollection.NewSeries serNew.Name = "=" & .Name & "!" & .Cells(arrSeries(1, i), cC1_Header_Col).Address If wsD1.Shapes("swMonths").DrawingObject.Value = xlOn Then serNew.Values = "=" & wsC1.Name & "!" & _ .Range(.Cells(arrSeries(1, i), cC1_MonthSerBegin_Col).Offset(0, iOffset1 - 1), _ .Cells(arrSeries(1, i), cC1_MonthSerBegin_Col).Offset(0, iOffset2 - 1)).Address Else serNew.Values = "=" & wsC1.Name & "!" & .Cells(arrSeries(1, i), cC1_YearSerBegin_Col).Address End If Next End With
With chtTemp
.Refresh .ClearToMatchStyle .ChartStyle = 232
For i = 1 To .FullSeriesCollection.Count With .FullSeriesCollection(i)
If i = 1 Then If wsD1.Shapes("swLines").DrawingObject.Value = xlOn Then AxisGroup1ChartType = xlLine AxisGroup2ChartType = xlColumnClustered Else AxisGroup1ChartType = xlColumnClustered AxisGroup2ChartType = xlLine End If End If
If arrSeries(2, i) = 1 Then .AxisGroup = 1 .ChartType = AxisGroup1ChartType Else .AxisGroup = 2 .ChartType = AxisGroup2ChartType End If
If .ChartType = xlLine Then .Smooth = True End If
End With Next
If wsD1.Shapes("swLines").DrawingObject.Value = xlOff Then .ChartGroups(1).Overlap = -10
.SetElement (msoElementLegendRight)
End With
ActiveSheet.Range("B1").Select End Sub
[/vba]
Добрый день, коллеги! Столкнулся с одной неприятностью при программной работе с диаграммами (Excel 2013). Я динамически формирую ряды и вывожу их на диаграмму. И всё просто замечательно, пока я не начинаю выводить ряды, которые должны отображаться на альтернативной шкале (то есть на графике 2 шкалы и часть рядов выводятся, базируясь на левой, часть - на правой). При каждом изменении настроек я полностью удаляю все ряды и наполняю диаграмму ими заново. Так вот для двойной шкалы на 2-3 раз диаграмма ломается. Вначале она перестаёт отображать ряды и выводит неправильную легенду, потом и вовсе чистый лист без легенды, но её можно починить, если войти в диалог Выбрать данные... и просто нажать OK. После этого диаграмма отрисовывается нормально, то есть ряды задаются абсолютно корректно. Код выкладываю, но к сожалению, он довольно запутанный, так как обрабатывает массу чек-боксов и радио-переключателей... в общем обращайте больше внимания на то, что я делаю с объектами диаграммы. Если кто-то сможет подсказать куды копать и где я могу быть неправым, то буду крайне благодарен. [vba]
Код
Public Sub RepaintD1()
'On Error Resume Next
Dim serNew As Series Dim i As Integer, r As Integer, iOffset1 As Integer, iOffset2 As Integer Dim arrSeries() As Integer Dim iFirstScale As Integer, iSecondScale As Integer, iScale As Integer Dim iCount As Integer, AxisGroup1ChartType, AxisGroup2ChartType Dim chtTemp As Chart
RefreshSheetVars
ReDim Preserve arrSeries(2, cConstr3_End_Row - cConstr3_Start_Row) For r = cConstr3_Start_Row To cConstr3_End_Row If wsC1.Cells(r, cConstr3_MainStatus_Col) = 1 Then
iScale = wsC1.Cells(r, cConstr3_Scale_Col)
If iFirstScale = 0 Or iFirstScale = iScale Then iFirstScale = iScale iCount = iCount + 1 arrSeries(1, iCount) = r arrSeries(2, iCount) = 1 ElseIf iSecondScale = 0 Or iSecondScale = iScale Then iSecondScale = iScale iCount = iCount + 1 arrSeries(1, iCount) = r arrSeries(2, iCount) = 2 Else MsgBox "Поскольку на диаграмме одновременно может быть только 2 разных шкалы, " & vbCr & _ "то график '" & wsC1.Cells(r, cC1_Header_Col) & "' не будет построен. " & vbCr & _ "Удалите прежде какой-нибудь показатель, чтобы освободить шкалу.", vbExclamation End If
End If Next
ActiveSheet.ChartObjects(cD1).Activate With ActiveChart Do While .FullSeriesCollection.Count > 0 .FullSeriesCollection(1).Delete Loop End With
If iCount = 0 Then Exit Sub
ReDim Preserve arrSeries(2, iCount)
Set chtTemp = ActiveSheet.ChartObjects(cD1).Chart 'chtTemp.Activate
With wsC1 iOffset1 = .Range(cC1_MonthStart) iOffset2 = .Range(cC1_MonthFinish) For i = LBound(arrSeries, 2) To UBound(arrSeries, 2) Set serNew = chtTemp.SeriesCollection.NewSeries serNew.Name = "=" & .Name & "!" & .Cells(arrSeries(1, i), cC1_Header_Col).Address If wsD1.Shapes("swMonths").DrawingObject.Value = xlOn Then serNew.Values = "=" & wsC1.Name & "!" & _ .Range(.Cells(arrSeries(1, i), cC1_MonthSerBegin_Col).Offset(0, iOffset1 - 1), _ .Cells(arrSeries(1, i), cC1_MonthSerBegin_Col).Offset(0, iOffset2 - 1)).Address Else serNew.Values = "=" & wsC1.Name & "!" & .Cells(arrSeries(1, i), cC1_YearSerBegin_Col).Address End If Next End With
With chtTemp
.Refresh .ClearToMatchStyle .ChartStyle = 232
For i = 1 To .FullSeriesCollection.Count With .FullSeriesCollection(i)
If i = 1 Then If wsD1.Shapes("swLines").DrawingObject.Value = xlOn Then AxisGroup1ChartType = xlLine AxisGroup2ChartType = xlColumnClustered Else AxisGroup1ChartType = xlColumnClustered AxisGroup2ChartType = xlLine End If End If
If arrSeries(2, i) = 1 Then .AxisGroup = 1 .ChartType = AxisGroup1ChartType Else .AxisGroup = 2 .ChartType = AxisGroup2ChartType End If
If .ChartType = xlLine Then .Smooth = True End If
End With Next
If wsD1.Shapes("swLines").DrawingObject.Value = xlOff Then .ChartGroups(1).Overlap = -10