Страницы: 1
RSS
VBA. Заполнение ListBox с несколькими столбцами, на форме, массивом данных, Не разносятся по столбцам данные, если в массиве одна строка
 
Доброго всем времени суток!
Вчера столкнулся с таким феноменом.
При заполнении ListBox'а на форме массивом данных, при наличии в массиве только ОДНОЙ строки, данные по столбцам не раскидываются, а собираются в один столбец.
Из положения вышел при помощи 'костыля' с проверкой на количество строк и добавлением еще одной строки с пустыми значениями.
Проверить можно вкл/откл 'костыль' и выбрав Исполнитель: Шкурина, Квартал: IV
В чем причина? Где я туплю?
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
Как вариант, при транспонировании массива который имеет 1 индекс во второй мерности он (массив) преобразуется в одномерный поэтому и вставляется в столбик.
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал: он (массив) преобразуется в одномерный
Он не преобразуется в одномерный. Это видно в окне Locals
Согласие есть продукт при полном непротивлении сторон
 
Преобразует во время
Код
Me.ListBox1.List = Application.Transpose(arrList)
т.е. похоже что при данной операции в ListBox падает уже одномерный массив.
"Все гениальное просто, а все простое гениально!!!"
 
Хм...действительно. Что это за недокументированная фишка такая
Изменено: Sanja - 25.07.2017 10:06:18
Согласие есть продукт при полном непротивлении сторон
 
Согласен с Nordheim - преобразует в одномерный. Если записать вот так:
Код
arrList=Application.Transpose(arrList)
Me.ListBox1.List = arrList
то можно увидеть это в Locals. Похоже, что это особенность операции Transpose (так же как и то, что массив начинается с 1-го элемента, а не с 0)

Отсюда вывод - тут надо либо в явном виде транспонировать:
Код
       Dim j, arrTmp()
        ReDim arrTmp(UBound(arrList, 2), 5)
        For j = 0 To UBound(arrList, 2)
            arrTmp(j, 0) = arrList(0, j)
            arrTmp(j, 1) = arrList(1, j)
            arrTmp(j, 2) = arrList(2, j)
            arrTmp(j, 3) = arrList(3, j)
            arrTmp(j, 4) = arrList(4, j)
            arrTmp(j, 5) = arrList(5, j)
        Next j
        Me.ListBox1.List = arrTmp
либо, если пустая строка не мешает - добавлять ее всегда:
Код
        '----костыль----
        ReDim Preserve arrList(5, UBound(arrList, 2) + 1)
        '---------------
а вот это изначально лишнее
Код
           For I = 0 To 5
                arrList(I, 1) = Empty
            Next
т.к. элементы и так пустыми добавляются
 
Цитата
webley написал:
Согласен с  Nordheim  - преобразует в одномерный
Я тоже с ним согласен. Но это не ответ на вопрос. ПОЧЕМУ так и ГДЕ это описано?
Цитата
webley написал: а вот это изначально лишнее
я знаю. Особой разницы в 'костылях' нет. Костыль он и есть костыль
Согласие есть продукт при полном непротивлении сторон
 
Я первый раз с таким сталкиваюсь, где описано не знаю :). Прогнал по F8 весь код и высказал предположение.
Изменено: Nordheim - 25.07.2017 10:18:04
"Все гениальное просто, а все простое гениально!!!"
 
Ладно, будем знать. Всем спасибо!
Согласие есть продукт при полном непротивлении сторон
Страницы: 1
Наверх