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

Удаление совпадающих записей в двух столбцах

08.02.2013, 11:26. Показов 1591. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. В excel необходимо сравнить два столбца и удалить совпадающие записи.
Пример:
1 2
2 1
1
1
1
1
2
3
3
В итоге должно в первом столбце остаться две тройки, а второй столбец мы не трогаем. Как это сделать?
Спасибо.
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2013, 11:26
Ответы с готовыми решениями:

Поиск и удаление совпадающих строк
В общем случай такой: Dim a& With Worksheets(2) For a = 1 To 26000 If .Cells(a, 1).Value...

Поиск совпадающих значений из двух таблиц
Здравствуйте форумчане :) У меня стоит задача: есть два файла excel, где имеются данные о людей:...

Сравнение двух столбцов с выведением списка совпадающих фамилий
Нужно сравнить стоб А со стобом С и вывести список фамилий которые совпадают в столб В. Прошу...

Поиск в двух столбцах
Добрый день. Задача такая: есть столбец А с номерами (условно) машин на странице Sheet1. Есть...

6
Заблокирован
08.02.2013, 11:46 2
Ничего не понял - по какой логике должно в первом столбце остаться две тройки?
0
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
08.02.2013, 13:46 3
Мне например логика понятна. Во втором столбце троек нет.
Но непонятно что значит "удалить" - очистить эти ячейки? удалить со сдвигом вверх (самое долгое...)? может отобрать оставшиеся значения в другой столбец?

Добавлено через 55 минут
Да, и неплохо бы уточнить - сколько строк нужно анализировать?
Что нужно - формулы или макрос? Можно ли столбцы сортировать? Приемлимо ли ручное удаление значений (например после того, как фомулами выявили нужные значения, отсортировали из в кучку)?

Потому что сейчас ответ может быть и такой - посмотрите какие номера присутствуют во втором столбце, выделите эти ячейки мышью и нажмите DEL
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37291 / 20725 / 4272
Регистрация: 12.02.2012
Сообщений: 34,111
Записей в блоге: 14
08.02.2013, 13:46 4
Цитата Сообщение от Hugo121 Посмотреть сообщение
удалить со сдвигом вверх (самое долгое...)?
- я бы загрузил содержимое обоих столбцов в массивы, а потом из первого массива удалил элементы, входящие во второй. Затем очистил бы первый столбец (это быстро) и вытряхнул бы в него оставшиеся в первом массиве элементы.
0
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
08.02.2013, 13:54 5
Я бы вытряхнул, не очищая
Но останутся дыры - но может дыры и нужны? Нам неведомо...
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,518
08.02.2013, 13:54 6
Код работает на активном Excel-листе со столбцами "A" и "B".
Для работы кода нужно в программе "VBA" подключить библиотеку: Tools - References... - Microsoft Scripting Runtime.
Кликните здесь для просмотра всего текста
Visual Basic
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
69
70
71
Sub Procedure_1()
    
    'Tools - References... Microsoft Scripting Runtime.
    Dim myDictionary As New Scripting.Dictionary
    
    Dim myArray_1() As Variant, myArray_2() As Variant
    Dim myLastRow As Variant
    Dim i As Long, j As Long
    
    '1. Определяем последнюю строку с данными в столбце "B".
        'Чтобы знать: со скольки строками работать.
    myLastRow = Columns("B").Find(What:="?", LookIn:=xlValues, LookAt:=xlPart, _
        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
        MatchCase:=False, SearchFormat:=False).Row
        
    '2. Быстрее работать с VBA-массивами, чем с Excel-ячейками.
        'Поэтому помещаем данные из Excel-листа в VBA-массив.
    myArray_1() = Range("B1:B" & myLastRow).Value
    
    '3. Для поиска одинаковых данных удобно и быстрее использовать
        'объект "Dictionary".
    'Помещам данные из массива "myArray_1" в объект "myDictionary".
    For i = 1 To UBound(myArray_1, 1) Step 1
        'Добавляем только уникальные данные.
        If myDictionary.Exists(Key:=myArray_1(i, 1)) = False Then
            'Item в данном случае не нужно, но этот параметр
            'обязательно нужно указать. Помещаем туда ноль.
            myDictionary.Add Key:=myArray_1(i, 1), Item:=0
        End If
    Next i
    
    'Берём с Excel-листа данные из столбца "A".
    
    '4. Определяем последнюю строку с данными в столбце "A".
    myLastRow = Columns("A").Find(What:="?", LookIn:=xlValues, LookAt:=xlPart, _
        SearchOrder:=xlByColumns, SearchDirection:=xlPrevious, _
        MatchCase:=False, SearchFormat:=False).Row
        
    '5. Помещаем данные из Excel-листа в VBA-массив.
    myArray_1() = Range("A1:A" & myLastRow).Value
    
    '6. Удаляю данные из массива "myArray_1" из элементов, 
        'которые есть в объекте "myDictionary".
    For i = 1 To UBound(myArray_1, 1) Step 1
        'Смотрю, есть ли элемент из массива "myArray_1"
            'в объекте "myDictionary".
        If myDictionary.Exists(Key:=myArray_1(i, 1)) = True Then
            'Если есть, то удаляю данные из элемента массива "myArray_1".
            myArray_1(i, 1) = Empty
        End If
    Next i
    
    '7. Переношу данные из массива "myArray_1" в массив "myArray_2",
        'чтобы потом сразу вставить данные на Excel-лист. Так
        'должно быстрее сработать.
    ReDim myArray_2(1 To UBound(myArray_1, 1), 1 To 1)
    
    For i = 1 To UBound(myArray_1, 1) Step 1
        'Если в элементе массива не пусто, то помещаю данные
            'в массив "myArray_2".
        If myArray_1(i, 1) <> Empty Then
            'С помощью переменной "j" переходим по массиву "myArray_2".
            j = j + 1
            myArray_2(j, 1) = myArray_1(i, 1)
        End If
    Next i
    
    '8. Вставляем данные в столбец "A".
    Range("A1:A" & myLastRow).Value = myArray_2()
    
End Sub
0
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
08.02.2013, 14:51 7
Такой вариант:
Visual Basic
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
Sub tt()
    Dim a(), i&, ii&, t
 
    'данные в массив
    a = [a1].CurrentRegion.Value
    'создаём словарь
    With CreateObject("Scripting.Dictionary")
        'цикл, данные второго столбца в словарь (значения, пустые пропускаем)
        For i = 1 To UBound(a)
            If Len(a(i, 2)) Then .Item(a(i, 2)) = 0&
        Next
 
        'перебор первого столбца массива
        For i = 1 To UBound(a)
            t = a(i, 1)
            If Len(t) Then
                'если нет в словаре - перекладываем наверх
                If Not .exists(t) Then
                    a(i, 1) = Empty
                    ii = ii + 1
                    a(ii, 1) = t
                Else
                    'если есть - просто стираем
                    a(i, 1) = Empty
                End If
            End If
        Next
 
    End With
 
    'выгружаем назад изменённый первый столбец
    [a1].CurrentRegion.Columns(1).Value = a
End Sub
0
08.02.2013, 14:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.02.2013, 14:51
Помогаю со студенческими работами здесь

Проверка совпадений в двух столбцах
Sub Poisk() For a = 1 To 5 i = Cells(1, 5) m = Cells(a, 1) If i = m Then Cells(a, 2).Select...

Сравнение значений в двух столбцах
Доброго времени суток! Помогите пожалуйста написать макрос для такой задачи: * следует...

Удаление строки, если она пуста во всех столбцах
Помогите пожалуйта написать макрос на удаление строки, если эта строка будет пуста во всех столбца,...

Поиск одинаковых чисел в двух столбцах
Excel Доброго времени суток, форумчане! Извините что напрягаю, но вот в чем загвоздка:...


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

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