powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить список из ListBox со списком в Excel
11 сообщений из 11, страница 1 из 1
Сравнить список из ListBox со списком в Excel
    #38972057
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня!

Задача - выводить на userform в ListBox1 только те значения который он не найдет в диапазоне ячеек на листе в Excel.
Таким образом в ListBox1 остаются только те значения, которых нету в ListBox2. А в listbox2 отображается все то что есть в списке Excel.

Я что-то реально туплю и не могу сообразить, как бы это написать. Как сравнить списки?

Потом нужно продумать, как сохраняя общий порядок каналов из ListBox1 заполнять ListBox 2, перенося в него значения из Listbox1

То что имею на данный момент:
Код: 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.
Private Sub UserForm_Initialize()
With ListBox1
        .AddItem "Первый (ВИ)"
        .AddItem "Россия 1   (ВИ)"
        .AddItem "РЕН ТВ(ВИ)"
        .AddItem "ТВ3 (ВИ)"
        .AddItem "Россия 2   (ВИ)"
        .AddItem "Ю (ВИ)"
        .AddItem "Пятница (ВИ)"
        .AddItem "2 x2 (ВИ)"
        .AddItem "Пятый канал(ВИ)"
        .AddItem "Disney (ВИ)"
        .AddItem "ТВ Центр(ВИ)"
        .AddItem "Звезда (ВИ)"
        .AddItem "Карусель (ВИ)"
End With

With ListBox2 ' Выводим на ллистбок каналы которых есть в плане
    '.ColumnHeads = True
    .RowSource = Range(Cells(12, 4), Cells(31, 4)).Address ' < тут, тот же список по каналам, как и в listbox1, только в ячейках Excel
    .MultiSelect = fmMultiSelectSingle
    '.TextColumn = 1
    '.BoundColumn = 0
End With
    
    
End Sub



Я прикрепляю файл, для удобства понимания задачи. Там оставил основное, список каналов, к которым я должен добавить то, чего не хватает, но это есть в ListBox1
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38972375
Фотография alex77755
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При таком назначении списка значений сделать это будет невозможно
Для списка 2 нужно назначать не ссылку на источник строк, а непосредственно список
Код: vbnet
1.
    .List = Range(Cells(12, 4), Cells(Range("D12").End(xlDown).Row, 4)).Value
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38973130
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex77755,

Я кое что смог сделать. Я завел два массива, на каждый список свой.
Однако у меня очень забавная история получается, у меня по проверки через MsgBox занесенных данных в массив перечисляются правильные значения, а в итоговым списке (ListBox2), выдаются немного измененные значения.
По окончанию объявления MsgBox можно будет увидеть, что в списке Listbox2 отсутствую каналы (Россия 24, НТВ, ТНТ, СТС-Лов, перц). Куда они могли пропасть?
Прикрепляю файл для того что бы можно было самому наглядно это увидеть.
Я честно не очень понимаю с чем такое может быть связано...
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38973151
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxi,

Все, я разобрался.
Просто в Lisbox2 стоял не тот массив :-) ыть..
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38973448
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запаролся... :(

Помогите составить такое условие, имея два массива, которые нужно друг с другом сравнить. И если в одном массиве, нету некоторых значений, то выдать в listbox1 каких именно значений он не нашел.

Иным словом, в первом списке мы имеем Первый, Россия 1, НТВ. И сравниваем его со вторым списком, где есть Первый, Россия 1. То listBox1 нам должен отразить только НТВ. А ListBox2 тем временем выдаст Первый, Россия 1

Я прикрепляю файл.

Весь код, выглядит так:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
Option Explicit
Dim j, p, NumRow, NumCol, iRow, iCol As Integer
'Dim a As Range, c As Range
Dim iArray(1 To 9) 'указываем размерность массива (5 элементов: от 1 до 5)
Dim yArray() 'объявляем массив. Размерность массива ниже в коде не указываем.
Dim y, i As Variant


Private Sub UserForm_Initialize()
'Заполняем массив (iArray)
iArray(1) = "Первый"
iArray(2) = "Россия 1"
iArray(3) = "РЕН ТВ"
iArray(4) = "ТВ3"
iArray(5) = "Россия 2"
iArray(6) = "Ю"
iArray(7) = "Пятница"
iArray(8) = "2x2"
iArray(9) = "Пятый канал"
'iArray(10) = "Disney (ВИ)"
'iArray(11) = "ТВ Центр(ВИ)"
'iArray(12) = "Звезда (ВИ)"
'iArray(13) = "Карусель (ВИ)"
'iArray(14) = "СТС (СТС)"
'iArray(15) = "Перец (СТС)"
'iArray(16) = "Домашний (СТС)"
'iArray(17) = "СТС Love(СТС)"
'iArray(18) = "ТНТ (ГПМ)"
'iArray(19) = "НТВ (ГПМ)"
'iArray(20) = "Россия 24"

'MsgBox "3-й элемент массива равен: " & iArray(3)
 

'заполняем диапазон для массива yArray.
NumRow = 0 ' счет по строкам
While Worksheets(1).Cells(12 + NumRow, 4).Value <> ""
    NumRow = NumRow + 1
Wend
   'MsgBox Worksheets(1).Cells(10 + NumRow, 4).Value
   
yArray = Range(Cells(12, 4), Cells(10 + NumRow, 4)).Value

With ListBox1 ' Выводим на ллистбокc каналы которых нет в плане
    For i = LBound(iArray) To UBound(iArray)
        For y = LBound(yArray) To UBound(yArray)
            'MsgBox yArray(y, 1) & " = " & iArray(i)
            If iArray(i) = yArray(y, 1) Then
                'MsgBox "равно " & iArray(i) & " = " & yArray(y, 1)
                Exit For
            ElseIf iArray(i) <> yArray(y, 1) Then
                .AddItem iArray(i)
                Exit For
            End If
        Next y
    Next i
End With
      
With ListBox2 ' Выводим на ллистбок каналы которых есть в плане
For y = LBound(yArray) To UBound(yArray) 'цикл от нижней границе массива до верхней границы массива
    'MsgBox y & "-й элемент массива равен: " & yArray(y, 1) 'y - строка, 1 - это столбец
    .AddItem yArray(y, 1)
Next y
End With

    
    
End Sub
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38973626
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxi, так?

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Private Sub UserForm_Initialize()
    'Заполняем массив (iArray)
    iArray(1) = "Первый"
    iArray(2) = "Россия 1"
    iArray(3) = "РЕН ТВ"
    iArray(4) = "ТВ3"
    iArray(5) = "Россия 2"
    iArray(6) = "Ю"
    iArray(7) = "Пятница"
    iArray(8) = "2x2"
    iArray(9) = "Пятый канал"
    'iArray(10) = "Disney (ВИ)"
    'iArray(11) = "ТВ Центр(ВИ)"
    'iArray(12) = "Звезда (ВИ)"
    'iArray(13) = "Карусель (ВИ)"
    'iArray(14) = "СТС (СТС)"
    'iArray(15) = "Перец (СТС)"
    'iArray(16) = "Домашний (СТС)"
    'iArray(17) = "СТС Love(СТС)"
    'iArray(18) = "ТНТ (ГПМ)"
    'iArray(19) = "НТВ (ГПМ)"
    'iArray(20) = "Россия 24"
    
    'MsgBox "3-й элемент массива равен: " & iArray(3)
     
    
    'заполняем диапазон для массива yArray.
    NumRow = 0 ' счет по строкам
    While Worksheets(1).Cells(12 + NumRow, 4).Value <> ""
        NumRow = NumRow + 1
    Wend
       'MsgBox Worksheets(1).Cells(10 + NumRow, 4).Value
       
    yArray = Range(Cells(12, 4), Cells(10 + NumRow, 4)).Value
    
    Dim sChannelBuffer As String
    Dim bChannelFound As Boolean
    
    With ListBox1 ' Выводим на ллистбокc каналы которых нет в плане
        For i = LBound(iArray) To UBound(iArray)
            sChannelBuffer = iArray(i)
            bChannelFound = False
            
            For y = LBound(yArray) To UBound(yArray)
                If yArray(y, 1) = sChannelBuffer Then
                    bChannelFound = True
                    Exit For
                End If
            Next
            
            If Not bChannelFound Then .AddItem iArray(i)
        Next
    End With
          
    With ListBox2 ' Выводим на ллистбок каналы которых есть в плане
        For y = LBound(yArray) To UBound(yArray) 'цикл от нижней границе массива до верхней границы массива
            'MsgBox y & "-й элемент массива равен: " & yArray(y, 1) 'y - строка, 1 - это столбец
            .AddItem yArray(y, 1)
        Next y
    End With
End Sub
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38974040
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Да, это то что нужно.
Я правильно понял как, это работает?
Когда мы в данном цикле, находим совпадение, мы выходим из цикла.
Код: vbnet
1.
2.
3.
4.
5.
6.
            For y = LBound(yArray) To UBound(yArray)
                If yArray(y, 1) = sChannelBuffer Then
                    bChannelFound = True
                    Exit For
                End If
            Next



Выйдя из цикла, у нас включается bChannelFound = true и таким образом срабатывает условие и мы заносим найденное из массива значение.

Код: vbnet
1.
If Not bChannelFound Then .AddItem iArray(i)
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38974071
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxi, грубо так:

1) Берём элемент из первого списка, флажок ставим в выключенное состояние
2) Сравниваем его с каждым элементом из второго списка
3) Если нашли совпадение, поднимаем флажок , и выходим из внутреннего цикла (дальше нет смысла проверять)
4) Далее выходим из внутреннего цикла (Все элементы обошли или вышли досрочно)
5) Сраниваем был ли поднят флажок, а он может быть поднят, только если во втором списке было найдено совпадение, и если он не поднят , а равно элемент из первого списка отсутствует во втором списке, то добавляем этот элемент "туда-то"
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38974073
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6) Далее берём следующий элемент из первого списка, флажок ставим в выключенное состояние и на пункт 2.

Всё
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38974081
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

И еще возник в последствии такой вопрос.
Если я обладаю номером массива iArray. То соответственно я могу использовать номер нужного мне элемента в массиве, так что бы сохранить порядок и добавить недостающий мне канал из ListBox1 в LisBox2.
К примеру:
в listbox1 у меня есть значение (3)
В listbox2 у меня есть значения (1,2,4)

Моя задача, добавить в ListBox2 значение 3, сохранив порядок 1,2,3,4. То есть, зная что 3 > чем 1, 2 но меньше 4. Значит встать оно должно между 2 и 4.
Как то так.

Я просто со списками ListBox1 очень мало имел дело. Материал который я нашел интернете не помог мне разобраться. Но продолжаю разобраться и в данный момент, может что-то успею понять разобрать, до того как будет ответ тут.
А пока высылаю то что имею: (данный код это продолжение того кода, что ранее уже публиковался в данной теме)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
If ListBox1.ListCount > 0 Then
    For i = LBound(iArray) To UBound(iArray)
     If ListBox1.Text = iArray(i) Then
        'MsgBox iArray(i)
        'MsgBox i
        MsgBox ListBox1.ListIndex
        ListBox2.ListIndex = i 
        AddItem ListBox1.Text
        ListBox2.AddItem ListBox1.Text
        ListBox1.RemoveItem ListBox1.ListIndex
    End If
    Next
End If
...
Рейтинг: 0 / 0
Сравнить список из ListBox со списком в Excel
    #38974231
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLAD,

Спасибо. С этим разобрался) Теперь я знаю немного больше.)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить список из ListBox со списком в Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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