Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Перебор и сравнение двух столбцов - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Перебор и сравнение двух столбцов (Макросы/Sub)
Перебор и сравнение двух столбцов
Raskat Дата: Среда, 23.08.2017, 08:20 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 9
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Коллеги, привет
Есть таблица примерно следующего вида:

А B C
1 Фамилия Дата начала Дата конца
2 Иванов 01.01.2017 31.07.2017
3 Сидоров 01.02.2017
4 Петров 08.03.2017 05.05.2017
5 Петров 06.05.2017

Нужен макрос, который просматривал бы столбец А и при нахождении дубликата фамилии сравнивал бы ячейки C4 и С5, и удалял строку с пустым значением (в данном случае это строка 5) или хотя бы заливал ее цветом.

От макросов я, к сожалению очень далек, подскажите хотя бы возможно ли это в принципе и в каком направлении двигаться.
К сообщению приложен файл: 5944193.xlsx (8.0 Kb)


Сообщение отредактировал Raskat - Среда, 23.08.2017, 08:55
 
Ответить
СообщениеКоллеги, привет
Есть таблица примерно следующего вида:

А B C
1 Фамилия Дата начала Дата конца
2 Иванов 01.01.2017 31.07.2017
3 Сидоров 01.02.2017
4 Петров 08.03.2017 05.05.2017
5 Петров 06.05.2017

Нужен макрос, который просматривал бы столбец А и при нахождении дубликата фамилии сравнивал бы ячейки C4 и С5, и удалял строку с пустым значением (в данном случае это строка 5) или хотя бы заливал ее цветом.

От макросов я, к сожалению очень далек, подскажите хотя бы возможно ли это в принципе и в каком направлении двигаться.

Автор - Raskat
Дата добавления - 23.08.2017 в 08:20
Pelena Дата: Среда, 23.08.2017, 08:34 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19176
Репутация: 4417 ±
Замечаний: ±

Excel 365 & Mac Excel
Здравствуйте.
Файл с примером приложите.
Условным форматированием подкрасить не вариант?


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
Файл с примером приложите.
Условным форматированием подкрасить не вариант?

Автор - Pelena
Дата добавления - 23.08.2017 в 08:34
_Boroda_ Дата: Среда, 23.08.2017, 09:10 | Сообщение № 3
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16674
Репутация: 6479 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
В Условное форматирование, как Лена выше сказала, формулу
Код
=(счётесли($A$2:$A$999;$A2)>1)*(B2="")
К сообщению приложен файл: 5944193_1.xlsx (8.2 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВ Условное форматирование, как Лена выше сказала, формулу
Код
=(счётесли($A$2:$A$999;$A2)>1)*(B2="")

Автор - _Boroda_
Дата добавления - 23.08.2017 в 09:10
sboy Дата: Среда, 23.08.2017, 09:32 | Сообщение № 4
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
Добрый день.
Нужен макрос

Вот такой вариант
[vba]
Код
Sub delete_()
For r = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
    If IsEmpty(Cells(r, 3)) Then
        If Not Range(Cells(r - 1, 1), Cells(2, 1)).Find(Cells(r, 1)) Is Nothing Then Rows(r).Delete
    End If
Next r
End Sub
[/vba]
К сообщению приложен файл: 5944193.xlsm (14.6 Kb)


Яндекс: 410016850021169
 
Ответить
СообщениеДобрый день.
Нужен макрос

Вот такой вариант
[vba]
Код
Sub delete_()
For r = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
    If IsEmpty(Cells(r, 3)) Then
        If Not Range(Cells(r - 1, 1), Cells(2, 1)).Find(Cells(r, 1)) Is Nothing Then Rows(r).Delete
    End If
Next r
End Sub
[/vba]

Автор - sboy
Дата добавления - 23.08.2017 в 09:32
Raskat Дата: Среда, 23.08.2017, 11:45 | Сообщение № 5
Группа: Пользователи
Ранг: Прохожий
Сообщений: 9
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
В Условное форматирование, как Лена выше сказала, формулу

Не соображу что то как это сделать. Приложил файл.

Вот такой вариант

Sub delete_()
For r = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
If IsEmpty(Cells(r, 3)) Then
If Not Range(Cells(r - 1, 1), Cells(2, 1)).Find(Cells(r, 1)) Is Nothing Then Rows®.Delete
End If
Next r
End Sub


Супер! Спасибо. А есть ли возможность сравнить данные по полям в этих строках.
Если быть более конкретным, то из дубликатов нужно оставить только строку, в которой "дата начала" наименьшая. Файл с примером приложил.
К сообщению приложен файл: .xlsx.xlsm (13.8 Kb)
 
Ответить
Сообщение
В Условное форматирование, как Лена выше сказала, формулу

Не соображу что то как это сделать. Приложил файл.

Вот такой вариант

Sub delete_()
For r = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
If IsEmpty(Cells(r, 3)) Then
If Not Range(Cells(r - 1, 1), Cells(2, 1)).Find(Cells(r, 1)) Is Nothing Then Rows®.Delete
End If
Next r
End Sub


Супер! Спасибо. А есть ли возможность сравнить данные по полям в этих строках.
Если быть более конкретным, то из дубликатов нужно оставить только строку, в которой "дата начала" наименьшая. Файл с примером приложил.

Автор - Raskat
Дата добавления - 23.08.2017 в 11:45
Raskat Дата: Четверг, 24.08.2017, 07:39 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 9
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Разобрался, задачу решил. sboy, огромное спасибо за помощь.
 
Ответить
СообщениеРазобрался, задачу решил. sboy, огромное спасибо за помощь.

Автор - Raskat
Дата добавления - 24.08.2017 в 07:39
sboy Дата: Четверг, 24.08.2017, 13:12 | Сообщение № 7
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
из дубликатов нужно оставить только строку, в которой "дата начала" наименьшая

Для такой задачи мое решение из сообщения№4 не подходит.
Вот другое (первый раз пишу код с использованием Словаря, немного коряво, но вроде правильно работает)
[vba]
Код
Sub delete_2()
Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = vbTextCompare
ilr = Cells(Rows.Count, 1).End(xlUp).Row
For r = 2 To ilr
    Select Case oDict.exists(Cells(r, 1).Value)
        Case False
        oDict.Add Cells(r, 1).Value, Range(Cells(r, 1), Cells(r, 3))
        Case True
        Set rD = oDict.Item(Cells(r, 1).Value)
        If rD.Cells(2) > Cells(r, 2).Value Then oDict.Item(Cells(r, 1).Value) = Range(Cells(r, 1), Cells(r, 3))
    End Select
Next r
    Range("A2").Resize(oDict.Count, 3) = Application.Transpose(Application.Transpose(oDict.Items))
    Rows(oDict.Count + 2 & ":" & ilr).Delete
End Sub
[/vba]
К сообщению приложен файл: xlsx-1-.xlsm (15.9 Kb)


Яндекс: 410016850021169
 
Ответить
Сообщение
из дубликатов нужно оставить только строку, в которой "дата начала" наименьшая

Для такой задачи мое решение из сообщения№4 не подходит.
Вот другое (первый раз пишу код с использованием Словаря, немного коряво, но вроде правильно работает)
[vba]
Код
Sub delete_2()
Set oDict = CreateObject("Scripting.Dictionary")
oDict.CompareMode = vbTextCompare
ilr = Cells(Rows.Count, 1).End(xlUp).Row
For r = 2 To ilr
    Select Case oDict.exists(Cells(r, 1).Value)
        Case False
        oDict.Add Cells(r, 1).Value, Range(Cells(r, 1), Cells(r, 3))
        Case True
        Set rD = oDict.Item(Cells(r, 1).Value)
        If rD.Cells(2) > Cells(r, 2).Value Then oDict.Item(Cells(r, 1).Value) = Range(Cells(r, 1), Cells(r, 3))
    End Select
Next r
    Range("A2").Resize(oDict.Count, 3) = Application.Transpose(Application.Transpose(oDict.Items))
    Rows(oDict.Count + 2 & ":" & ilr).Delete
End Sub
[/vba]

Автор - sboy
Дата добавления - 24.08.2017 в 13:12
Nordheim Дата: Суббота, 26.08.2017, 00:57 | Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 6
Репутация: 1 ±
Замечаний: 0% ±

Excel 2010
У меня вот так получилось.

[vba]
Код
Sub test()
Dim dic As Object, ikey
Dim i&, arr(), arr1$(), lrow&, x&
Set dic = CreateObject("scripting.dictionary")
With Лист1
    lrow = .Cells(.Rows.Count, 1).End(xlUp).Row
    arr = .Range(.[a2], .Cells(lrow, 3)).Value
    .Range(.[a2], .Cells(lrow, 3)).ClearContents
    For i = 1 To UBound(arr)
        If Not IsEmpty(arr(i, 3)) Then If dic.Item(CStr(arr(i, 1))) <= arr(i, 2) Then _
                dic.Item(CStr(arr(i, 1))) = arr(i, 2) & " " & arr(i, 3)
    Next i
    i = 0
    ReDim arr(1 To dic.Count, 1 To 3)
    For Each ikey In dic.keys
        i = i + 1: arr(i, 1) = ikey
        arr1 = Split(dic.Item(ikey), " ")
        For x = 2 To 3: arr(i, x) = arr1(x - 2): Next x
    Next ikey
    .[a2].Resize(UBound(arr), UBound(arr, 2)) = arr
End With
End Sub
[/vba]


Все гениальное просто и все простое гениально.

Сообщение отредактировал Nordheim - Суббота, 26.08.2017, 00:58
 
Ответить
СообщениеУ меня вот так получилось.

[vba]
Код
Sub test()
Dim dic As Object, ikey
Dim i&, arr(), arr1$(), lrow&, x&
Set dic = CreateObject("scripting.dictionary")
With Лист1
    lrow = .Cells(.Rows.Count, 1).End(xlUp).Row
    arr = .Range(.[a2], .Cells(lrow, 3)).Value
    .Range(.[a2], .Cells(lrow, 3)).ClearContents
    For i = 1 To UBound(arr)
        If Not IsEmpty(arr(i, 3)) Then If dic.Item(CStr(arr(i, 1))) <= arr(i, 2) Then _
                dic.Item(CStr(arr(i, 1))) = arr(i, 2) & " " & arr(i, 3)
    Next i
    i = 0
    ReDim arr(1 To dic.Count, 1 To 3)
    For Each ikey In dic.keys
        i = i + 1: arr(i, 1) = ikey
        arr1 = Split(dic.Item(ikey), " ")
        For x = 2 To 3: arr(i, x) = arr1(x - 2): Next x
    Next ikey
    .[a2].Resize(UBound(arr), UBound(arr, 2)) = arr
End With
End Sub
[/vba]

Автор - Nordheim
Дата добавления - 26.08.2017 в 00:57
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Перебор и сравнение двух столбцов (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!