Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Нюансы работы с Chart при использовании 2-х шкал - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Нюансы работы с Chart при использовании 2-х шкал (Макросы/Sub)
Нюансы работы с Chart при использовании 2-х шкал
dsb75 Дата: Воскресенье, 07.06.2015, 10:04 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 17
Репутация: 0 ±
Замечаний: 0% ±

Excel 2013
Добрый день, коллеги!
Столкнулся с одной неприятностью при программной работе с диаграммами (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
      
     .SetElement (msoElementLegendRight)
    
   End With
    
   ActiveSheet.Range("B1").Select
End Sub
[/vba]

Автор - dsb75
Дата добавления - 07.06.2015 в 10:04
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Нюансы работы с Chart при использовании 2-х шкал (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!