Страницы: 1
RSS
Скрыть/отобразить диаграммы, код работает неправильно при увеличении числа диаграмм
 
всем доброго времени суток
у меня есть 6 диаграмм, диаграмма появляется по очереди, в зависимости от фильтра в ComboBox (ActiveX control).
использую следующий код:

Код
Private Sub ComboBox10_Click()
    If ComboBox10.Value = "NR from Nov-13" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    End If
     If ComboBox10.Value = "NR from Dec-13" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    End If
     If ComboBox10.Value = "NR from Jan-14" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    End If
     If ComboBox10.Value = "NR from Feb-14" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    End If
     If ComboBox10.Value = "NR from Mar-14" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    End If
     If ComboBox10.Value = "NR from Apr-14" Then
        ActiveSheet.ChartObjects("Chart 2").Visible = False
        ActiveSheet.ChartObjects("Chart 3").Visible = False
        ActiveSheet.ChartObjects("Chart 4").Visible = False
        ActiveSheet.ChartObjects("Chart 5").Visible = False
        ActiveSheet.ChartObjects("Chart 6").Visible = False
        ActiveSheet.ChartObjects("Chart 7").Visible = True
    Else
        ActiveSheet.ChartObjects("Chart 2").Visible = True
        ActiveSheet.ChartObjects("Chart 3").Visible = True
        ActiveSheet.ChartObjects("Chart 4").Visible = True
        ActiveSheet.ChartObjects("Chart 5").Visible = True
        ActiveSheet.ChartObjects("Chart 6").Visible = True
        ActiveSheet.ChartObjects("Chart 7").Visible = False
    End If
End Sub
 
код эффективно не работает
название меняется, но диаграммы не меняются
если 2 диаграммы, код работает хорошо, а если много то нет
как оптимизировать данный код?
буду благодарен, если есть какие-то идеи
заранее спасибо
 
Вместо If используйте Select Case
Код
Private Sub ComboBox10_Click()
    With ActiveSheet
        .ChartObjects("Chart 2").Visible = False
        .ChartObjects("Chart 3").Visible = False
        .ChartObjects("Chart 4").Visible = False
        .ChartObjects("Chart 5").Visible = False
        .ChartObjects("Chart 6").Visible = False
        .ChartObjects("Chart 7").Visible = False
        
        Select Case ComboBox10.Value
            Case "NR from Nov-13"
                .ChartObjects("Chart 2").Visible = True
            Case "NR from Dec-13"
                .ChartObjects("Chart 3").Visible = True
            Case "NR from Jan-14"
                .ChartObjects("Chart 4").Visible = True
            Case "NR from Feb-14"
                .ChartObjects("Chart 5").Visible = True
            Case "NR from Mar-14"
                .ChartObjects("Chart 6").Visible = True
            Case "NR NR from Apr-14"
                .ChartObjects("Chart 7").Visible = True
        End Select
    End With
End Sub 
Можно, наверное,  исключить  With/ End With - по умолчанию объекты относятся к активному листу
 
спасибо вам огромное и потраченное драгоценное время
работает хорошо
 
У комбика на листе есть событие ComboBox10_Change? Лучше код на него повесить.
 
можно использовать без With/ End With
повесил на ComboBox10_Change
код работает хорошо, окончательный код:

Код
Private Sub ComboBox10_Change()
    ActiveSheet.ChartObjects("Chart 2").Visible = False
    ActiveSheet.ChartObjects("Chart 3").Visible = False
    ActiveSheet.ChartObjects("Chart 4").Visible = False
    ActiveSheet.ChartObjects("Chart 5").Visible = False
    ActiveSheet.ChartObjects("Chart 6").Visible = False
    ActiveSheet.ChartObjects("Chart 7").Visible = False
         
        Select Case ComboBox10.Value
            Case "NR from Nov-13"
                ActiveSheet.ChartObjects("Chart 2").Visible = True
            Case "NR from Dec-13"
                ActiveSheet.ChartObjects("Chart 3").Visible = True
            Case "NR from Jan-14"
                ActiveSheet.ChartObjects("Chart 4").Visible = True
            Case "NR from Feb-14"
                ActiveSheet.ChartObjects("Chart 5").Visible = True
            Case "NR from Mar-14"
                ActiveSheet.ChartObjects("Chart 6").Visible = True
            Case "NR from Apr-14"
                ActiveSheet.ChartObjects("Chart 7").Visible = True
        End Select
End Sub
 
а почему вы рекомендуете ComboBox10_Change а не  ComboBox10_Click?
 
То, что сделали Вы - неправильно.
With убыстряет код - не проверяется каждый раз принадлежность к чему-либо. Я писал "исключить" в том смысле, что вообще не писать ActiveSheet. И писал "наверное", потому что не уверен, нужно ли убирать.
Click - выделение,  Change - изменение

Кто знает: в данном случае скорость обработки зависит от наличия/отсутствия With ActiveSheet? Проверять лень...
 
хорошо все понял спасибо
 
Можно заменить скрытие каждой сразу на все.
Код
ActiveSheet.ChartObjects.Visible = False 
Если используется ComboBox (ActiveX control), то где он берет данные? Может по той же ВПР вставлять имя диаграммы в ячейку и сразу без переборов ее отображать.
Как то так
Код
strCh$ = range("c10").value
ActiveSheet.ChartObjects(strCh).Visible = True
или в коде переписывать и там обрабатывать
arrD = Array("Nov - 13", "Dec - 13", "Jan - 14")
strCh = "Chart " & WorksheetFunction.Match(Trim(Right(ComboBox10.Value, 8)), arrD, 0)+1
ActiveSheet.ChartObjects(strCh).Visible = True
 
Цитата
Igor67 пишет: Можно заменить скрытие каждой сразу на все.
хорошая идея, спасибо
второго кода, пока не очень понимаю, думаю мне надо разбираться, затем можно попробовать
изменил вариант vikttur

еще раз всем спасибо за потраченное драгоценное время и идеи
Изменено: hk1209 - 11.07.2014 21:58:23
 
лучше названия диаграмм сделать с данными одинаковыми, в таком случае код сократится до минимального
Код
sub t ()
'это если другие диаграммы на листе не используются
ActiveSheet.ChartObjects.Visible = false
ActiveSheet.ChartObjects(ComboBox10.Value).Visible = True
end sub
sub t2()
'если есть другие диаграммы
ActiveSheet.ChartObjects(ComboBox10.Value).Visible = True
ActiveSheet.ChartObjects(ComboBox10.tag).Visible = false
ComboBox10.tag=ComboBox10.Value
end sub
Страницы: 1
Наверх