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

Вход

Регистрация

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

 

= Мир MS Excel/Ввод уникальных значений - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ввод уникальных значений (Макросы/Sub)
Ввод уникальных значений
and_evg Дата: Четверг, 02.03.2017, 13:53 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Добрый день!
Задача:
В заданном диапазоне ограничить пользователя на ввод уже имеющегося значения (должны быть только уникальные)
Через проверку данных не предлагать :) т.к. необходимо ограничит ввод как с листа, так и с формы, а если через форму данная проверка не идет :(
В случае ввода с листа и при условии если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение и возвращает предыдущее значение данной ячейки. А также дает выбрать перейти ли на ячейку с данным значением.
В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение, возвращает предыдущее и устанавливает фокус на этот TextBox1.
Так вот загвоздка случилась в установке этого фокуса на TextBox1 %)
Ну и конструктивные замечания приветствуются :D
К сообщению приложен файл: 8805004.xls (53.0 Kb)


Сообщение отредактировал and_evg - Четверг, 02.03.2017, 13:55
 
Ответить
СообщениеДобрый день!
Задача:
В заданном диапазоне ограничить пользователя на ввод уже имеющегося значения (должны быть только уникальные)
Через проверку данных не предлагать :) т.к. необходимо ограничит ввод как с листа, так и с формы, а если через форму данная проверка не идет :(
В случае ввода с листа и при условии если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение и возвращает предыдущее значение данной ячейки. А также дает выбрать перейти ли на ячейку с данным значением.
В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение, возвращает предыдущее и устанавливает фокус на этот TextBox1.
Так вот загвоздка случилась в установке этого фокуса на TextBox1 %)
Ну и конструктивные замечания приветствуются :D

Автор - and_evg
Дата добавления - 02.03.2017 в 13:53
Manyasha Дата: Четверг, 02.03.2017, 17:46 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
and_evg, здравствуйте.
Может так?
К сообщению приложен файл: 8805004-1.xls (50.0 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеand_evg, здравствуйте.
Может так?

Автор - Manyasha
Дата добавления - 02.03.2017 в 17:46
and_evg Дата: Четверг, 02.03.2017, 18:01 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Manyasha, так конечно... можно соорудить что то... только в твоем случае в форме не работает проверка уникальности. эото раз! а два, то что я пытался добиться так это вставить один модуль в проект, написать пару строчек в обработчике событий на изменение листа и пару в обработчике контрола формы... Другими словами добиться минимальной универсальности... Нуууу оооочень часто хочется применять... :'(
 
Ответить
СообщениеManyasha, так конечно... можно соорудить что то... только в твоем случае в форме не работает проверка уникальности. эото раз! а два, то что я пытался добиться так это вставить один модуль в проект, написать пару строчек в обработчике событий на изменение листа и пару в обработчике контрола формы... Другими словами добиться минимальной универсальности... Нуууу оооочень часто хочется применять... :'(

Автор - and_evg
Дата добавления - 02.03.2017 в 18:01
RAN Дата: Четверг, 02.03.2017, 18:20 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
В случае ввода с листа

ввода куда?
ввел уже имеющееся значение

ввел куда?
А также дает выбрать перейти ли на ячейку с данным значением.

шедеврально
В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение

ввел куда?
возвращает предыдущее и устанавливает фокус на этот TextBox1

что есть предыдущее, и зачем фокус устанавливать?

Я думал, что всего этого просто не понял, а оказывается цель
Другими словами добиться минимальной универсальности

:)


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
В случае ввода с листа

ввода куда?
ввел уже имеющееся значение

ввел куда?
А также дает выбрать перейти ли на ячейку с данным значением.

шедеврально
В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение

ввел куда?
возвращает предыдущее и устанавливает фокус на этот TextBox1

что есть предыдущее, и зачем фокус устанавливать?

Я думал, что всего этого просто не понял, а оказывается цель
Другими словами добиться минимальной универсальности

:)

Автор - RAN
Дата добавления - 02.03.2017 в 18:20
and_evg Дата: Четверг, 02.03.2017, 19:50 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007

шедеврально

Если в определенном диапазоне уже существует ячейка с таким же значением, то нужно дать пользователю выбрать перейти (посмотреть) или нет данную запись
[vba]
Код

            msgtext = "В данном поле не должно быть одинаковых значений!" &
                       Chr(13) & _
                       Chr(13) & _
                       "Значение -   " & "'" & c.Value & "'" & _
                       Chr(13) & _
                       "Уже имеется в ячейке -   " & c.Address & _
                       Chr(13) & _
                       Chr(13) & _
                       "Перейти на данную запись?"
            retval = MsgBox(msgtext, vbCritical + vbYesNo, "Ошибка")
      .....
            If retval = vbYes Then c.Select 'если "да"- переходим на имеющуюся ячейку
[/vba]

что есть предыдущее, и зачем фокус устанавливать?

А затем, что бы пользователь понял, что ввел уже существующее значение и исправил его, иначе не дать выйти из данного TextBox1 до тех пор пока либо не вернет старое (которое было до изменения) либо не введет уникальное, которого в данном диапазоне ещё не существует!
[vba]
Код

            msgtext = "В данном поле не должно быть одинаковых значений!" & _
                       Chr(13) & _
                       Chr(13) & _
                       "Значение -   " & "'" & c.Value & "'" & _
                       Chr(13) & _
                       "Уже существует"
            retval = MsgBox(msgtext, vbCritical + vbOKOnly, "Ошибка")
            myTextBox.SetFocus
[/vba]

Я думал, что всего этого просто не понял, а оказывается цель


И что тут такого? На мой взгляд так, не решена только одна проблема - это установка фокуса на контролл, в который вводили уже имеющиеся данные на листе !
Manyasha, Конечно спасибо Вам, но хотелось бы решить установку фокуса не из модуля формы (это не проблема) а из стандарного модуля... повторюсь - очень часто данную процедуру придется вызывать... а прописывать для каждого текстбокса как то не комильфо... Правда если я не прав, то направь на путь истинный )))


Сообщение отредактировал and_evg - Пятница, 03.03.2017, 07:25
 
Ответить
Сообщение

шедеврально

Если в определенном диапазоне уже существует ячейка с таким же значением, то нужно дать пользователю выбрать перейти (посмотреть) или нет данную запись
[vba]
Код

            msgtext = "В данном поле не должно быть одинаковых значений!" &
                       Chr(13) & _
                       Chr(13) & _
                       "Значение -   " & "'" & c.Value & "'" & _
                       Chr(13) & _
                       "Уже имеется в ячейке -   " & c.Address & _
                       Chr(13) & _
                       Chr(13) & _
                       "Перейти на данную запись?"
            retval = MsgBox(msgtext, vbCritical + vbYesNo, "Ошибка")
      .....
            If retval = vbYes Then c.Select 'если "да"- переходим на имеющуюся ячейку
[/vba]

что есть предыдущее, и зачем фокус устанавливать?

А затем, что бы пользователь понял, что ввел уже существующее значение и исправил его, иначе не дать выйти из данного TextBox1 до тех пор пока либо не вернет старое (которое было до изменения) либо не введет уникальное, которого в данном диапазоне ещё не существует!
[vba]
Код

            msgtext = "В данном поле не должно быть одинаковых значений!" & _
                       Chr(13) & _
                       Chr(13) & _
                       "Значение -   " & "'" & c.Value & "'" & _
                       Chr(13) & _
                       "Уже существует"
            retval = MsgBox(msgtext, vbCritical + vbOKOnly, "Ошибка")
            myTextBox.SetFocus
[/vba]

Я думал, что всего этого просто не понял, а оказывается цель


И что тут такого? На мой взгляд так, не решена только одна проблема - это установка фокуса на контролл, в который вводили уже имеющиеся данные на листе !
Manyasha, Конечно спасибо Вам, но хотелось бы решить установку фокуса не из модуля формы (это не проблема) а из стандарного модуля... повторюсь - очень часто данную процедуру придется вызывать... а прописывать для каждого текстбокса как то не комильфо... Правда если я не прав, то направь на путь истинный )))

Автор - and_evg
Дата добавления - 02.03.2017 в 19:50
Pelena Дата: Четверг, 02.03.2017, 20:00 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 19199
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
and_evg, излишнее цитирование - это нарушение Правил форума. Исправьте свой предыдущий пост.

И да, Вы с Manyasha давно знакомы? Она к Вам на "вы" обращается...


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщениеand_evg, излишнее цитирование - это нарушение Правил форума. Исправьте свой предыдущий пост.

И да, Вы с Manyasha давно знакомы? Она к Вам на "вы" обращается...

Автор - Pelena
Дата добавления - 02.03.2017 в 20:00
RAN Дата: Четверг, 02.03.2017, 20:57 | Сообщение № 7
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Конечно же в определенную ячейку (диапазон) листа!!!

И я о том-же. На лист, а не с листа. С листа можно ввести данные, например в textbox формы.
но так как он связан по свойству ControlSource с ячейкой листа

Подход не верный
иначе не дать выйти из данного TextBox1

Для этого есть другие способы, пример вчера выкладывал здесь.
Так что, не решена только одна проблема - правильный подход к задаче.


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
Конечно же в определенную ячейку (диапазон) листа!!!

И я о том-же. На лист, а не с листа. С листа можно ввести данные, например в textbox формы.
но так как он связан по свойству ControlSource с ячейкой листа

Подход не верный
иначе не дать выйти из данного TextBox1

Для этого есть другие способы, пример вчера выкладывал здесь.
Так что, не решена только одна проблема - правильный подход к задаче.

Автор - RAN
Дата добавления - 02.03.2017 в 20:57
and_evg Дата: Пятница, 03.03.2017, 08:04 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Pelena, Приношу извинения за излишнее цитирование, но я всего лишь отвечал на высказывания RAN.
Manyasha, Извиняюсь. Вчера не правильно написал. У Вас все работает на форме проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля. Ну и второй момент оформить это все одним модулем, а не прописывать весь этот код отдельно для каждого поля .
Подход не верный

Почему не верный? Какие недостатки у ControlSource? Какие аргументы?
Для этого есть другие способы

Посмотрел я Вашу "маску ввода", но опять повторюсь, что и в Вашем примере прописывается все к конкретному контролу, а хотелось бы в отдельном модуле. Так как данных уникальных полей в проекте не одно. Для одного согласен, можно прописать как у Вас или как у Manyasha, и это не составляет труда, но тогда по сути один и тот же код придется прописывать несколько раз. К примеру в моем случае это 7 раз.
 
Ответить
СообщениеPelena, Приношу извинения за излишнее цитирование, но я всего лишь отвечал на высказывания RAN.
Manyasha, Извиняюсь. Вчера не правильно написал. У Вас все работает на форме проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля. Ну и второй момент оформить это все одним модулем, а не прописывать весь этот код отдельно для каждого поля .
Подход не верный

Почему не верный? Какие недостатки у ControlSource? Какие аргументы?
Для этого есть другие способы

Посмотрел я Вашу "маску ввода", но опять повторюсь, что и в Вашем примере прописывается все к конкретному контролу, а хотелось бы в отдельном модуле. Так как данных уникальных полей в проекте не одно. Для одного согласен, можно прописать как у Вас или как у Manyasha, и это не составляет труда, но тогда по сути один и тот же код придется прописывать несколько раз. К примеру в моем случае это 7 раз.

Автор - and_evg
Дата добавления - 03.03.2017 в 08:04
Wasilich Дата: Пятница, 03.03.2017, 10:57 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
and_evg, просмотрел Вашу задачу, немного странные условия ввода данных. Если можно вносить данные непосредственно на листе, то зачем тогда форма? %) Думаю, надо выбрать одно из двух. yes
И еще одно странное желание:
проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля
что это значит? Как определить, что редактирование завершено? И почему редактирование? Может все таки ввод.
И в конце, оказывается, у Вас не один столбец проверять надо, а уже 7. :'(
Может надо было завершить свою задачу, по вводу данных, до конца, а уж потом заняться контролем ввода.


Сообщение отредактировал Wasilich - Пятница, 03.03.2017, 11:06
 
Ответить
Сообщениеand_evg, просмотрел Вашу задачу, немного странные условия ввода данных. Если можно вносить данные непосредственно на листе, то зачем тогда форма? %) Думаю, надо выбрать одно из двух. yes
И еще одно странное желание:
проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля
что это значит? Как определить, что редактирование завершено? И почему редактирование? Может все таки ввод.
И в конце, оказывается, у Вас не один столбец проверять надо, а уже 7. :'(
Может надо было завершить свою задачу, по вводу данных, до конца, а уж потом заняться контролем ввода.

Автор - Wasilich
Дата добавления - 03.03.2017 в 10:57
and_evg Дата: Пятница, 03.03.2017, 11:29 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Wasilich, Согласен, что странные желания :) но как ни крути, а столкнулся вот с такой поставленной задачей :)
Необходимо пользователю дать возможность как вводить новые данные, так и редактировать существующие и при этом необходимо предусмотреть возможность вносить (редактировать) данные непосредственно на листе и с формы. %)
Как определить, что редактирование завершено?

Так как текстовое поле TextBox связано по свойству ControlSource с определенной ячейкой, то при потери фокуса, другими словами при выходе из этого поля, данные введенные в поле заносятся в эту ячейку и срабатывает событие листа Worksheet_Change которое запускает процедуру проверки уникальности.
у Вас не один столбец проверять надо, а уже 7.

В данном случае да. Именно 7 столбцов. 7 таблиц (каждая на своем листе) и в каждой таблице уникальное поле.
В первом посте описал проблему и вложил файл только для одного столбца, так как если удастся решить для одного, то этот модуль без проблем и дополнительной писанины можно применить и к семи.
 
Ответить
СообщениеWasilich, Согласен, что странные желания :) но как ни крути, а столкнулся вот с такой поставленной задачей :)
Необходимо пользователю дать возможность как вводить новые данные, так и редактировать существующие и при этом необходимо предусмотреть возможность вносить (редактировать) данные непосредственно на листе и с формы. %)
Как определить, что редактирование завершено?

Так как текстовое поле TextBox связано по свойству ControlSource с определенной ячейкой, то при потери фокуса, другими словами при выходе из этого поля, данные введенные в поле заносятся в эту ячейку и срабатывает событие листа Worksheet_Change которое запускает процедуру проверки уникальности.
у Вас не один столбец проверять надо, а уже 7.

В данном случае да. Именно 7 столбцов. 7 таблиц (каждая на своем листе) и в каждой таблице уникальное поле.
В первом посте описал проблему и вложил файл только для одного столбца, так как если удастся решить для одного, то этот модуль без проблем и дополнительной писанины можно применить и к семи.

Автор - and_evg
Дата добавления - 03.03.2017 в 11:29
Wasilich Дата: Пятница, 03.03.2017, 12:35 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Ну совсем запутал. 7 столбцов на 1-ом листе или по 1-му столбцу на 7-ми листах?
Лично я пока не представляю как все эти хотелки собрать в одно целое. %)
 
Ответить
СообщениеНу совсем запутал. 7 столбцов на 1-ом листе или по 1-му столбцу на 7-ми листах?
Лично я пока не представляю как все эти хотелки собрать в одно целое. %)

Автор - Wasilich
Дата добавления - 03.03.2017 в 12:35
and_evg Дата: Пятница, 03.03.2017, 12:53 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Wasilich В каждой таблице (листе) по одному уникальному полю.
хотелки собрать в одно целое

"Хотелки" я кажется уже собрал в целое. Проблема только в возврате фокуса в текстовое поле (на форме) если пользователь ввел уже имеющееся значение.

Если из модуля формы, то Me.Textbox1.SetFocus работает нормально.
А если как я пытаюсь, через глобальную объектную переменную объявленную в обыкновенном модуле Public myTextBox As MSForms.TextBox и вызывая myTextBox.SetFocus не работает. :(

P.S. пример в первом топике
 
Ответить
СообщениеWasilich В каждой таблице (листе) по одному уникальному полю.
хотелки собрать в одно целое

"Хотелки" я кажется уже собрал в целое. Проблема только в возврате фокуса в текстовое поле (на форме) если пользователь ввел уже имеющееся значение.

Если из модуля формы, то Me.Textbox1.SetFocus работает нормально.
А если как я пытаюсь, через глобальную объектную переменную объявленную в обыкновенном модуле Public myTextBox As MSForms.TextBox и вызывая myTextBox.SetFocus не работает. :(

P.S. пример в первом топике

Автор - and_evg
Дата добавления - 03.03.2017 в 12:53
Wasilich Дата: Пятница, 03.03.2017, 19:29 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 1232
Репутация: 326 ±
Замечаний: 0% ±

2003
Вот нахимичил, так не так, перетакивать не буду. :)
Макрос, контроля ввода на листе, в модуле книги. Контроль с формы, в модуле формы.
Отлавливать выход из TextBox`a посредством
[vba]
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
[/vba]
не приемлемо, ибо он срабатывает и на закрытие формы. Удачи.
К сообщению приложен файл: and_evg2.xls (60.5 Kb)
 
Ответить
СообщениеВот нахимичил, так не так, перетакивать не буду. :)
Макрос, контроля ввода на листе, в модуле книги. Контроль с формы, в модуле формы.
Отлавливать выход из TextBox`a посредством
[vba]
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
[/vba]
не приемлемо, ибо он срабатывает и на закрытие формы. Удачи.

Автор - Wasilich
Дата добавления - 03.03.2017 в 19:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Ввод уникальных значений (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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