Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Формы в эксель / 15 сообщений из 15, страница 1 из 1
03.09.2007, 13:10:29
    #34771464
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Хочется создать форму в которой будет несколько выпадающих списков (справочников) работать должна по принципу Условие1 => Условие2 => Условие3

Например Область => Города в этой области => Улицы в этом городе

Помогите кто может очень надо
...
Рейтинг: 0 / 0
04.09.2007, 12:27:42
    #34774045
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
encyХочется создать форму
так создавай...
1. открой книгу и зайди в редактор VBA (нажатием Alt+F11)
2. в меню "Insert" выбери "UserForm"
3. нажми "F4" увидишь список различных свойст созданной формы. (можешь поиграться ими например поменять имя или размер) если форма перевая то её имя будет - UserForm1
4. не забудь сохранить книгу.

encyв которой будет несколько выпадающих списков
при создании формы обычно открывается панель под названием "ToolBox"
найди на ней "ComboBox" (твой выпадающий или раскрывающийся список) кликни на него, а потом кликни на форму в том месте где хочешь увидеть свой ComboBox.

ency(справочников) работать должна по принципу Условие1 => Условие2 => Условие3

Например Область => Города в этой области => Улицы в этом городе

Помогите кто может очень надо
ну здесь двумя словами не опишешь, но для начало уясни следующее.
1. списки (или данные) к "элементам управления" (в твоем случае это ComboBox) можно подключать сразу, за это отвечает определенное свойство, для ComboBox это RowSource.
Попробуй прописать туда "A1:A10"
2. но чаще всего их заполняют динамически, т.е. при каком-то событии, например при появлении формы на экране.
нажми двойным кликом на свою форму, тебя выбросит в лист, скопируй туда этот код
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub UserForm_Activate()
    Me.ComboBox1.RowSource = ""
    Me.ComboBox1.AddItem "1"
    Me.ComboBox1.AddItem "2"
    Me.ComboBox1.AddItem "3"
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A1")
End Sub
запусти форму, для этого в меню "Run" выбери "Run Sub/UserForm" и посмотри результат.


На первый раз достаточно.
...
Рейтинг: 0 / 0
05.09.2007, 16:05:26
    #34778313
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
сделал получился соответсвенно список со значениями 1 2 3
...
Рейтинг: 0 / 0
05.09.2007, 16:09:25
    #34778329
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
и еще в самом низу "заполнение таблицы" ?
...
Рейтинг: 0 / 0
05.09.2007, 17:09:34
    #34778648
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
encyи еще в самом низу "заполнение таблицы" ?

будьте внимательней

Код: plaintext
1.
2.
3.
4.
    Me.ComboBox1.RowSource = "" 
    Me.ComboBox1.AddItem "1" 'добавление в comboBox цифры 1 
    Me.ComboBox1.AddItem "2" 'добавление в comboBox цифры 2 
    Me.ComboBox1.AddItem "3" 'добавление в comboBox цифры 3 
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A1") 'добавление в comboBox того что находится по адресу "ThisWorkbook.Worksheets(1).Range("A1")" 
т.е.
ThisWorkbook - эта книга
Worksheets(1) - первый лист в этой книге
Range("A1") - ячейка "А1" первого листа этой книги
Нет ли случайком у вас там текста "заполнение таблицы" ?

Для того чтоб продолжить, нужно знать где находятся данные с
"Условие1 => Условие2 => Условие3" (Область => Города в этой области => Улицы в этом городе)

предположим что данные по условию1 находятся на Worksheets(1) в ячейках "A1:A10",
тогда при загрузке заполним их в ComboBox1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub UserForm_Activate()
    Me.ComboBox1.RowSource = ""
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A1")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A2")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A3")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A4")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A5")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A6")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A7")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A8")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A9")
    Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A10")
End Sub
или
Код: plaintext
1.
2.
3.
4.
5.
Private Sub UserForm_Activate()
    Me.ComboBox1.RowSource = ""
    For i =  1  To  10 
        Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A" & i)
    Next
End Sub
а второй ComboBox2 будем заполнять когда user выберет что-то в Combobox1
для этого скопируйте этот код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Private Sub ComboBox1_Click()
    ComboBox2.ControlSource = ""
    ComboBox2.Clear
    ComboBox2.AddItem "проба"
    ComboBox2.AddItem "тест"
    ComboBox2.AddItem ThisWorkbook.Worksheets( 1 ).Range("B1")
    ComboBox2.AddItem ThisWorkbook.Worksheets( 1 ).Range("B2")
End Sub
...
Рейтинг: 0 / 0
05.09.2007, 18:11:00
    #34778937
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
да там есть такой текст :)

сделал как сказано

разультат форма на ней два комбобокса выбираем значение в первом появляются значения во втором
...
Рейтинг: 0 / 0
06.09.2007, 09:52:10
    #34779886
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Так структура таблицы какая? (ну я имею ввиду Условие1 => Условие2 => Условие3).
Одна ли таблица?
Или несколько на разных листах?
Ну допустим что на первом листе есть таблица вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
область	Город	             Улица
Моск.О.	Москва         	Абакумова егора ул.
Моск.О.	Москва         	Абельмановская ул.
Моск.О.	Москва         	Абрамцевская просека
Моск.О.	Москва         	Абрамцевская ул.
Моск.О.	Москва         	Абрикосовый пер.
Моск.О.	Москва         	Авангардная ул.
Моск.О.	Москва         	Авиаконструктора микояна ул.
Моск.О.	Москва         	Авиамоторная ул.
Моск.О.	Москва         	Авиаторов ул.
Моск.О.	Москва         	Авиационная ул.
Моск.О.	Москва         	Авиационный пер.
Моск.О.	Москва         	Автозаводская ул.
Моск.О.	Москва         	Автозаводский 1-й пр.
Моск.О.	Москва         	Автомобильный пр.
Моск.О.	Москва         	Автомоторная ул.
Моск.О.	Москва         	Адиля саляма ул.
Моск.О.	Москва         	Азовская ул.
Моск.О.	Москва         	Айвазовского ул.
Моск.О.	Москва         	Академическая б ул.
Моск.О.	Москва         	Алабяна ул.
Моск.О.	Москва         	Александровка н.п.
Моск.О.	Москва         	Алексеева петра 1-й пер.
Моск.О.	Балашиха       	Алексеева петра 2-й пер.
Моск.О.	Балашиха       	Алексеева петра ул.
Моск.О.	Балашиха       	Алексинская ул.
Моск.О.	Балашиха       	Алма-атинская ул.
Моск.О.	Балашиха       	Алтайская ул.
Моск.О.	Балашиха       	Алтуфьевское шоссе
Моск.О.	Балашиха       	Алымов пер.
Моск.О.	Балашиха       	Алябьева ул.
Моск.О.	Балашиха       	Амбулаторный 1-й пр.
Моск.О.	Балашиха       	Амбулаторный 2-й пр.
Моск.О.	Балашиха       	Аминьевское шоссе
Моск.О.	Балашиха       	Амундсена ул.
Моск.О.	Балашиха       	Амурская ул.
Моск.О.	Балашиха       	Анадырский пр.
Моск.О.	Балашиха       	Ананьевский пер.
Моск.О.	Балашиха       	Ангарская ул.
Моск.О.	Вешки, д.      	Ангелов пер.
Моск.О.	Долгопрудный   	Андреева павла ул.
Моск.О.	Железнодорож	Андреево-забелинская ул.
Моск.О.	Зеленоград     	Андроновское шоссе
Моск.О.	Ларино, пос    	Андроньевская б ул.
Моск.О.	Лобня          	Андроньевская б. ул.
Моск.О.	Люберецы       	Андроньевская м ул.
Моск.О.	Мытищи         	Андроньевская пл.
Моск.О.	Одинцово       	Андроньевский пр.
Моск.О.	Пушкино        	Аносова ул.
Моск.О.	Солнечногорск  	Анохина академика ул.
Моск.О.	Химки          	Антонова генерала ул.
Ворон-я	Воронеж        	Антонова-овсеенко ул.
Ворон-я	Воронеж        	Аптекарский пер.
Ворон-я	Воронеж        	Арбат нов ул.
Ворон-я	Воронеж        	Арбат ул.
Ворон-я	Воронеж        	Арбатская пл.
Ворон-я	Воронеж        	Арбатские ворота пл.
Ворон-я	Воронеж        	Арбатский пер.
Ворон-я	Воронеж        	Аргуновская ул.

и начинается она с ячейки А1, и отсортирована сначала по первому столбцу затем по второму.

тогда для заполнения первого Combo используем код

Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub UserForm_Activate()
    For i =  2  To ThisWorkbook.Worksheets( 1 ).Range("A65536").End(xlUp).Row
        If ThisWorkbook.Worksheets( 1 ).Range("A" & i) <> _
            ThisWorkbook.Worksheets( 1 ).Range("A" & i -  1 ) Then _
            Me.ComboBox1.AddItem ThisWorkbook.Worksheets( 1 ).Range("A" & i)
    Next
End Sub
для заполнения второго
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub ComboBox1_Click()
    ComboBox2.Clear
    For i =  2  To ThisWorkbook.Worksheets( 1 ).Range("A65536").End(xlUp).Row
        If ThisWorkbook.Worksheets( 1 ).Range("A" & i) = ComboBox1.Text And _
            ThisWorkbook.Worksheets( 1 ).Range("B" & i) <> _
                ThisWorkbook.Worksheets( 1 ).Range("B" & i -  1 ) Then _
            Me.ComboBox2.AddItem ThisWorkbook.Worksheets( 1 ).Range("B" & i)
    Next
    ComboBox3.Clear
End Sub
и для заполнения третьего
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub ComboBox2_Click()
    ComboBox3.Clear
    For i =  2  To ThisWorkbook.Worksheets( 1 ).Range("A65536").End(xlUp).Row
        If ThisWorkbook.Worksheets( 1 ).Range("B" & i) = ComboBox2.Text And _
            ThisWorkbook.Worksheets( 1 ).Range("C" & i) <> _
                ThisWorkbook.Worksheets( 1 ).Range("C" & i -  1 ) Then _
            Me.ComboBox3.AddItem ThisWorkbook.Worksheets( 1 ).Range("C" & i)
    Next
End Sub
а при выборе в третьем выведем сообщение
Код: plaintext
1.
2.
Private Sub ComboBox3_Click()
    MsgBox ComboBox1 & Chr( 13 ) & ComboBox2 & Chr( 13 ) & ComboBox3
End Sub
...
Рейтинг: 0 / 0
06.09.2007, 13:49:12
    #34781158
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Работает, но мне такую таблицу надо создать с помощью этой формы т.е. организовать списки областей улиц городов форма будет читать эти списки и заполнять ячейки.
...
Рейтинг: 0 / 0
06.09.2007, 14:32:03
    #34781459
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Повесте на форму ещё кнопку (её название д.б. "обработка")
и скопируйте код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
Private Sub обработка_Click()
    If ComboBox1 = "" Then
        MsgBox "Запоните область", vbCritical, "Проверка"
        ComboBox1.SetFocus
        Exit Sub
    End If
    If ComboBox2 = "" Then
        MsgBox "Запоните город", vbCritical, "Проверка"
        ComboBox2.SetFocus
        Exit Sub
    End If
    If ComboBox3 = "" Then
        MsgBox "Запоните улицу", vbCritical, "Проверка"
        ComboBox3.SetFocus
        Exit Sub
    End If
    For i =  2  To ThisWorkbook.Worksheets( 1 ).Range("A65536").End(xlUp).Row
        If LCase(ThisWorkbook.Worksheets( 1 ).Range("C" & i)) = LCase(ComboBox3) And _
            LCase(ThisWorkbook.Worksheets( 1 ).Range("B" & i)) = LCase(ComboBox2) And _
            LCase(ThisWorkbook.Worksheets( 1 ).Range("A" & i)) = LCase(ComboBox1) Then
            MsgBox "Запись:" & ComboBox1 & Chr( 13 ) & ComboBox2 & Chr( 13 ) & ComboBox3 & _
                "уже существует", vbCritical, "Проверка"
            Exit Sub
        End If
    Next
    i = ThisWorkbook.Worksheets( 1 ).Range("A65536").End(xlUp).Row +  1 
    ThisWorkbook.Worksheets( 1 ).Range("A" & i) = ComboBox1
    ThisWorkbook.Worksheets( 1 ).Range("B" & i) = ComboBox2
    ThisWorkbook.Worksheets( 1 ).Range("C" & i) = ComboBox3
    ThisWorkbook.Worksheets( 1 ).Range("A1").CurrentRegion.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:= 1 , MatchCase:= _
        False, Orientation:=xlTopToBottom
    Unload Me
End Sub
P.S. Надеюсь Вы чему-нибудь научились.
...
Рейтинг: 0 / 0
06.09.2007, 16:42:57
    #34782105
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Да научился... а что помощи больше не будет?
...
Рейтинг: 0 / 0
06.09.2007, 17:35:50
    #34782331
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
encyДа научился... а что помощи больше не будет?
Помощи? Ну, если это теперь так называется, то спрашивайте..

Только сначала выложите то, что у вас получилось. Очень хочется посмотреть. Прикрепите книгу.
...
Рейтинг: 0 / 0
06.09.2007, 18:10:19
    #34782464
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
вот что вышло
...
Рейтинг: 0 / 0
07.09.2007, 09:51:53
    #34783318
vkodor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
ency
Код: plaintext
1.
2.
3.
Область	Города в Московской области	Города в Тверской области
Московская		
Тверская		
Нижегородская		

С такими списками трудней работать, не рекомендую, но если очень хочется то можно попробывать, но только эти списки д.б. на разных листах.
Вот код для заполнения
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
Private Sub UserForm_Activate()
    With ThisWorkbook.Worksheets("Области")
        For i =  2  To Range("A65536").End(xlUp).Row
            If .Range("A" & i) <> _
                .Range("A" & i -  1 ) Then _
                Me.ComboBox1.AddItem .Range("A" & i)
        Next
    End With
End Sub
Private Sub ComboBox1_Click()
    ComboBox2.Clear
    With ThisWorkbook.Worksheets("Города")
        For i =  1  To .Range("IV1").End(xlToLeft).Column
            If .Cells( 1 , i) = ComboBox1.Text Then
                For r =  2  To .Cells( 65536 , i).End(xlUp).Row
                    Me.ComboBox2.AddItem .Cells(r, i)
                Next
                Exit For
            End If
        Next
    End With
    ComboBox3.Clear
End Sub
Private Sub ComboBox2_Click()
    ComboBox3.Clear
    With ThisWorkbook.Worksheets("Улицы")
        For i =  1  To .Range("IV1").End(xlToLeft).Column
            If .Cells( 1 , i) = ComboBox2.Text Then
                For r =  2  To .Cells( 65536 , i).End(xlUp).Row
                    Me.ComboBox3.AddItem .Cells(r, i)
                Next
                Exit For
            End If
        Next
    End With
End Sub
а алгоритм вставки("обработка") попробуйте придумать сами.
...
Рейтинг: 0 / 0
07.09.2007, 17:21:35
    #34785267
ency
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
Все спасибо разобрался :) тут нашел еще похожую тему так что все ок
...
Рейтинг: 0 / 0
12.09.2007, 14:26:36
    #34794496
Кико
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формы в эксель
В первом примере разобралься но во вторм (Form2.xls) не понял на что указывает (Range("IV1")) в строке - For i = 1 To .Range("IV1").End(xlToLeft).Column
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Формы в эксель / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]