Добрый вечер, друзья! Вот решил наваять форму для ввода данных, планы на нее конечно как у гитлера, но сами знаете какой из меня макросописатель :). Надергал с форума кодов разных... Особенно понравилась функция NoDups от ZVI в теме: http://www.planetaexcel.ru/forum.php?thread_id=10602 и тут случился ступор: Как разрешить ввод в ComboBox новых значений, не имеющихся в списке? (В примере вызов формы кнопкой "ПЕРЕМЕЩЕНИЯ" ComboBox1 "Номенклатурный №") Поможете?
>Поможете? мильен ^__^ Какие шутки у меня злые стали )
>Особенно понравилась функция NoDups от ZVI Я бы сейчас так делать не стал. Куда проще собрать массив уникальных, а затем пройтись по нему процедурой сортировки. Проще и быстрее )
Напиши, что конкретно надо, а то разбирать лень )
>Как разрешить ввод в ComboBox новых значений, не имеющихся в списке? эту процедуру перепиши
Private Sub ComboBox1_Change() Dim iRange As Range, iRow As Long Set iRange = Columns(3).Find(what:=ComboBox1.Value, LookIn:=xlValues, lookAt:=xlWhole) If Not iRange Is Nothing Then iRow = iRange.Row End If TextBox3.Value = Cells(iRow, 4) End Sub
Чебурашка стал символом олимпийских игр. А чего достиг ты? Тишина - самый громкий звук
<мильен ^__^ Какие шутки у меня злые стали )> Саш, могу только мильен алых роз... но тебе ж не подойдет :) <Я бы сейчас так делать не стал. Куда проще собрать массив уникальных, а затем пройтись по нему процедурой сортировки. Проще и быстрее )> Ну дык я ж потому и пришел с вопросом/подвохом - а вдруг кто еще чего подскажет. <эту процедуру перепиши...> Это я уже понял, вот на какую? -:)
Насколько я понимаю, ошибка возникает из-за отсутствия в столбце C, вводимого в вышеуказанный Combobox нового значения. Find просто не находит его. Это просто предположение...
Сбор уникальных в массив или в коллекцию в данном случае вообще прироста в скорости не даст, а изобретать велосипед, если уже есть мотоцикл... Смысл? Для устарнения ошибки просто поменяйте местами End If и TextBox3.Value = Cells(iRow, 4).
Еще раз добрый вечер! Осталась по этому пункту небольшая некрасивость: К примеру ввожу в combobox1 "Номенклатурный №" какое-либо значение, например число 4 и в textbox3 "Наименование ТМЦ" сразу вводится значение "Сливы" (в принципе так и задумано). Но если продолжить, и ввести к примеру 47 то "Сливы" так и продолжают висеть. А очень хотелось бы, чтобы текстбокс очищался (ненароком можно ввести неправильные данные. Какое условие нужно добавить в эту процедуру?
Private Sub ComboBox1_Change() Dim iRange As Range, iRow As Long Set iRange = Columns(3).Find(what:=ComboBox1.Value, LookIn:=xlValues, lookAt:=xlWhole) If Not iRange Is Nothing Then iRow = iRange.Row TextBox3.Value = Cells(iRow, 4) End If End Sub
Впрочем, с комбобоксами "Направление" и "Участники" происходит тоже самое, при смене направления...
Вить, откуда знаешь?! :) В принципе почти, но... если ввести имеющееся значение в списке, в текстбоксе по клику отобразится нужное значение. А затем поменять значение в комбобоксе, значение в текстбоксе останется прежним, а хотелось бы как раньше...>>
Private Sub ComboBox3_Change() ComboBox4.Value = "" If ComboBox3.Value = "приход" Then Me.ComboBox4.RowSource = "Ввод_данных!J1:J6" Else If ComboBox3.Value = "расход" Then Me.ComboBox4.RowSource = "Ввод_данных!J7:J12" End If End If End Sub
лучше так 'удаляем ComboBox4 Private Sub ComboBox3_Change() ComboBox4.Value = "" End Sub
'при выходе из ComboBox3 записываем данные в ComboBox4 Private Sub ComboBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) If ComboBox3.Value = "приход" Then Me.ComboBox4.RowSource = "Ввод_данных!J1:J6" Else If ComboBox3.Value = "расход" Then Me.ComboBox4.RowSource = "Ввод_данных!J7:J12" End If End If End Sub
Игорь, для комбо 2 и 3 есть смысл установить Style = fmStyleDropDownList (только значения из списка) и заполнять при активации так Private Sub UserForm_Activate() ComboBox2.List = Array("тонн", "литров", "градусов") Тогда на листе ничего рисовать не нужно будет
Даулет, спасибо! Андрей, точно, и не затрет никто (пока догадался что RowSource нужно очистить, чуть голову не сломал:)). Эх бесовская наука! А может и с комбо4 тоже можно такое провернуть, значений вроде немного? Только условия там...
Private Sub ComboBox3_Change() ComboBox4.Value = "" End Sub
Private Sub ComboBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) If ComboBox3.Value = "приход" Then ComboBox4.List = Array("Жмуриков=>Иванов", "Полотно=>Иванов", "Кубинский=>Иванов", "Пасечник=>Иванов", "Дробот=>Иванов", "Кальянов=>Иванов") Else If ComboBox3.Value = "расход" Then Me.ComboBox4.List = Array("Иванов=>Жмуриков", "Иванов=>Полотно", "Иванов=>Кубинский", "Иванов=>Пасечник", "Иванов=>Дробот", "Иванов=>Кальянов") Else Me.ComboBox4.Clear End If End If End Sub
Даулет, уже сам накорябал, но спасибо! Андрей, Виктор тоже спасибо. Теперь буду вторую форму всякими хитрыми свойствами наполнять, так что на неделю работой обеспечен :)
Еще календарик от Слэна думаю прикрутить, а то этот не работает в 2007-ом Excel_е...
Андрей, ты имеешь ввиду ручной ввод даты? Если честно, хотелось бы красивостей всяких(календариков, калькуляторов, еще какой-нибудь чуши) - мадам всетаки заполнять будет. А насчет раздела участников по отдельным столбцам: ну не знаю, этот тип данных носит чисто информационный/визуальный характер, не будут на него никакими формулами/макросами ссылаться - стОит ли? А вот чего действительно стОит, так это не позволить ввод абсолютно одинаковых строк, с выводом предупреждения ярко-алым цветом в большой текстбокс внизу формы.
Еще один не большой баг заметил в твоем файле: попробуй заполнить форму не сверху вниз, а наоборот. И когда дойдешь до смены значения в комбо1 все нижние значения затрутся. Сейчас гляну у себя на форме, может тоже так - тады не годится...
Хотя конечно, присмотрелся - с автовводом разделителей тоже неплохо, может и проще будет. Только при инициализации формы постоянно одно неправильное значение даты светится, специально оставил?
Там нет ничего случайного. При активации формы в поле дата вводится сегодняшняя дата. Не нравится - можно убрать. При изменении textbox1 - обнуляются все контролы, кроме даты. При изменении комбо1 - все поля, что ниже. Просто предполагается, что если ты полез править эти поля - значит где-то что-то неверно ввел. Вводи заново и смотри внимательнее! А иначе может получиться - номенклатура сменил, а количество - забыл.
Добавь в код формы Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) KeyAscii = DatBox_KeyPress(KeyAscii) End Sub
{quote}{login=kim}{date=03.07.2012 12:16}{thema=}{post}А вот чего действительно стОит, так это не позволить ввод абсолютно одинаковых строк, с выводом предупреждения ярко-алым цветом в большой текстбокс внизу формы. {/post}{/quote} У тебя что, номер перемещения не уникальный?
А ведь ты прав, черт подери, об этом я как-то не подумал :) Надо только мадам предупредить чтоб по-человечески вводила, а не как попало. А что даст этот код?(пока не разобрался) P.S. А дата таки неправильная светится 7/2/2012 о чем меседж исправно уведомляет.
<<У тебя что, номер перемещения не уникальный?>> На одну дату может приходится несколько разных номеров перемещений. Под одним номером перемещения может находится от 1-ого до 50-ти позиций с разными номенклатурными (иногда даже одинаковыми номенклатурными, но с разными массами/количеством)
Не, русский... вроде. Все, решено, календарик долой, перебъется. Еще подумал: форма закрывается при каждом вводе, что не комильфо - каждый раз вызывать, если много значений вводить за раз, лучше крестиком и дата последнего ввода как раз висеть будет.
По просьбе Андрея проверил на английскм Экселе (но с русскими региональными настройками) UserForm1.textbox2 - работает нормально, результат ввода 0507 = 05.07.2012
{quote}{login=kim}{date=03.07.2012 01:18}{thema=}{post}форма закрывается при каждом вводе, что не комильфо - каждый раз вызывать, если много значений вводить за раз, лучше крестиком и дата последнего ввода как раз висеть будет.{/post}{/quote} Зачем закрывать? Просто очищать поля ввода. Или, если нужно чего-то на листе посмотреть, спрятать без выгрузки из памяти: Me.Hide