Выпадающий список с добавлением новых элементов

Категория: Выпадающие списки, просмотров: 45422, опубликовано: 27.05.2007
Скачать пример

Итак, имеем следующую ситуацию:

 

Задача: сделать в ячейке D2 выпадающий список, чтобы пользователь мог выбирать имена из списка (столбец А). Если нужного имени нет в списке, то пользователь может ввести новое имя прямо в ячейку D2 - оно автоматически добавится к столбцу А и начнет отображаться в выпадающем списке в будущем.

Шаг 1. Создаем именованный диапазон

Сначала создадим именованный диапазон, указывающий на заполненные именами ячейки в столбце А - сколько бы имен в списке не находилось. Для этого идем в меню Вставка - Имя - Присвоить (Insert - Name - Define), вводим имя диапазона (допустим People) и в строку Ссылка (Reference) вводим следующую формулу:

=СМЕЩ(Лист1!$A$1;0;0;СЧЁТЗ(Лист1!$A$1:$A$24);1)

в английской версии Excel это будет:

=OFFSET(Лист1!$A$1,0,0,COUNTA(Лист1!$A$1:$A$24),1)

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

Шаг 2. Создаем выпадающий список в ячейке

Выделяем ячейку D2 и открываем меню Данные - Проверка (Data - Validation). Далее выбираем из выпадающего списка Тип (Allow) позицию Список (List) и вводим в строку Источник (Source) ссылку на созданный на шаге 1 именованный диапазон:

 

Чтобы Excel позволил нам в будущем ввести в список и новые имена, снимем галочки на вкладках Сообщение для ввода (Input Message) и Сообщение об ошибке (Error Alert) и нажмем ОК. Теперь у нас есть выпадающий список в ячейке D2. Причем, если, например, вручную дописать новое имя в столбце А, то оно автоматически появится в выпадающем списке в ячейке D2, поскольку имена берутся из динамического диапазона People, который автоматически отслеживает изменения в столбце А.

Шаг 3. Добавляем простой макрос

Щелкаем правой кнопкой мыши по ярлычку нашего листа и выбираем Исходный текст (View Source). Откроется редактор Visual Basic, куда надо скопировать такой код:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

    If Target.Cells.Count > 1 Then Exit Sub
    If Target.Address = "$D$2" Then
     If IsEmpty(Target) Then Exit Sub
       If WorksheetFunction.CountIf(Range("People"), Target) = 0 Then
          lReply = MsgBox("Добавить введенное имя " & _
                         Target & " в выпадающий список?", vbYesNo + vbQuestion)
          If lReply = vbYes Then
              Range("People").Cells(Range("People").Rows.Count + 1, 1) = Target
          End If
       End If
     End If
End Sub

Если Ваш выпадающий список находится не в ячейке D2 или Вы назвали диапазон с именами не People, а как-то еще, то подправьте эти параметры в макросе на свои.

Всё! Теперь при попытке ввести новое имя в ячейку D2 Excel будет спрашивать

... и при утвердительном ответе пользователя автоматически добавлять новое имя к списку в столбце А и в выпадающий список в ячейку D2.

Ссылки по теме

Комментарии:

Валерий
29.07.2007
Очень все просто, доходчиво, красиво
оформлено!!! И очень полезно!
Спасибо за сайт!!
(начинающий...)
если можно подскажите:
необходимо строку с данными в ячейках
скопировать и вставить на др. лист2.
Далее, через опред. время я изменил
на первоначальном листе данные -
необходимо снова скопировать строку с
измененными данными и вставить на лист2, но уже на строку ниже, чтобы не затирать первоначальную строку и т.д.... Можно с помощью кнопки и макроса....
Александр
07.09.2007
Сортировать бы еще список по алфавиту после каждого добавления..
Алексей
24.09.2007
Здравствуйте!
Очень полезный ресурс вы создали. Очень много интересного и нового.

Ну вот и у меня возник вопрос, причем достаточно срочный, спасайте: в данном примере (описаном выше) в качестве ячейки для выбора/ввода нового значения - указана одна ячейка. Как сделать так, чтобы при вводе данных в диапазон, к примеру, D2:D10, в любую из этих ячеек, происходила проверка и добавление в список. Прописать в стоорке If Target/Adress= и так далее 10 раз, можно через or, но мне нужен диапазон в 4000 строк :-). Помогите пожалуйста!!!
.
Алексей
25.09.2007
Это опять я. Спасайте!!! Пожалуйста!!!.
Евгений
30.09.2007
Нет слов от восторга и восхищения, красиво !!! Сколько возможностей открылось , супер,
Если можно, подскажите, пожалуйста, в объединенную ячейку вставляется по формуле текст из другой ячейки, как сделать , чтобы конечная ячейка "растягивалась" и "сужалась" по высоте в зависимости от длины текста.
Максим
03.10.2007
Очень нужная штуковина, спасибо! Подскажите всетаки как задать диапазон а не одну ячейку для этого макроса, т.е. то о чем говорит Алексей =).
Pavel
03.10.2007
а так же скажите, как удалять не нужные имена из списка.
Роман
10.10.2007
Офигеть!!! Даже я всё понял. Круто!!!.
tanka
09.11.2007
Как сделать так, чтобы при вводе данных в диапазон, в любую из ячеек, происходила проверка и добавление в список? Заменить строку: If Target.Address = "$D$2" Then на "If Target.Column = 4 Then", где 4 - порядковый номер столбца, D в данном случае. Ну и, ес-но, выпадающий список (шаг 2) создаем не только в ячейке D2, а во всем столбце D.
Cumbal
09.11.2007
2tanka спасибо большое!.
Наталья
15.11.2007
Супер сайт.
В этом примере небольшая ошибка, в английской версии формулы стоят запятые, а нужны точки с запятой. Иначе эксель ругается:).
Barracuda
10.12.2007
C одним выпадающим списком все понятно. А как сделать 2 разных списка на одном листе???? Может кто подскажет? Заранее спасибо!.
сан
11.12.2007
Спасибо за помощь,я ищу возможность делать при помощи табл Excel можно делать сметы калькуляции.
Владимир
24.01.2008
Подскажите пожалуста, а как сделать то же самое только наоборот? Поясняю. То есть, чтобы в ячейке D2 была проверка на предмет несовпадения с People, и все несовпадающие значения добавлялись в People. Другими словами, нужно разрешить вносить в D2 только те значения, которых нет в People, при этом эти значения добавляются в People. Заранее спасибо.
Максим
06.02.2008
У меня почему-то все новые добавляемые значения появляются только в одной ячейке (на условиях примера в A11)и затирают предыдущее добавленное значение. Список не расширяется более чем на одно значение. Помогите пожалуйста!.
Сергей
13.02.2008
Поскажите пожалуйста в чем дело: скопированный макрос совершенно не производит никаких действий. Может быть это потому, что именованный диапозон находится на другом листе? Если так, то какие изменения нужно внести в запись макроса?
У меня диапозон и я внес изменения рекомендованные Tanka (выподающий список в столбце).
masha
05.03.2008
а как быть, если добавить новое имя нужно в алфавитном порядке, пыталась написать макрос-не вышло.
таня
08.03.2008
Задача: Список находится на листе1. Выпалающий список нужно создать на листе2. И он должен находится например. в столбце "D" с 2-й по 10-ю стоку. Подскажите как это можно сделать? С созданием "Выпадающего списка с добавлением новых элементов" на одном листе и в ячейке "D2" как в примере все понятно.
.
JR
25.06.2008
Как сделать что бы в выпадающем списке были гиперссылки из именованного диапозона.
вопрошающий
02.07.2008
Задача: Список находится на листе1. Выпалающий список нужно создать на листе2. И он должен находится например. в столбце "D" с 2-й по 10-ю стоку. Подскажите как это можно сделать? С созданием "Выпадающего списка с добавлением новых элементов" на одном листе и в ячейке "D2" как в примере все понятно.
.
костян
24.08.2008
На один лист ввел два макроса:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = "$G$5" Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Range("нумерация_заказов"), Target) = 0 Then
lReply = MsgBox("Внести Заявку №" & Target & " в архив ", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("нумерация_заказов").Cells(Range("нумерация_заказов").Rows.Count + 1, 1) = Target
End If
End If
End If
End Sub

изменил ссылки на ячейку и диапазон:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = "$O$7" Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Range("клиентская_база"), Target) = 0 Then
lReply = MsgBox("Добавить клиента " & Target & " в базу?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("клиентская_база").Cells(Range("клиентская_база").Rows.Count + 1, 1) = Target
End If
End If
End If
End Sub
получаю ошибку(возврат к макросам с выделением:
"Private Sub Worksheet_Change(ByVal Target As Range)"
Как это понимать и что с этим делать?
Направте на путь истинный. Очень надо!!!
.
Дмитрий
02.09.2008
В этом коде ответы практически на все вопросы заданные здесь. Нужно только заменить пораметры на те которые вам нужны.
Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = Target.Address Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Лист3").Range("Мастер"), Target) = 0 Then
lReply = MsgBox("Добавить Мастера " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Лист3").Range("Мастер").Cells(Sheets("Лист3").Range("Мастер").Rows.Count + 1, 1) = Target
End If
End If
End If
End Sub.
Сергей
16.09.2008
Так как все-таки отсортировать новый список по алфавиту после добавления нового элемента?.
Николай Павлов
25.10.2008
Сергей: только с помощью макроса.
Дмитрий
05.11.2008
В первом шаге: "начиная с А1 и вниз до конца - до последнего имени". Как же до конца, если в ссылку вводится СЧЁТЗ(Лист1!$A$1:$A$24) т.е. список может увеличиться не боле чем до 24 элементов. Поэтому и получается, что как уже здесь и писали после 24-х элементов списка все значения будут записываться в A25 и не будут отображаться в выпадающем списке. Как поменять код чтобы просматривались изменения во всём столбце?.
Gambo
25.02.2009
а у меня ничего не получилось((.
Maks
30.07.2009
Чтобы на весь столбец, вместо СЧЁТЗ(Лист1!$A$1:$A$24) написать СЧЁТЗ(Лист1!$A:$A).
karmasoer
07.08.2009
Здравствуйте. У меня при запуске макроса появляется ошибка run-time '1004' и выделяется строка
If WorksheetFunction.CountIf(Range("департаменты"), Target) = 0 Then

Что не так?.
Андрей
07.08.2009
Классная штука!!! А кто мне сможет помочь, мне надо чтоб список лиц находился в другом файле... как это оформить?.
salamon1
08.09.2009
ошибка run-time '1004' .
salamon1
08.09.2009
Как сделать 2 разных списка на одном листе чтобы работало добавление и в первом и во втором ????.
salamon1
08.09.2009
Я так понял ответа на вопрос о двух списках можно не ждать...
Очень нуна....
salamon1
08.09.2009
karmasoer писал:
Здравствуйте. У меня при запуске макроса появляется ошибка run-time '1004' и выделяется строка
If WorksheetFunction.CountIf(Range("департаменты"), Target) = 0 Then

Что не так?.
скорее всего ячейка с выпадающим списком находится на листе1, а сам диапазон из которого берётся список на листе2
нуна использовать приведённый выше код:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = Target.Address Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Лист3").Range("Мастер"), Target) = 0 Then
lReply = MsgBox("Добавить Мастера " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Лист3").Range("Мастер").Cells(Sheets("Лист3").Range("Мастер").Rows.Count + 1, 1) = Target
End If
End If
End If
End Sub.
muravey69
27.10.2009
Привет всем. У меня вообще не появляется никакого окошечка с вопросом.
Есть две страницы (Лист1 и Лист2). На первой странице выпадающий список на весь столбец, а на второй сам список.

Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Column = 2 Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Лист2").Range("Списки"), Target) = 0 Then
lReply = MsgBox("Добавить введенное наименование работ " & _
Target & " в общий список работ?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Лист2").Range("Списки").Cells(Sheets("Лист2").Range("Списки").Rows.Count + 1, 1) = Target
End If
End If
End If
End Sub

Что делаю не так?.
muravey69
28.10.2009
Разобрался - неточность первого поста, ошибку исправил - работает.
Только вот как сортировать по алфавиту автоматически?.
Андрей
18.11.2009
Добавьте в конце макроса следующий код. При вводе нового имени в ячейку D2, будет отсортировано по алфавиту содержимое в столбце A и содержимое выпадающего списка.

ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Add Key:=Range("People"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Лист1").Sort
.SetRange Range("People")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With.
Igor
29.11.2009
ребят, подскажите где в ексель2007 нужно вставлять формулу =OFFSET(Лист1!$A$1,0,0,COUNTA(Лист1!$A$1:$A$24),1)? чет никак немогу найти
.
Шульц
12.12.2009
Андрей - касательно сортировки:
Заменил "Лист1" и "People" на свои, но не работает, выдает ошибку:
Compile error:
Only comments may appear after End Sub, End Function, or End Property.
Куда именно в конец добавлять? После End Sub, или вклинивать куда-то?
Пробовал перед End Sub, тоже самое выдает ошибку в строке -
ActiveWorkbook.Worksheets("Лист1").Sort.SortFields.Clear
и выделяет желтым ("Лист1")
А без сортировки по предыдущему примеру все ок..
Влад
21.12.2009
Андрей, можно ли отсортировать содержимое выпадающего списка без сортировки основного диапазона в столбце А.
Сергей
18.01.2010
Шульц

Код надо вставить в процедуру Private Sub Worksheet_Change(ByVal Target As Range) того листа, где находится таблица с сортируемыми элементами. Тогда всё работает..
Anri
21.01.2010
Если нужно, чтобы проверка и добавление происходили по нескольким столбцам в таблице то:
If Target.Column = "3" Or "4" Or "5" Or "6" Or "7" Or "8" Or "11" Or "12" Or "18" Then
вместо:
If Target.Address = Target.Address Then
.
Алексей
22.01.2010
Большое человеческое спасибо за описание. первой же ссылкой в поисовике перешел на эту страницу и сразу получил ответ. благодарю..
krasser
25.01.2010
Если вставить эти строки кода перед последней строкой(т.е. перед End Sub),то диапазон и список будут отсортированы по возрастанию.

Range("People").Sort Key1:=Range("A1"), _
Order1:=xlAscending, Header:=xlNo
.
Дмитрий
28.01.2010
Здравствуйте!

Где-то видел решение добавления в список (через проверку) двух диапазонов ячеек, теперь єто очень нужно, не не могу вспомнить где и как.
Как их задать в "Источник:"?!.
Кирилл
09.02.2010
Добрый день!
Спасибо за статью!
Подскажите, возможно ли сделать так, чтобы при ответе "Нет", т.е. "не добавлять введённое значение в список", выдавало бы ошибку? В изначальном варианте, даже если ответ "Нет". то введённое значение, которого нет в списке, остаётся. Что по моим условиям недопустимо.
Заранее спасибо!.
Сергей
10.02.2010
Для Кирилла:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = "$D$2" Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Range("People"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Range("People").Cells(Range("People").Rows.Count + 1, 1) = Target
'сортировка по возрастанию
Range("People").Sort Key1:=Range("A1"), _
Order1:=xlAscending, Header:=xlNo
Else
Target = ""
End If
End If
End If
End Sub

Есть рекурсия,но в нашем случае это не смертельно:).
Кирилл
10.02.2010
Сергей, большое спасибо!!!
Теперь всё работает именно так, как мне хотелось бы!
Почитав комменты к статье и определив свои требования к данной возможности, постарался свести всё в единое целое и теперь выношу на ваш суд :)
Для меня важно было реализовать это:
а) для нескольких списков,
б) для нескольких ячеек/диапазонов,
в) с автоматической сортировкой,
г) введённое по ошибке значение, которое мы не хотим добавлять в список, автоматически стирается из ячейки

Итак:
1. Создано два листа. На листе 1 ("Списки") находятся непосредственно 2 списка "Name" ($A$5:$A) и "Surname" ($B$5:$B). На листе 2 ("Выпадающие") в двух столбцах сделаны ячейки с выпадающими списками. Столбец А (начиная с А5) - выпадающие списки "Name", столбец B (начиная с B5) - выпадающие списки "Surname"

2. В качестве диапазона для списка "Name" задана формула =СМЕЩ(Списки!$A$5;0;0;СЧЁТЗ(Списки!$A:$A);1)
В качестве диапазона для "Surname" задана формула =СМЕЩ(Списки!$B$5;0;0;СЧЁТЗ(Списки!$B:$B);1)

3. Код для выпадающих списков на листе "Выпадающие" написан так, что при вводе в ячейку несуществующего значения в списке:
1) Всплывает окно "Добавить введённое имя ... в выпадающий список?"
1.1.) При ответе "Да" введённое значение добавляется в список, список сортируется по алфавиту.
1.2.) При ответе "Нет" всплывает окно "Ошибка ввода". После нажатия "ОК" введённое значение стирается.

Код:
Private Sub Worksheet_Change(ByVal Target As Range)

Dim lReply As Long

If Target.Cells.Count > 1 Then Exit Sub
If Target.Column = 1 And Target.Row > 4 Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Списки").Range("Name"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Списки").Range("Name").Cells(Sheets("Списки").Range("Name").Rows.Count + 0, 1) = Target
Sheets("Списки").Range("Name").Sort Key1:=Sheets("Списки").Range("A5"), _
Order1:=xlAscending, Header:=xlNo
End If
If lReply = vbNo Then
lReply = MsgBox("Ошибка ввода.", vbOKOnly)
If lReply = vbOK Then
Target = ""
End If
End If
End If
End If

If Target.Column = 2 And Target.Row > 4 Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Списки").Range("Surname"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Списки").Range("Surname").Cells(Sheets("Списки").Range("Surname").Rows.Count + 0, 1) = Target
Sheets("Списки").Range("Surname").Sort Key1:=Sheets("Списки").Range("B5"), _
Order1:=xlAscending, Header:=xlNo
End If
If lReply = vbNo Then
lReply = MsgBox("Ошибка ввода.", vbOKOnly)
If lReply = vbOK Then
Target = ""
End If
End If
End If
End If

End Sub

Если есть возможность упростить этот код, сохраняя все функции, то подскажите. Буду признателен =)

P.S.: Сергей, что такое "рекурсия"? :).
Сергей
10.02.2010
Для Кирилла:

Для меня не совсем понятна целесообразность вывода сообщения об
ошибке,но если для Вас это важно,то вот эту часть кода я немного
упростил:

If lReply = vbYes Then
Sheets("Списки").Range("Name").Cells(Sheets("Списки") _
.Range("Name").Rows.Count + 0, 1) = Target
Sheets("Списки").Range("Name").Sort Key1:=Sheets("Списки") _
.Range("A5"), Order1:=xlAscending, Header:=xlNo
Else
MsgBox "Ошибка ввода", vbInformation, "Внимание"
Target = ""
End If

P.S.
Рекурсия - это когда метод или как в нашем случае событие,
вызывают сами себя в процессе работы.Так ,например, строка
кода Target = "" приводит к повторному срабатыванию события
Worksheet_Change .
Зайдите в редактор VBE и через F8 Вы сможете проследить
построчно выполнение кода данной процедуры.
Извините за Офф топ..
Максим
20.02.2010
Добрый день, я хотел бы узнать возможно ли связать несколько таких редактируемых раскрывающихся списка? Например необходимо ввести данные о клиенте: ФИО, адрес, телефон, но так, чтобы их можно было вытащить из базы, вызвав только ФИО, а остальная информация самостоятельно вставлялась бы в остальные ячейки, но при этом чтобы можно было вводить данные о новых клиентах?
Заранее благодарю!.
Yulia
25.02.2010
Добрый день!
просьба помочь в след вопросе - хочу добавить сортировку по алфавиту, но выдает ошибку Run time error '438'
Данные находятся на 2ух закладках: Data (список городов) и Details (выпадающий список)

вот сам макрос:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = Target.Address Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Data").Range("City"), Target) = 0 Then
lReply = MsgBox("Добавить город " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Data").Range("City").Cells(Sheets("Data").Range("City").Rows.Count + 1, 1) = Target
ActiveWorkbook.Worksheets("Data").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Data").Sort.SortFields.Add Key:=Range("City"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Data").Sort
.SetRange Range("City")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End If
End If
End If

End Sub

макрос прописан на закладке Details, где располагается выпадающий список.
в чём может быть ошибка? может надо вставить макрос по сортировке в др. место? оч надеюсь на Вашу помошь!.
Сергей
25.02.2010
Yulia ,см. ответ krasser .
Yulia
26.02.2010
Сергей, то о чём пишет krasser работает только если данные и выпадающий список находятся на одном листе, а у меня данные находятся на разных. Поэтому пытаюсь использовать код, описанный Андреем 18.11.09
ActiveWorkbook.Worksheets("Data").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("Data").Sort.SortFields.Add Key:=Range("City"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Data").Sort
.SetRange Range("City")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
где-то в этом коде и закралась ошибка..
Сергей
26.02.2010
Yulia,адаптируйте следующий код под свои потредности:
"Лист1" - это там ,где именнованый диапазон.
"Лист2" - это там ,где выпадающий список,поэтому и код вставляете сюда

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lReply As Long
If Target.Cells.Count > 1 Then Exit Sub
If Target.Address = "$D$2" Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Worksheets("Лист1").Range("People"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & _
Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
With Worksheets("Лист1")
.Cells(Worksheets("Лист1").Range("People").Rows.Count + 1, 1) = Target
'сортировка по возрастанию
.Range("People").Sort Key1:=.Range("A1"), _
Order1:=xlAscending, Header:=xlNo
End With
Else
Target = ""
End If
End If
End If
End Sub
.
Денис
26.02.2010
Добрый день.
Есть строчка If Target.Address = "$D$2" Then
А как добавить еще ячейки? Мне к примеру нужны еще H2 и т.п.

Заранее спс за ответ..
krasser
27.02.2010
If Target.Address = "$D$2" Or Target.Address = "$H$2" Then.
Yulia
27.02.2010
Сергей, при прописывании след. кода
.Range("City").Sort Key1:=.Range("A1"), _
Order1:=xlAscending, Header:=xlNo
End With
появляется ошибка- Compile error:Invalid or unqualified reference. и ругается он на :=.Range("A1"). макрос вообще перестает работать. Мне же необходимо чтобы и выпадающий список и данные сортировались, а в этом коде есть ссылка только на выпадающий список..
Demon
23.04.2010
Молодцы, что сделали такой хороший сайт, Респект!!! .
Demon
23.04.2010
Все просто и понятно. Только версии разные и паришься в поиске нужной опции.
Марина
27.04.2010
Огромное человеческое спасибо.
giawww
30.05.2010
Подскажите,пожалуйста,как в выппадающем списке(если он очень длиный)сделать так,чтобы при наборе первой буквы список перемещался в сегмент с этой заглавной буквы Email: giawww@yahoo.com. Заранее Спасибо ....очень надо!!!!!!!!!!!!!!!!!!!!..
Мария
19.06.2010
Сайт превосходный!!! Огромный респект автору! Очень помогает этот сайт в работе. спасибо БОЛЬШОЕ!!!!!.
Beleckiy
12.07.2010
Спасибо всем гуру за готовые решения! Мне это очень помогло!

Но меня очень интересует ответ на вопрос, который задал Максим:
>Добрый день, я хотел бы узнать возможно ли связать несколько таких >редактируемых раскрывающихся списка? Например необходимо ввести >данные о клиенте: ФИО, адрес, телефон, но так, чтобы их можно было >вытащить из базы, вызвав только ФИО, а остальная информация >самостоятельно вставлялась бы в остальные ячейки, но при этом чтобы >можно было вводить данные о новых клиентах?

Это было бы супер решение! Просто готовая клиентская база...
Помогите плииииззз. Заранееблагодарен!.
Иван
17.07.2010
Здравствуйте. помогите пожалуйста(
как ввести два одинаковых макроса в одном листе?

повтор вопроса
костян
24.08.2008

Спасибо.
Игнат
22.07.2010
Здравствуйте! я создал список выбора в каждой ячейке одного столбца. поскольку выбор магазинов довольно большой и занимает много времени поиска даже по алфавиту, появился вопрос - как можно в ячейке со списком начать вводить название, чтобы excel автоматически давал варианты заполнения ячейки? буду очччень благодарен..
Павел
10.08.2010
Люди добрые помогите!!!!! Все бы хорошо, ноя в соем Excel 2007 не могу найти путь (Для этого идем в меню Вставка - Имя - Присвоить (Insert - Name - Define), вводим имя диапазона (допустим People) и в строку Ссылка (Reference) вводим следующую формулу:
=СМЕЩ(Лист1!$A$1;0;0;СЧЁТЗ(Лист1!$A$1:$A$24);1)
Если кто справился с этим, помогите плиз)))))

.
Дмитрий
13.08.2010
Максим, и Beleckiy, задали вопросы.
меня тоже интересует такое решение
К кому можно обратиться по данному вопросу?
готов оплатить работу Yandex-деньгами
цитата:
Добрый день, я хотел бы узнать возможно ли связать несколько таких редактируемых раскрывающихся списка? Например необходимо ввести данные о клиенте: ФИО, адрес, телефон, но так, чтобы их можно было вытащить из базы, вызвав только ФИО, а остальная информация самостоятельно вставлялась бы в остальные ячейки?.
Юрий
15.08.2010
Здравствуйте все, кто интересуется EXCEL!!!
У меня, как и у Игната возникла такая же проблемка.... Можно ли сделать так, что бы когда начинаешь вводить слово в выпадающий список что бы в это выпадающем списке показывало подходящие варианты (так, что бы не искать мне его полностью, а только по начальному вводу). Ну а если во время введения названия совпадения не окажется, то как уже выше писалось.. добавлять его в общий список. Что бы потом, можно было это название найти уже в выпадающем списке при повторном вводе начальных букв.
Очень благодарен буду возможности примера или описания (подробнее), как это сделать!
.
Павел
17.08.2010
Дмитрий
13.08.2010 Максим, и Beleckiy, задали вопросы.
меня тоже интересует такое решение
К кому можно обратиться по данному вопросу?
готов оплатить работу Yandex-деньгами
цитата:
Добрый день, я хотел бы узнать возможно ли связать несколько таких редактируемых раскрывающихся списка? Например необходимо ввести данные о клиенте: ФИО, адрес, телефон, но так, чтобы их можно было вытащить из базы, вызвав только ФИО, а остальная информация самостоятельно вставлялась бы в остальные ячейки?.

А в чем проблема собственно... самый примитивный макрос написанный ручками на вба.. Пиши мне на мыло) если интересует то договоримся

.
Олег
19.08.2010
прочитал весь форум, но так и не понял, как сделать выпадающий список не в ячейке "D2", а в ячейках "D2:D4000" объясните кто-нибудь.
Remet
19.08.2010
Коллеги, подскажите пожалуйста следующее: я сделал как у Кирилла (10.02.2010), но мне нужно добавить еще и ячейку "С5" и "D5", вставляю этот код, выводит ОШИБКУ 1040!! Что здесь не так!?

If Target.Column = 3 And Target.Row > 4 Then
If IsEmpty(Target) Then Exit Sub
If WorksheetFunction.CountIf(Sheets("Списки").Range("Hotel"), Target) = 0 Then
lReply = MsgBox("Добавить введенное имя " & Target & " в выпадающий список?", vbYesNo + vbQuestion)
If lReply = vbYes Then
Sheets("Списки").Range("Hotel").Cells(Sheets("Списки").Range("Hotel").Rows.Count + 0, 1) = Target
Sheets("Списки").Range("Hotel").Sort Key1:=Sheets("Списки").Range("C5"), _
Order1:=xlAscending, Header:=xlNo
End If
If lReply = vbNo Then
lReply = MsgBox("Ошибка ввода.", vbOKOnly)
If lReply = vbOK Then
Target = ""
End If
End If
End If
End If
.
Сергей
27.08.2010
Для Павла:
Здесь простым макросом не отделаешься,ведь речь идет не только об извлечении данных из базы , но и о добавлении в базу.Нужна форма.
Можно,конечно и вручную заполнять лист с данными ,но как быть с сортировкой.Да и проверка на корректность ввода не помешает.

Для Олега:
Зачем тебе столько?.

Добавить комментарий к статье
Ваше имя:
Ваш E-mail: Уведомлять меня о новых комментариях по этой статье

Текст комментария:

 

Введите код с картинки: