Здравствуйте всем! Есть такая заморочка. Сделал файл с динамическим listbox. После кнопки записи в базу создается на листе-базе строка с данными. С первой формы далее по кнопке на печать открывается форма с выбором ФИО сотрудника, данные которого надо распечатать. Пока строка одна на листе-базе, все корректно работает, но если начинать добавлять новые записи-строки, то ФИО следующих сотрудников в форме в листбоксе не появляются, видит только первого введенного. Если все формы закрыть крестиком вручную, потом с листа ввода открыть первую форму, с нее открыть форму с листбоксом, то тогда все ранее введенные сотрудники отображаются в окне выбора листбокса. С листбоксом еще не работал (с динамическим пополнением), прочитал некоторый материал, но ничего не понял, почему так получается. Прошу Вашего совета.
Здравствуйте всем! Есть такая заморочка. Сделал файл с динамическим listbox. После кнопки записи в базу создается на листе-базе строка с данными. С первой формы далее по кнопке на печать открывается форма с выбором ФИО сотрудника, данные которого надо распечатать. Пока строка одна на листе-базе, все корректно работает, но если начинать добавлять новые записи-строки, то ФИО следующих сотрудников в форме в листбоксе не появляются, видит только первого введенного. Если все формы закрыть крестиком вручную, потом с листа ввода открыть первую форму, с нее открыть форму с листбоксом, то тогда все ранее введенные сотрудники отображаются в окне выбора листбокса. С листбоксом еще не работал (с динамическим пополнением), прочитал некоторый материал, но ничего не понял, почему так получается. Прошу Вашего совета.dixus
Private Sub UserForm_Initialize() Sheets("База").Visible = True Dim iMassiv() With Sheets("База") iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value End With ListBox1.ColumnCount = 1 ListBox1.List = iMassiv End Sub
[/vba]
[vba]
Код
Private Sub UserForm_Initialize() Sheets("База").Visible = True Dim iMassiv() With Sheets("База") iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value End With ListBox1.ColumnCount = 1 ListBox1.List = iMassiv End Sub
[/vba] выбирает только 2 и 3 ячейку, и не включает 4 и далее строчки, если они не пустые. То код, что был у меня в примере, делал это, но только если закрыть вручную все формы и потом открывать их снова. Кроме того, по кнопке 2 на первой форме лист База не скрывается, и потому часть кода [vba]
Код
Sheets("База").Visible = True
[/vba] вызывает ошибку при вызове формы 2 с листбоксом. Когда я эту строчку кода убрал, вызов формы перестал давать ошибку, но по-прежнему листбокс видит только 2 первые заполненные ячейки
[/vba] выбирает только 2 и 3 ячейку, и не включает 4 и далее строчки, если они не пустые. То код, что был у меня в примере, делал это, но только если закрыть вручную все формы и потом открывать их снова. Кроме того, по кнопке 2 на первой форме лист База не скрывается, и потому часть кода [vba]
Код
Sheets("База").Visible = True
[/vba] вызывает ошибку при вызове формы 2 с листбоксом. Когда я эту строчку кода убрал, вызов формы перестал давать ошибку, но по-прежнему листбокс видит только 2 первые заполненные ячейкиdixus
Сообщение отредактировал dixus - Суббота, 28.01.2017, 13:30
Эта часть кода выбирает все непустые ячейки столбца "С", начиная со второй строки. Просто в ваш листбокс помещается всего одна строка по высоте. Ваш код создает массив в 1499 строк, заполненных "" (String нулевой длины), в случае, если столбец "С" пустой. А что бы листбокс обновлялся, код выше надо перенести на событие активации Userform? либо строчку [vba]
Код
UserForm2.Hide
[/vba]заменить на[vba]
Код
Unload Me
[/vba] И вообще, в данной форме лучше использовать ComboBox
Эта часть кода выбирает все непустые ячейки столбца "С", начиная со второй строки. Просто в ваш листбокс помещается всего одна строка по высоте. Ваш код создает массив в 1499 строк, заполненных "" (String нулевой длины), в случае, если столбец "С" пустой. А что бы листбокс обновлялся, код выше надо перенести на событие активации Userform? либо строчку [vba]
Код
UserForm2.Hide
[/vba]заменить на[vba]
Код
Unload Me
[/vba] И вообще, в данной форме лучше использовать ComboBoxMichael_S
Michael_S, Разъяснили дураку. Спасибо, буду пробовать. Просто в Вашем коде в листбоксе не появляется выбор значения, чтобы перемещаясь по строчкам окна листбокса, можно было выбрать нужный. А насчет замены тоже думал, но в силу малого опыта не догадался, что просто скрытие формы - это не то, и нужно выгружать из памяти. Получается, если я скрывал кнопкой форму, она не цепляла обновленный диапазон по столбцу С, а когда закрывал форму крестиком в углу, то форма выгружалась из памяти, и когда снова открыть форму, то листбокс обновлялся? Снег во дворе дочищу, попробую. А в чем вообще разница между комбобоксом и листбоксом? Захотелось освоить немного листбокс, раньше до него еще не добирался
Michael_S, Разъяснили дураку. Спасибо, буду пробовать. Просто в Вашем коде в листбоксе не появляется выбор значения, чтобы перемещаясь по строчкам окна листбокса, можно было выбрать нужный. А насчет замены тоже думал, но в силу малого опыта не догадался, что просто скрытие формы - это не то, и нужно выгружать из памяти. Получается, если я скрывал кнопкой форму, она не цепляла обновленный диапазон по столбцу С, а когда закрывал форму крестиком в углу, то форма выгружалась из памяти, и когда снова открыть форму, то листбокс обновлялся? Снег во дворе дочищу, попробую. А в чем вообще разница между комбобоксом и листбоксом? Захотелось освоить немного листбокс, раньше до него еще не добиралсяdixus
Извините, попробовал, теперь получается как планировалось, только часто выскакивает ошибка при срабатывании кнопки 2 на форме 1, не вызывается форма 2. При запуске файла открывается форма 1, заносишь данные, вроде работает форма 2. Потом если через крестик закроешь, то постоянно при следующем вызове формы 2 выдает ошибку в коде кнопки 2 на форме 1 строчку кода [vba]
Код
UserForm2.Show
[/vba] считает ошибкой. Порой сразу при открытии файла после записи в базу нажимаешь кнопку 2 для вызова формы 2, а вылазит ошибка, вышеописанная. Не пойму, в чем такая вариативность
Извините, попробовал, теперь получается как планировалось, только часто выскакивает ошибка при срабатывании кнопки 2 на форме 1, не вызывается форма 2. При запуске файла открывается форма 1, заносишь данные, вроде работает форма 2. Потом если через крестик закроешь, то постоянно при следующем вызове формы 2 выдает ошибку в коде кнопки 2 на форме 1 строчку кода [vba]
Код
UserForm2.Show
[/vba] считает ошибкой. Порой сразу при открытии файла после записи в базу нажимаешь кнопку 2 для вызова формы 2, а вылазит ошибка, вышеописанная. Не пойму, в чем такая вариативностьdixus
[/vba] Теперь ошибки не выдает, но выводит название столбца в окошке на первом месте. В принципе, не суть важно, но хотелось бы без этого лишнего. Хотя можно запретить выводить на печать, если в базе всего один сотрудник. Видимо, в этом и смысл - если нет массива, а это минимум 2 значения, то будет ошибка
Все, я понял, почему так работает. Если в базе запись всего одна, то строчка кода [vba]
[/vba] Теперь ошибки не выдает, но выводит название столбца в окошке на первом месте. В принципе, не суть важно, но хотелось бы без этого лишнего. Хотя можно запретить выводить на печать, если в базе всего один сотрудник. Видимо, в этом и смысл - если нет массива, а это минимум 2 значения, то будет ошибкаdixus
Сообщение отредактировал dixus - Суббота, 28.01.2017, 20:23
Private Sub UserForm_Initialize() Sheets("База").Visible = True Dim iMassiv As Variant With Sheets("База") If .Cells(2, 3) <> "" Then iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value End If End With If IsArray(iMassiv) Then ComboBox1.List = iMassiv Else ComboBox1.Value = iMassiv 'если всего одна запись - выбора нет, End If ComboBox1.ListRows = ComboBox1.ListCount ' не обязательно а если записей много, то и вредно End Sub
[/vba] Да, и в ComboBox1 размер шрифта побольше сделайте, 16, к примеру...
так попробуйте [vba]
Код
Private Sub UserForm_Initialize() Sheets("База").Visible = True Dim iMassiv As Variant With Sheets("База") If .Cells(2, 3) <> "" Then iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value End If End With If IsArray(iMassiv) Then ComboBox1.List = iMassiv Else ComboBox1.Value = iMassiv 'если всего одна запись - выбора нет, End If ComboBox1.ListRows = ComboBox1.ListCount ' не обязательно а если записей много, то и вредно End Sub
[/vba] Да, и в ComboBox1 размер шрифта побольше сделайте, 16, к примеру...Michael_S
Сообщение отредактировал Michael_S - Суббота, 28.01.2017, 21:02
Michael_S, Спасибо, буду пробовать. Я докумекал и сделал вообще проще, немного изменив код кнопки: [vba]
Код
Private Sub CommandButton2_Click() Sheets("База").Visible = True Sheets("База").Activate UserForm1.Hide Sheets("На печать").Visible = True On Error Resume Next UserForm2.Show Sheets("На печать").Range("E33") = Sheets("База").Range("C3") Sheets("На печать").Activate On Error GoTo 0 End Sub
[/vba] ячейка С3 стала, т.к. добавил строку над таблицей для кнопки дополнительного возврата к вводу, ведь если форму 3 закрыть, то тогда вручную надо переходить к вводу В общем, спокойной ночи, спасибо за все и можно тему закрывать
Michael_S, Спасибо, буду пробовать. Я докумекал и сделал вообще проще, немного изменив код кнопки: [vba]
Код
Private Sub CommandButton2_Click() Sheets("База").Visible = True Sheets("База").Activate UserForm1.Hide Sheets("На печать").Visible = True On Error Resume Next UserForm2.Show Sheets("На печать").Range("E33") = Sheets("База").Range("C3") Sheets("На печать").Activate On Error GoTo 0 End Sub
[/vba] ячейка С3 стала, т.к. добавил строку над таблицей для кнопки дополнительного возврата к вводу, ведь если форму 3 закрыть, то тогда вручную надо переходить к вводу В общем, спокойной ночи, спасибо за все и можно тему закрыватьdixus
Сообщение отредактировал dixus - Суббота, 28.01.2017, 21:38