Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить список из ListBox со списком в Excel / 11 сообщений из 11, страница 1 из 1
29.05.2015, 17:14
    #38972057
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
Всем доброго дня!

Задача - выводить на 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
30.05.2015, 14:47
    #38972375
alex77755
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
При таком назначении списка значений сделать это будет невозможно
Для списка 2 нужно назначать не ссылку на источник строк, а непосредственно список
Код: vbnet
1.
    .List = Range(Cells(12, 4), Cells(Range("D12").End(xlDown).Row, 4)).Value
...
Рейтинг: 0 / 0
01.06.2015, 12:19
    #38973130
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
alex77755,

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

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

Помогите составить такое условие, имея два массива, которые нужно друг с другом сравнить. И если в одном массиве, нету некоторых значений, то выдать в 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
01.06.2015, 17:40
    #38973626
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
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
02.06.2015, 10:34
    #38974040
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
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
02.06.2015, 11:10
    #38974071
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
lopuxi, грубо так:

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

Всё
...
Рейтинг: 0 / 0
02.06.2015, 11:16
    #38974081
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
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
02.06.2015, 13:03
    #38974231
lopuxi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить список из ListBox со списком в Excel
VSVLAD,

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


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