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

Вход

Регистрация

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

 

= Мир MS Excel/Автопополнение динамического списка ListBox данными ячеек - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Автопополнение динамического списка ListBox данными ячеек
dixus Дата: Пятница, 27.01.2017, 21:52 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
Здравствуйте всем! Есть такая заморочка. Сделал файл с динамическим listbox. После кнопки записи в базу создается на листе-базе строка с данными. С первой формы далее по кнопке на печать открывается форма с выбором ФИО сотрудника, данные которого надо распечатать. Пока строка одна на листе-базе, все корректно работает, но если начинать добавлять новые записи-строки, то ФИО следующих сотрудников в форме в листбоксе не появляются, видит только первого введенного. Если все формы закрыть крестиком вручную, потом с листа ввода открыть первую форму, с нее открыть форму с листбоксом, то тогда все ранее введенные сотрудники отображаются в окне выбора листбокса. С листбоксом еще не работал (с динамическим пополнением), прочитал некоторый материал, но ничего не понял, почему так получается. Прошу Вашего совета.
К сообщению приложен файл: 8687983.xlsm (96.2 Kb)


Сообщение отредактировал dixus - Пятница, 27.01.2017, 21:52
 
Ответить
СообщениеЗдравствуйте всем! Есть такая заморочка. Сделал файл с динамическим listbox. После кнопки записи в базу создается на листе-базе строка с данными. С первой формы далее по кнопке на печать открывается форма с выбором ФИО сотрудника, данные которого надо распечатать. Пока строка одна на листе-базе, все корректно работает, но если начинать добавлять новые записи-строки, то ФИО следующих сотрудников в форме в листбоксе не появляются, видит только первого введенного. Если все формы закрыть крестиком вручную, потом с листа ввода открыть первую форму, с нее открыть форму с листбоксом, то тогда все ранее введенные сотрудники отображаются в окне выбора листбокса. С листбоксом еще не работал (с динамическим пополнением), прочитал некоторый материал, но ничего не понял, почему так получается. Прошу Вашего совета.

Автор - dixus
Дата добавления - 27.01.2017 в 21:52
Michael_S Дата: Пятница, 27.01.2017, 23:32 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
[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]


Сообщение отредактировал Michael_S - Пятница, 27.01.2017, 23:33
 
Ответить
Сообщение[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]

Автор - Michael_S
Дата добавления - 27.01.2017 в 23:32
dixus Дата: Суббота, 28.01.2017, 13:28 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
Michael_S, эта часть кода [vba]
Код
iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba] выбирает только 2 и 3 ячейку, и не включает 4 и далее строчки, если они не пустые. То код, что был у меня в примере, делал это, но только если закрыть вручную все формы и потом открывать их снова. Кроме того, по кнопке 2 на первой форме лист База не скрывается, и потому часть кода [vba]
Код
Sheets("База").Visible = True
[/vba] вызывает ошибку при вызове формы 2 с листбоксом. Когда я эту строчку кода убрал, вызов формы перестал давать ошибку, но по-прежнему листбокс видит только 2 первые заполненные ячейки


Сообщение отредактировал dixus - Суббота, 28.01.2017, 13:30
 
Ответить
СообщениеMichael_S, эта часть кода [vba]
Код
iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba] выбирает только 2 и 3 ячейку, и не включает 4 и далее строчки, если они не пустые. То код, что был у меня в примере, делал это, но только если закрыть вручную все формы и потом открывать их снова. Кроме того, по кнопке 2 на первой форме лист База не скрывается, и потому часть кода [vba]
Код
Sheets("База").Visible = True
[/vba] вызывает ошибку при вызове формы 2 с листбоксом. Когда я эту строчку кода убрал, вызов формы перестал давать ошибку, но по-прежнему листбокс видит только 2 первые заполненные ячейки

Автор - dixus
Дата добавления - 28.01.2017 в 13:28
Michael_S Дата: Суббота, 28.01.2017, 14:58 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Эта часть кода выбирает все непустые ячейки столбца "С", начиная со второй строки. Просто в ваш листбокс помещается всего одна строка по высоте.
Ваш код создает массив в 1499 строк, заполненных "" (String нулевой длины), в случае, если столбец "С" пустой.
А что бы листбокс обновлялся, код выше надо перенести на событие активации Userform? либо строчку [vba]
Код
UserForm2.Hide
[/vba]заменить на[vba]
Код
Unload  Me
[/vba]
И вообще, в данной форме лучше использовать ComboBox
К сообщению приложен файл: dixus.xlsm (89.0 Kb)
 
Ответить
СообщениеЭта часть кода выбирает все непустые ячейки столбца "С", начиная со второй строки. Просто в ваш листбокс помещается всего одна строка по высоте.
Ваш код создает массив в 1499 строк, заполненных "" (String нулевой длины), в случае, если столбец "С" пустой.
А что бы листбокс обновлялся, код выше надо перенести на событие активации Userform? либо строчку [vba]
Код
UserForm2.Hide
[/vba]заменить на[vba]
Код
Unload  Me
[/vba]
И вообще, в данной форме лучше использовать ComboBox

Автор - Michael_S
Дата добавления - 28.01.2017 в 14:58
dixus Дата: Суббота, 28.01.2017, 16:40 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
Michael_S, Разъяснили дураку. Спасибо, буду пробовать. Просто в Вашем коде в листбоксе не появляется выбор значения, чтобы перемещаясь по строчкам окна листбокса, можно было выбрать нужный. А насчет замены тоже думал, но в силу малого опыта не догадался, что просто скрытие формы - это не то, и нужно выгружать из памяти. Получается, если я скрывал кнопкой форму, она не цепляла обновленный диапазон по столбцу С, а когда закрывал форму крестиком в углу, то форма выгружалась из памяти, и когда снова открыть форму, то листбокс обновлялся? Снег во дворе дочищу, попробую. А в чем вообще разница между комбобоксом и листбоксом? Захотелось освоить немного листбокс, раньше до него еще не добирался
 
Ответить
СообщениеMichael_S, Разъяснили дураку. Спасибо, буду пробовать. Просто в Вашем коде в листбоксе не появляется выбор значения, чтобы перемещаясь по строчкам окна листбокса, можно было выбрать нужный. А насчет замены тоже думал, но в силу малого опыта не догадался, что просто скрытие формы - это не то, и нужно выгружать из памяти. Получается, если я скрывал кнопкой форму, она не цепляла обновленный диапазон по столбцу С, а когда закрывал форму крестиком в углу, то форма выгружалась из памяти, и когда снова открыть форму, то листбокс обновлялся? Снег во дворе дочищу, попробую. А в чем вообще разница между комбобоксом и листбоксом? Захотелось освоить немного листбокс, раньше до него еще не добирался

Автор - dixus
Дата добавления - 28.01.2017 в 16:40
dixus Дата: Суббота, 28.01.2017, 18:36 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
Извините, попробовал, теперь получается как планировалось, только часто выскакивает ошибка при срабатывании кнопки 2 на форме 1, не вызывается форма 2. При запуске файла открывается форма 1, заносишь данные, вроде работает форма 2. Потом если через крестик закроешь, то постоянно при следующем вызове формы 2 выдает ошибку в коде кнопки 2 на форме 1 строчку кода [vba]
Код
UserForm2.Show
[/vba] считает ошибкой. Порой сразу при открытии файла после записи в базу нажимаешь кнопку 2 для вызова формы 2, а вылазит ошибка, вышеописанная. Не пойму, в чем такая вариативность
К сообщению приложен файл: 4299022.xlsm (95.1 Kb)


Сообщение отредактировал dixus - Суббота, 28.01.2017, 18:40
 
Ответить
СообщениеИзвините, попробовал, теперь получается как планировалось, только часто выскакивает ошибка при срабатывании кнопки 2 на форме 1, не вызывается форма 2. При запуске файла открывается форма 1, заносишь данные, вроде работает форма 2. Потом если через крестик закроешь, то постоянно при следующем вызове формы 2 выдает ошибку в коде кнопки 2 на форме 1 строчку кода [vba]
Код
UserForm2.Show
[/vba] считает ошибкой. Порой сразу при открытии файла после записи в базу нажимаешь кнопку 2 для вызова формы 2, а вылазит ошибка, вышеописанная. Не пойму, в чем такая вариативность

Автор - dixus
Дата добавления - 28.01.2017 в 18:36
dixus Дата: Суббота, 28.01.2017, 20:09 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
Все, я понял, почему так работает. Если в базе запись всего одна, то строчка кода
[vba]
Код
iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba] почему-то некорректно видит диапазон по 3 столбцу, считает, что там пусто и выдает ошибку.
Я поправил так:
[vba]
Код
iMassiv = .Range(.Cells(1, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba]
Теперь ошибки не выдает, но выводит название столбца в окошке на первом месте. В принципе, не суть важно, но хотелось бы без этого лишнего.
Хотя можно запретить выводить на печать, если в базе всего один сотрудник. Видимо, в этом и смысл - если нет массива, а это минимум 2 значения, то будет ошибка


Сообщение отредактировал dixus - Суббота, 28.01.2017, 20:23
 
Ответить
СообщениеВсе, я понял, почему так работает. Если в базе запись всего одна, то строчка кода
[vba]
Код
iMassiv = .Range(.Cells(2, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba] почему-то некорректно видит диапазон по 3 столбцу, считает, что там пусто и выдает ошибку.
Я поправил так:
[vba]
Код
iMassiv = .Range(.Cells(1, 3), .Cells(Rows.Count, 3).End(xlUp)).Value
[/vba]
Теперь ошибки не выдает, но выводит название столбца в окошке на первом месте. В принципе, не суть важно, но хотелось бы без этого лишнего.
Хотя можно запретить выводить на печать, если в базе всего один сотрудник. Видимо, в этом и смысл - если нет массива, а это минимум 2 значения, то будет ошибка

Автор - dixus
Дата добавления - 28.01.2017 в 20:09
Michael_S Дата: Суббота, 28.01.2017, 20:59 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
так попробуйте
[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 - Суббота, 28.01.2017, 21:02
 
Ответить
Сообщениетак попробуйте
[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
Дата добавления - 28.01.2017 в 20:59
dixus Дата: Суббота, 28.01.2017, 21:36 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 27
Репутация: 1 ±
Замечаний: 20% ±

Excel 2010
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 - Суббота, 28.01.2017, 21:38
 
Ответить
Сообщение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
Дата добавления - 28.01.2017 в 21:36
  • Страница 1 из 1
  • 1
Поиск:

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