Добрый день! Задача: В заданном диапазоне ограничить пользователя на ввод уже имеющегося значения (должны быть только уникальные) Через проверку данных не предлагать т.к. необходимо ограничит ввод как с листа, так и с формы, а если через форму данная проверка не идет В случае ввода с листа и при условии если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение и возвращает предыдущее значение данной ячейки. А также дает выбрать перейти ли на ячейку с данным значением. В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение, возвращает предыдущее и устанавливает фокус на этот TextBox1. Так вот загвоздка случилась в установке этого фокуса на TextBox1 Ну и конструктивные замечания приветствуются
Добрый день! Задача: В заданном диапазоне ограничить пользователя на ввод уже имеющегося значения (должны быть только уникальные) Через проверку данных не предлагать т.к. необходимо ограничит ввод как с листа, так и с формы, а если через форму данная проверка не идет В случае ввода с листа и при условии если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение и возвращает предыдущее значение данной ячейки. А также дает выбрать перейти ли на ячейку с данным значением. В случае ввода с формы (TextBox1) если пользователь ввел уже имеющееся значение, выходит сообщение, что есть уже такое значение, возвращает предыдущее и устанавливает фокус на этот TextBox1. Так вот загвоздка случилась в установке этого фокуса на TextBox1 Ну и конструктивные замечания приветствуются and_evg
Manyasha, так конечно... можно соорудить что то... только в твоем случае в форме не работает проверка уникальности. эото раз! а два, то что я пытался добиться так это вставить один модуль в проект, написать пару строчек в обработчике событий на изменение листа и пару в обработчике контрола формы... Другими словами добиться минимальной универсальности... Нуууу оооочень часто хочется применять...
Manyasha, так конечно... можно соорудить что то... только в твоем случае в форме не работает проверка уникальности. эото раз! а два, то что я пытался добиться так это вставить один модуль в проект, написать пару строчек в обработчике событий на изменение листа и пару в обработчике контрола формы... Другими словами добиться минимальной универсальности... Нуууу оооочень часто хочется применять... and_evg
Если в определенном диапазоне уже существует ячейка с таким же значением, то нужно дать пользователю выбрать перейти (посмотреть) или нет данную запись [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 'если "да"- переходим на имеющуюся ячейку
А затем, что бы пользователь понял, что ввел уже существующее значение и исправил его, иначе не дать выйти из данного TextBox1 до тех пор пока либо не вернет старое (которое было до изменения) либо не введет уникальное, которого в данном диапазоне ещё не существует! [vba]
Код
msgtext = "В данном поле не должно быть одинаковых значений!" & _ Chr(13) & _ Chr(13) & _ "Значение - " & "'" & c.Value & "'" & _ Chr(13) & _ "Уже существует" retval = MsgBox(msgtext, vbCritical + vbOKOnly, "Ошибка") myTextBox.SetFocus
Я думал, что всего этого просто не понял, а оказывается цель
И что тут такого? На мой взгляд так, не решена только одна проблема - это установка фокуса на контролл, в который вводили уже имеющиеся данные на листе ! Manyasha, Конечно спасибо Вам, но хотелось бы решить установку фокуса не из модуля формы (это не проблема) а из стандарного модуля... повторюсь - очень часто данную процедуру придется вызывать... а прописывать для каждого текстбокса как то не комильфо... Правда если я не прав, то направь на путь истинный )))
Если в определенном диапазоне уже существует ячейка с таким же значением, то нужно дать пользователю выбрать перейти (посмотреть) или нет данную запись [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 'если "да"- переходим на имеющуюся ячейку
А затем, что бы пользователь понял, что ввел уже существующее значение и исправил его, иначе не дать выйти из данного TextBox1 до тех пор пока либо не вернет старое (которое было до изменения) либо не введет уникальное, которого в данном диапазоне ещё не существует! [vba]
Код
msgtext = "В данном поле не должно быть одинаковых значений!" & _ Chr(13) & _ Chr(13) & _ "Значение - " & "'" & c.Value & "'" & _ Chr(13) & _ "Уже существует" retval = MsgBox(msgtext, vbCritical + vbOKOnly, "Ошибка") myTextBox.SetFocus
Я думал, что всего этого просто не понял, а оказывается цель
И что тут такого? На мой взгляд так, не решена только одна проблема - это установка фокуса на контролл, в который вводили уже имеющиеся данные на листе ! Manyasha, Конечно спасибо Вам, но хотелось бы решить установку фокуса не из модуля формы (это не проблема) а из стандарного модуля... повторюсь - очень часто данную процедуру придется вызывать... а прописывать для каждого текстбокса как то не комильфо... Правда если я не прав, то направь на путь истинный )))and_evg
Сообщение отредактировал and_evg - Пятница, 03.03.2017, 07:25
Pelena, Приношу извинения за излишнее цитирование, но я всего лишь отвечал на высказывания RAN. Manyasha, Извиняюсь. Вчера не правильно написал. У Вас все работает на форме проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля. Ну и второй момент оформить это все одним модулем, а не прописывать весь этот код отдельно для каждого поля .
Посмотрел я Вашу "маску ввода", но опять повторюсь, что и в Вашем примере прописывается все к конкретному контролу, а хотелось бы в отдельном модуле. Так как данных уникальных полей в проекте не одно. Для одного согласен, можно прописать как у Вас или как у Manyasha, и это не составляет труда, но тогда по сути один и тот же код придется прописывать несколько раз. К примеру в моем случае это 7 раз.
Pelena, Приношу извинения за излишнее цитирование, но я всего лишь отвечал на высказывания RAN. Manyasha, Извиняюсь. Вчера не правильно написал. У Вас все работает на форме проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля. Ну и второй момент оформить это все одним модулем, а не прописывать весь этот код отдельно для каждого поля .
Посмотрел я Вашу "маску ввода", но опять повторюсь, что и в Вашем примере прописывается все к конкретному контролу, а хотелось бы в отдельном модуле. Так как данных уникальных полей в проекте не одно. Для одного согласен, можно прописать как у Вас или как у Manyasha, и это не составляет труда, но тогда по сути один и тот же код придется прописывать несколько раз. К примеру в моем случае это 7 раз.and_evg
and_evg, просмотрел Вашу задачу, немного странные условия ввода данных. Если можно вносить данные непосредственно на листе, то зачем тогда форма? Думаю, надо выбрать одно из двух. И еще одно странное желание:
проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля
что это значит? Как определить, что редактирование завершено? И почему редактирование? Может все таки ввод. И в конце, оказывается, у Вас не один столбец проверять надо, а уже 7. Может надо было завершить свою задачу, по вводу данных, до конца, а уж потом заняться контролем ввода.
and_evg, просмотрел Вашу задачу, немного странные условия ввода данных. Если можно вносить данные непосредственно на листе, то зачем тогда форма? Думаю, надо выбрать одно из двух. И еще одно странное желание:
проверяет но по нажатю на кнопку, а хотелось бы что бы по завершению редактирования поля
что это значит? Как определить, что редактирование завершено? И почему редактирование? Может все таки ввод. И в конце, оказывается, у Вас не один столбец проверять надо, а уже 7. Может надо было завершить свою задачу, по вводу данных, до конца, а уж потом заняться контролем ввода.Wasilich
Сообщение отредактировал Wasilich - Пятница, 03.03.2017, 11:06
Wasilich, Согласен, что странные желания но как ни крути, а столкнулся вот с такой поставленной задачей Необходимо пользователю дать возможность как вводить новые данные, так и редактировать существующие и при этом необходимо предусмотреть возможность вносить (редактировать) данные непосредственно на листе и с формы.
Так как текстовое поле TextBox связано по свойству ControlSource с определенной ячейкой, то при потери фокуса, другими словами при выходе из этого поля, данные введенные в поле заносятся в эту ячейку и срабатывает событие листа Worksheet_Change которое запускает процедуру проверки уникальности.
В данном случае да. Именно 7 столбцов. 7 таблиц (каждая на своем листе) и в каждой таблице уникальное поле. В первом посте описал проблему и вложил файл только для одного столбца, так как если удастся решить для одного, то этот модуль без проблем и дополнительной писанины можно применить и к семи.
Wasilich, Согласен, что странные желания но как ни крути, а столкнулся вот с такой поставленной задачей Необходимо пользователю дать возможность как вводить новые данные, так и редактировать существующие и при этом необходимо предусмотреть возможность вносить (редактировать) данные непосредственно на листе и с формы.
Так как текстовое поле TextBox связано по свойству ControlSource с определенной ячейкой, то при потери фокуса, другими словами при выходе из этого поля, данные введенные в поле заносятся в эту ячейку и срабатывает событие листа Worksheet_Change которое запускает процедуру проверки уникальности.
В данном случае да. Именно 7 столбцов. 7 таблиц (каждая на своем листе) и в каждой таблице уникальное поле. В первом посте описал проблему и вложил файл только для одного столбца, так как если удастся решить для одного, то этот модуль без проблем и дополнительной писанины можно применить и к семи.and_evg
Ну совсем запутал. 7 столбцов на 1-ом листе или по 1-му столбцу на 7-ми листах? Лично я пока не представляю как все эти хотелки собрать в одно целое.
Ну совсем запутал. 7 столбцов на 1-ом листе или по 1-му столбцу на 7-ми листах? Лично я пока не представляю как все эти хотелки собрать в одно целое. Wasilich
"Хотелки" я кажется уже собрал в целое. Проблема только в возврате фокуса в текстовое поле (на форме) если пользователь ввел уже имеющееся значение.
Если из модуля формы, то Me.Textbox1.SetFocus работает нормально. А если как я пытаюсь, через глобальную объектную переменную объявленную в обыкновенном модуле Public myTextBox As MSForms.TextBox и вызывая myTextBox.SetFocus не работает.
P.S. пример в первом топике
Wasilich В каждой таблице (листе) по одному уникальному полю.
"Хотелки" я кажется уже собрал в целое. Проблема только в возврате фокуса в текстовое поле (на форме) если пользователь ввел уже имеющееся значение.
Если из модуля формы, то Me.Textbox1.SetFocus работает нормально. А если как я пытаюсь, через глобальную объектную переменную объявленную в обыкновенном модуле Public myTextBox As MSForms.TextBox и вызывая myTextBox.SetFocus не работает.
Вот нахимичил, так не так, перетакивать не буду. Макрос, контроля ввода на листе, в модуле книги. Контроль с формы, в модуле формы. Отлавливать выход из TextBox`a посредством [vba]
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
[/vba] не приемлемо, ибо он срабатывает и на закрытие формы. Удачи.
Вот нахимичил, так не так, перетакивать не буду. Макрос, контроля ввода на листе, в модуле книги. Контроль с формы, в модуле формы. Отлавливать выход из TextBox`a посредством [vba]
Код
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
[/vba] не приемлемо, ибо он срабатывает и на закрытие формы. Удачи.Wasilich