powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Заполнение ListBox`а из массива циклом
2 сообщений из 2, страница 1 из 1
Заполнение ListBox`а из массива циклом
    #39601641
AndreyRZD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые друзья доброго дня.
Столкнулся с следующей ситуацией - пытаюсь заполнить ListBox в форме EXCEL. Дело шло отлично до того момента, пока не потребовалось заполнять ListBox из массива который в свою очередь получает данные из SQL запроса перебираемого в цикле. Проблема в том, что каждая новая итерация затирает предыдущие значение в форме и выводит только данные полученные последней итерацией.
Суть вопроса - как выводить данные накопительно? Не обнуляя при каждой итерации прежние значения ListBox?
Заранее благодарен за ответы.

Текущее положение дел (LBHistory - это тот самый ListBox):
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Dim Form As HistoryFRM, ARR(), i,  ArrHistory()
.....
'открываем форму истории
Set Form = New HistoryFRM
With Form
    .Show vbModeless
    .LBHistory.ColumnCount = 6
    For i = 0 To UBound(ARR)
        ArrHistory = SQL_Editor("SELECT * FROM [Учёт изменений] WHERE [ID]='" & ARR(i) & "';")
        .LBHistory.Column = ArrHistory
    Next i

End With
...
Рейтинг: 0 / 0
Заполнение ListBox`а из массива циклом
    #39602243
AndreyRZD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Немного опишу как удалось решить данную проблему.
Выхода из сложившейся ситуации нашлось два. Вкратце о каждом:
1. Данное решение пришло от специалистов с англоязычного ресурса, более известного как "Переполнение стека". Ссылка на мой вопрос ниже:
https://stackoverflow.com/questions/48788698/appending-new-positions-to-a-form-listbox/48789801#48789801
Для тех кто не рубит в импортном, немного поясню суть предложений забугорных специалистов (кстати отдельное им спасибо за работающий вариант). Сама проблема связана с тем, что методы List и Count затирают информацию в ListBox пришедшую ранее и оставляют информацию только от последней итерации, поэтому для добавления новой информации необходимо пользоваться методом AddItem (что на мой взгляд не очень удобно). Поэтому речь пошла о перестройке работы алгоритма программы в таком ключе при котором к моменту заполнения ListBox информация уже была целиком совмещена.

Сперва было предложено поступить следующим образом -
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Option Explicit


    Dim Form As HistoryFRM, ARR() As Variant, ArrHistory() As Variant
    Dim i As Long, j As Long
    ....
    Set Form = New HistoryFRM
    With Form
        .Show vbModeless
        With .LBHistory
            .ColumnCount = 6
            For i = 0 To UBound(ARR)
                ArrHistory = SQL_Editor("SELECT * FROM [Table] WHERE [ID]='" & ARR(i) & "';")
                For j = LBound(ArrHistory) To UBound(ArrHistory)
                    .AddItem ArrHistory(j)
                Next
            Next
        End With
    End With


Данный метод работает, но не в моём случае так как при запросе в базу данных из рекордсета прилетает не одномерный массив... Разумеется, что система начала ругаться на строку (.AddItem ArrHistory(j)) и от указанного метода пришлось отказаться. Однако к моему удовольствию вскоре поступил следующий вариант который лишён вышеуказанного недостатка -
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Dim arr()
Dim lb As ListBox
Dim numCols As Long
Dim rowCount As Long, colCount As Long
Dim numNewRecs As Long, newRecCount As Long

Set lb = Me.ListBox1
'You need to know how many new records are coming in
'Substitute this determination here:
numNewRecs = 2
numCols = lb.ColumnCount - 1

'Dimension the array for the current list plus the new records
ReDim arr(lb.ListCount - 1 + numNewRecs, numCols)
'Get the current list
For rowCount = 0 To lb.ListCount - 1
    For colCount = 0 To numCols
        arr(rowCount, colCount) = lb.List(rowCount, colCount)
    Next
Next
'Append the new records
For newRecCount = rowCount To rowCount + numNewRecs - 1
    For colCount = 0 To numCols
        arr(newRecCount, colCount) = "New data" & CStr(newRecCount)
    Next
Next
'Populate the ListBox
lb.List = arr()



Суть метода сводится к заполнению отдельно созданного массива старыми значениями (от предыдущих итераций) + добавление новых строк и последующему их выводу в ListBox. Это немного громоздкое решение, но при должном допиле метод работает.

2.Решение которое было применено как переходное у меня в системе.
Я зашёл с другой стороны и попробовал подредактировать SQL запрос к базе. Была создана текстовая переменная (ForSQL) которая впитала в себя все возможные [ID] в виде - (" '123' or ID = '234'...or ID = 'N' "), что позволило отказаться от цикла перезаписи ListBox`a и заполнять его уже готовой информацией из базы получив разом все данные из SQL запроса. Пока работает без сбоев, посмотрим как поведёт себя при больших объёмах информации.
Итого переписал строку в следующей редакции:
Было:
Код: vbnet
1.
2.
3.
4.
    For i = 0 To UBound(ARR)
        ArrHistory = SQL_Editor("SELECT * FROM [Учёт изменений] WHERE [ID]='" & ARR(i) & "';")
        .LBHistory.Column = ArrHistory
    Next i


Стало:
Код: vbnet
1.
2.
        ArrHistory = SQL_Editor("SELECT * FROM [Учёт изменений] WHERE [ID]= " & ForSQL & ";")
        If Not IsEmpty(ArrHistory) Then .LBHistory.Column = ArrHistory



Наполнение текстовой переменной () выглядит следующим образом
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
      Начало цикла перебора возможных вариантов 
 If i = 0 Then
            ForSQL = "'" & тут помещается значение ID & "'"
        Else
            ForSQL = ForSQL & " or [ID] = '" тут помещается значение ID & "'"
        End If
         Следующая итерация


Не трудно догадаться, что сделано через IF поскольку в запросе SQL - первое значение после WHERE отличается от последующих.


Как-то так. Если у кого-то есть еще идеи по оптимизации - прошу высказываться. Заранее благодарен!
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Заполнение ListBox`а из массива циклом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]