Страницы: 1
RSS
Поле со списком на собственной панели управления
 
Вот файлик, ессно очень упрощенный. В нем на листе "Данные" в зависимости от параметра в ячейке В1 и В2 строятся графики по Москве или СПб (в реальности их много больше) по двум разным телеканалам (опять же в реале их чуть больше).  
 
Проблема в том, что лист "Данные" пользователю не должен быть виден. Т.е. элементы управления надо выносить на листы с графиками. Ставить элементы управления прямо в графики не хочу - в 2003 и 2007 постоянно глюки идут из-за этого. В итоге вопрос:  
как создать на панели управления собственную панель, на которой будут разные кнопки, переключающие вид (это-то как раз несложно и я сделал), а также 2 зависимых (!) поля со списками - в первом "Условие 1", во втором - "Условие 2". Причем зависимые (при выборе в первом поле СТС во втором доступны Москва и СПб, а при выборе ДТВ - только Москва).  
 
Можете посоветовать что-нибудь? К сожалению в интернете не нашел нормальных мануалов по созданию подобных списков с примерами...
 
Пищите по форуму - динамические графики.
 
Юрий... Все графики динамические. Вопрос не в этом, а управлении этими графиками через кнопки на панели управления.
 
Диапазоны имеют имя. Так? Значит тем или иным способом выбираем имя, и по нему строится/отображается график. Я потому и дал наводку для поиска - там подобные решения были.
 
Юрий, да все я понимаю - и что такое именнованный диапазон, и как с ним работать...  
 
Мне нужен конкретный инструмент для переключения этого диапазона (!) на листе диаграммы. Желательно, вынесенный на панель управления и одинаковый для всех листов
 
Вот для начала пример Vikttur с "переключателем". Правда, на листе. В качестве такого переключателя можно использовать, например, ComboBox. Или мы о разном? :-)
 
К сожалению о разном - такой сделать несложно. Собственно я и делал. но если эту диаграмму разместить на отдельном листе - как менять? Хочется пример макроса, который (на манер PLEX) создаст на панели управления подобный же список. Именно на панели управления, потому как на листе диаграммы ячеек нет, да и элементы форм привязываются к листу - а тут надо к нескольким листам
 
Понятно. Как вариант, могу предложить использовать UserForm. Она может отображаться и на листе диаграмм. А уже на ней контрол.
 
Добавлять кнопки и строить панель умею - несколько собственных надстроек есть и на моем счету. Правда там были исключительно кнопки.  
 
Вычитал в интернете про CommandBarComboBox (Сложно организованные меню, такие как поле ввода, раскрывающийся список или поле со списком). А вот нормальных примеров работы с ним не нашел...  
 
Пока что, похоже, придется установится на упомянутом Юрием варианте с юзерформой... Главный минус - она будет вызываться, а не отображаться постоянно...
 
{quote}{login=The_Prist}{date=25.11.2010 09:55}{thema=}{post}Т.е. Вы не удосижились проверить тот код, который я выложил? Или там не ComboBox? Или вопрос не  в этом? Может тогда стоит вопрос нормально сформулировать?{/post}{/quote}  
Приношу свои извинения - сперва неправильно вставил код. Все получилось, спасибо. Теперь разбираюсь как в additem прописать диапазоны. Еще раз спасибо за помощь
 
{quote}{login=The_Prist}{date=25.11.2010 10:04}{thema=}{post}Да. Изменения в Вып.списке на панели придется отслеживать через классы. Что, в общем-то совсем не сложно.{/post}{/quote}  
Не могли бы вы дать пример такого отслеживания? В частности при изменении количества элементов - есть список из 10 или 7 показателей. При включенном флажке (допустим) - 10, при выключенном - 7
 
Возможен ли такой черновой вариант:  
 
Private Sub ComboBox1_Change()  
With ComboBox1  
   .AddItem "СТС"  
   .AddItem "ДТВ"  
End With  
End Sub  
 
Private Sub ComboBox2_DropButtonClick()  
Array_СТС(1) = "Москва"  
Array_СТС(2) = "СПб"  
Array_СТС(3) = "Усть Илимск"  
Array_ДТВ(1) = "Москва"  
Array_ДТВ(2) = "Калининград"  
 
If ComboBox1.Value = "ДТВ" Then  
   ComboBox2.List() = Array_ДТВ  
ElseIf ComboBox1.Value = "СТС." Then  
   ComboBox2.List() = Array_СТС  
End If  
End Sub
 
{quote}{login=The_Prist}{date=25.11.2010 10:04}{thema=}{post}Да. Изменения в Вып.списке на панели придется отслеживать через классы.{/post}{/quote}  
 
Про какую панель речь?  
Если про панель инструментов, то почему обязательно использовать классы?  
 
Можно обойтись и без этого - OnAction и простейший макрос:  
 
Sub ComboChanged()    ' срабатывает при изменении значения в комбобоксе или текстбоксе  
   On Error Resume Next  
   НазваниеКомбобокса = Application.CommandBars.ActionControl.Tag  
   ТекстКомбобокса = Application.CommandBars.ActionControl.Text  
   MsgBox "Новое значение: """ & ТекстКомбобокса & """", _  
          vbInformation, "Изменения в поле\списке """ & НазваниеКомбобокса & """"  
End Sub  
 
 
Пример - здесь: http://excelvba.ru/tools/CommandBar
 
The_Prist, гранмерси, Ваш совет оказался панацеей )  
 
Итак, вот такой черновой вариант вышел в конце-концов:  
Модуль:  
 
Public oCbx As New Class1    
Sub Create_Menu_DropDown()  
Dim oCombo  
Application.CommandBars("Моя панель").Delete  
With Application.CommandBars.Add  
.Visible = True: .Name = "Моя панель": .Position = msoBarTop  
Set oCombo1 = .Controls.Add(3)  
Set oCbx.oMyCmbx1 = oCombo1  
With oCombo1  
.AddItem Range("A1")  
.AddItem Range("A2")  
.ListIndex = 1    
End With  
Set oCombo2 = .Controls.Add(3)  
Set oCbx.oMyCmbx2 = oCombo2  
With oCombo2  
.AddItem Range("B1")  
.AddItem Range("B2")  
.ListIndex = 1    
End With  
End With  
Range("C1") = oCombo1.Text & " " & oCombo2.Text  
Range("d1") = oCombo2.Text  
End Sub  
 
 
Модуль класса:  
Public WithEvents oMyCmbx1 As CommandBarComboBox  
Public WithEvents oMyCmbx2 As CommandBarComboBox  
Public i1 As Integer  
Public i2 As Integer  
Private Sub oMyCmbx2_Change(ByVal Ctrl As Office.CommandBarComboBox)  
i1 = 1  
Range("C1") = oMyCmbx1.Text & " " & oMyCmbx2.Text  
With oMyCmbx1  
i2 = .ListIndex  
While .ListCount > 0  
.RemoveItem 1  
Wend  
While Cells(i1, 1) <> 0  
.AddItem Cells(i1, 1)  
i1 = i1 + 1  
Wend  
 
If .ListCount >= i2 Then  
.ListIndex = i2  
Else  
.ListIndex = 1  
End If  
End With  
End Sub  
Private Sub oMyCmbx1_Change(ByVal Ctrl As Office.CommandBarComboBox)  
Range("C1") = oMyCmbx1.Text & " " & oMyCmbx2.Text  
End Sub  
 
 
 
 
В столбце "А" - имена, в столбце "В" - фамилии. В ячейку "С1" выводится имя+фамилия. Как только меняется значение в списке "Фамилия" список "Имя" автоматически обновляется.  
 
 
Еще раз огромное спасибо!
 
{quote}{login=avbel}{date=25.11.2010 09:52}{thema=}{post}... Главный минус - она будет вызываться, а не отображаться постоянно...{/post}{/quote}  
Почему? Вот вариант.
 
Юрий, спасибо за совет ) Когда-нибудь обязательно использую, но сейчас мне будет удобнее работать с вариантом, который предложил The_Prist
 
Конечно. Я только про скрытие/отображение/вызов :-)
Страницы: 1
Читают тему
Наверх