Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/211: Рейтинг темы: голосов - 211, средняя оценка - 4.90
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
1

Как работать в ListBox с несколькими столбцами

28.03.2012, 12:05. Показов 38769. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть ListBox с 4 столбцами (ColumnCount = 4)
Есть 4 массива данных: элементу 1 первого массива соответствует элемент 1 второго, третьего и четвертого массивов. AddItem в ListBox нужно делать так, чтобы соответствующие элементы располагались в ListBox в строчку.
Еще один момент: возможно ли в верхней строке листбокса организовать заголовки столбцов? или поместить перый элемент в поля заголовков
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.03.2012, 12:05
Ответы с готовыми решениями:

ListBox с несколькими столбцами
Здравствуйте! Помогите, пожалуйста, найти решение… Заполняю шаблон заявки из формы. Использую...

Поправить макрос, чтобы он мог работать не только с одним, но и с несколькими столбцами
Sub EditColumn() .Replace "ср!$EW$13", "ср!$EW$14" End Sub Данный макрос заменяет нужное...

Сортировка по алфавиту таблицы с несколькими столбцами
Здравствуйте форумчане, осваиваю VBA в Excel Имеется таблица, прикрепленный файл пример.xls Нужно...

Макрос на создание сводной таблицы с несколькими столбцами
добрый вечер! имеется таблица, из которой нужно сделать сводную с несколькими столбцами. на...

12
735 / 203 / 11
Регистрация: 23.06.2011
Сообщений: 440
28.03.2012, 12:29 2
Цитата Сообщение от AndreA SN Посмотреть сообщение
Есть 4 массива данных: элементу 1 первого массива соответствует элемент 1 второго, третьего и четвертого массивов. AddItem в ListBox нужно делать так, чтобы соответствующие элементы располагались в ListBox в строчку.
Visual Basic
1
2
3
4
5
6
7
8
9
    With UserForm1.ListBox1
        For i = 0 To UBound(Array1)
            .AddItem
            .Column(0, i) = Array1(i)
            .Column(1, i) = Array2(i)
            .Column(2, i) = Array3(i)
            .Column(3, i) = Array4(i)
        Next i
    End With

Цитата Сообщение от AndreA SN Посмотреть сообщение
Еще один момент: возможно ли в верхней строке листбокса организовать заголовки столбцов? или поместить перый элемент в поля заголовков
Насколько я изучал этот вопрос - нет. Я использую в качестве заголовков обычные TextBox-ы.
3
Заблокирован
28.03.2012, 12:32 3
Visual Basic
1
2
3
4
5
6
For i = LBound(a1) To UBound(a1)
  ListBox1.AddItem a1(i)
  ListBox1.List(ListBox1.ListCount - 1, 1) = a2(i)
  ListBox1.List(ListBox1.ListCount - 1, 2) = a3(i)
  ListBox1.List(ListBox1.ListCount - 1, 3) = a4(i)
Next
Цитата Сообщение от AndreA SN Посмотреть сообщение
элементу 1 первого массива соответствует элемент 1 второго, третьего и четвертого массивов.
Проще сделать двумерный массив. Тогда и листбокс можно будет одной строчкой кода заполнить.
1
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
28.03.2012, 13:12  [ТС] 4
пр двумерный массив думал. там действительно одна строчка кода нужна типа
Visual Basic
1
Me.ListBox5.List() = spisok()
Но проблема заключается в использовании динамического массива.
У меня данные располагаются в строках, количество которых меняется. Количество столбцов не меняется (4). Правила объявления динамического массива и последующего использования Preserve требуют, чтоб массив объявлялся как mass(столбцы,строки), где число строк - изменяемое, а число столбцов - нет.
А использование list подразмевает положение mass(строки, столбцы)
Может я просто не совсем понимаю, как организовать тут работу?

Добавлено через 9 минут
Побовал оба варианта. Сверху остается пустая строка в ListBox. В чём может быть причина? Заголовки в ListBox отключены
0
Заблокирован
28.03.2012, 13:40 5
Цитата Сообщение от AndreA SN Посмотреть сообщение
Сверху остается пустая строка в ListBox. В чём может быть причина?
Причина наверняка в том, что нижняя граница массивов по умолчанию равна нулю, а заполняли вы их с единицы, т.е. фактически - со второго элемента массива.
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
28.03.2012, 14:12  [ТС] 6
Апострофф))) спасибо за оплеуху по моему самомнению))))
ноль в массиве - это для меня привычно, можно сказать по-домашнему уютно)))
НО! Может кто-то также влипнет. Перепутал местами строки присвоения значения и увеличения динамического массива на 1.
Было
Visual Basic
1
2
3
            
ReDim Preserve NN(UBound(NN) + 1)
NN(UBound(NN)) = j
а должно было быть
Visual Basic
1
2
NN(UBound(NN)) = j
ReDim Preserve NN(UBound(NN) + 1)
В результате действительно элементы массива начинались с 1, а в 0 - было пусто. Куда высылать пару пива?))))
0
Заблокирован
28.03.2012, 15:43 7
Цитата Сообщение от AndreA SN Посмотреть сообщение
а должно было быть
Visual Basic
1
2
NN(UBound(NN)) = j
ReDim Preserve NN(UBound(NN) + 1)
Таким образом мы развернули грабли на 180г, но не вокруг черенка (зубья всё равно наверху)
Теперь пустая строка будет внизу списка.

Проще завести глобальный счётчик типа
Visual Basic
1
public NN_Count as long
и
Visual Basic
1
2
3
ReDim Preserve NN(NN_Count)
NN(NN_Count) = j
NN_Count=NN_Count+1
1
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
28.03.2012, 17:27  [ТС] 8
Я по другому сделал. Чтоб не париться с глобальным счетчиком - я просто проверяю - не является ли элемент первым в списке. Если не является - то перед добавкой нового элемента увеличиваем массив на 1
Visual Basic
1
2
3
4
If Klih(0) <> Empty Then
    ReDim Preserve Klih(UBound(Klih) + 1)
End If
Klih(UBound(Klih)) = Elem
В результате ушел от счетчиков вообще))) и всю логику сохранил в одном месте
0
Заблокирован
28.03.2012, 18:38 9
Visual Basic
1
2
3
4
5
6
7
8
9
10
Option Explicit
 
Dim Klih()
 
Sub AddKlih()
If Klih(0) <> Empty Then
  ReDim Preserve Klih(UBound(Klih) + 1)
End If
Klih(UBound(Klih)) = 1 'Elem
End Sub
О_о Error 9 Недопустимый индекс. Т.е. Вы что-то недоговариваете и не всё так просто...

А ещё можно у Гугла спросить - Размерность динамического не инициализированного массива - первая ссылка.
1
Эксперт WindowsАвтор FAQ
18007 / 7708 / 892
Регистрация: 25.12.2011
Сообщений: 11,481
Записей в блоге: 16
28.03.2012, 23:23 10
Именно. Поэтому берем и сразу после объявления инициализируем:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Dim Klih()
 
Sub AddKlih()
Redim Klih(0)
If Klih(0) <> Empty Then
  ReDim Preserve Klih(UBound(Klih) + 1)
End If
Klih(UBound(Klih)) = 1 'Elem
End Sub
Добавлено через 12 минут
...понятно, значит вопрос в том, чтобы как раз не инициализировать?

Добавлено через 8 минут
Тогда вот я одному студенту впаял - инициализация двухмерного массива внутри цикла на основе преобразования типов:
На том сайте, что ты давал, кстати, до такого не додумались (правда здесь тип можно только Variant и Вариант - не совсем массив .
0
1019 / 123 / 2
Регистрация: 26.08.2011
Сообщений: 1,190
Записей в блоге: 2
29.03.2012, 00:24  [ТС] 11
Апострофф, я тоже инициализировал массив раньше приведенного мной кода
Diskretor всю мою логику полностью здесь повторил.
Я извиняюсь, что всё кучей не публикнул - мусора навалом рядышком накидано с этим кодом. Вот я и забыл о том, что инициализировал массив ранее. За сегодня уже раз 50 прогнал код - ошибок не возникало
0
Заблокирован
29.03.2012, 09:22 12
Цитата Сообщение от AndreA SN Посмотреть сообщение
Чтоб не париться с глобальным счетчиком - я просто проверяю - не является ли элемент первым в списке. Если не является - то перед добавкой нового элемента увеличиваем массив на 1
Мне кажется, проще один раз попариться с объявлением глобального счётчика, чем потом всю дорогу плясать с бубнами вокруг If Klih(0) <> Empty.
А если по логике программы некоторые элементы массива могут пустыми?
Новый велосипед изобретать будем

Наглядный пример -
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Option Explicit
Dim a() As Byte
 
Sub qqq()
ReDim a(0)
Dim I As Byte
For I = 0 To 9
  If a(0) <> Empty Then
    ReDim Preserve a(UBound(a) + 1)
  End If
  a(UBound(a)) = I
Next I
End Sub
Куда же ноль пропал?
1
11517 / 3803 / 681
Регистрация: 13.02.2009
Сообщений: 11,221
29.03.2012, 14:25 13
Я бы сделал уточнение: В вопросе не указано где этот VBA.
Недавно убил целый день на решение аналогичной задачи в Access.
Там в список добавить значения по колонкам метод, предложенный Апострофф, не работает.
Долго искал. Может кому ещё понадобится:
Visual Basic
1
2
3
4
5
6
7
Private Sub Form_Open(Cancel As Integer)
    Dim R, C, N
    For R = 1 To 10
    N = N + 1
          Form_Форма1.ListBox1.AddItem N & ";" & N + 1 & ";" & N + 2 & ";" & N + 3 & ";" & N + 4
    Next R
End Sub
1
29.03.2012, 14:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2012, 14:25
Помогаю со студенческими работами здесь

Как одновременно работать с несколькими несмежными строками в Excel
Надо одновременно применить скрытие строк к нескольким несмежными строкам. Строк может быть много....

Отчет с несколькими столбцами
Здравствуйте! У меня не получилось создать отчет с несколькими столбцами. Нужно сделать так же как...

Таблица с несколькими столбцами
Всем привет! Ребят, нужна таблица для финансовой сферы, то есть столбцы для ФИО, для разных...

Комбобокс с несколькими столбцами
Здравствуйте! Есть БД на MSSQL. Подключил БД к программе без проблем. Программа может отрабатывать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru