Доброе время суток, подскажите, пожалуйста, как можно сделать поиск данных из нескольких столбцов, отсеить дубликаты и выставить их на другой. На листе 1 у меня данные, мне нужно выдернуть на лист 2, но с условиями. Если столбцы B и С одинаковы, то от их ставит на лист 2 в соответствующие ячейки, и вычленяет все даты одной и той же фамилии в столбик.
Доброе время суток, подскажите, пожалуйста, как можно сделать поиск данных из нескольких столбцов, отсеить дубликаты и выставить их на другой. На листе 1 у меня данные, мне нужно выдернуть на лист 2, но с условиями. Если столбцы B и С одинаковы, то от их ставит на лист 2 в соответствующие ячейки, и вычленяет все даты одной и той же фамилии в столбик.Kioto
sboy, спасибо, небольшая проблемка, если я использую сводную таблицу, то когда копирую эти данные в таблицу в Word, то даты разбиваются в различные ячейки, а мне нужно, чтобы один клиент - одна строка.
sboy, спасибо, небольшая проблемка, если я использую сводную таблицу, то когда копирую эти данные в таблицу в Word, то даты разбиваются в различные ячейки, а мне нужно, чтобы один клиент - одна строка.
Karataev, спасибо огромное, знаю, что наглость, но не могли бы Вы посмотреть еще один файл, всё практически также только столбцов 5, но принцип один и тот же. Пыталась переделать Ваш макрос и под этот файл, но не получилось, он начал выставлять даже время в ячейках с клиентами, а на других писал №ЗНАЧ. Здесь тоже удаление дубликатов с ФИО, но с условием, что если в выбранных ячейках есть различие, например поменялся адрес, либо заболевание, то переносятся последние введенные данные на другой лист.
Karataev, спасибо огромное, знаю, что наглость, но не могли бы Вы посмотреть еще один файл, всё практически также только столбцов 5, но принцип один и тот же. Пыталась переделать Ваш макрос и под этот файл, но не получилось, он начал выставлять даже время в ячейках с клиентами, а на других писал №ЗНАЧ. Здесь тоже удаление дубликатов с ФИО, но с условием, что если в выбранных ячейках есть различие, например поменялся адрес, либо заболевание, то переносятся последние введенные данные на другой лист.Kioto
Здесь две процедуры. Поместите их в одни модуль. Запускать нужно только "Объединить_дубликаты", вторая процедура будет запускаться процедурой "Объединить_дубликаты".
[vba]
Код
Sub Объединить_дубликаты()
Dim shSrc As Worksheet, shRes As Worksheet Dim arr(), lr As Long, i As Long
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc) shSrc.Columns("F:G").Copy shRes.Columns("A:B") shSrc.Columns("L:M").Copy shRes.Columns("C:D") shSrc.Columns("J").Copy shRes.Columns("E") shSrc.Columns("B").Copy shRes.Columns("F") MergeAddress shRes shRes.Columns("D").Delete
shRes.Sort.SortFields.Add Key:=shRes.Columns("A"), SortOn:=xlSortOnValues, Order:=xlAscending shRes.Sort.SortFields.Add Key:=shRes.Columns("B"), SortOn:=xlSortOnValues, Order:=xlAscending shRes.Sort.SortFields.Add Key:=shRes.Columns("E"), SortOn:=xlSortOnValues, Order:=xlAscending With shRes.Sort .SetRange shRes.Columns("A:E") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With
lr = shRes.Cells(shRes.Rows.Count, "A").End(xlUp).Row arr() = shRes.Range("A1:E" & lr).Value For i = UBound(arr) To 3 Step -1 If arr(i, 1) = arr(i - 1, 1) And arr(i, 2) = arr(i - 1, 2) Then arr(i - 1, 3) = arr(i, 3) arr(i - 1, 4) = arr(i, 4) arr(i - 1, 5) = arr(i - 1, 5) & Chr(10) & arr(i, 5) arr(i, 1) = Empty End If Next i
shRes.Range("A1:E" & lr).Value = arr()
On Error Resume Next shRes.Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0
lr = shRes.Columns("C:D").Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row arr1() = shRes.Range("C2:D" & lr).Value ReDim arr2(1 To UBound(arr1), 1 To 1)
For i = 1 To UBound(arr1) arr2(i, 1) = arr1(i, 1) & ", " & arr1(i, 2) Next i shRes.Range("C2").Resize(UBound(arr2)).Value = arr2()
End Sub
[/vba]
Здесь две процедуры. Поместите их в одни модуль. Запускать нужно только "Объединить_дубликаты", вторая процедура будет запускаться процедурой "Объединить_дубликаты".
[vba]
Код
Sub Объединить_дубликаты()
Dim shSrc As Worksheet, shRes As Worksheet Dim arr(), lr As Long, i As Long
Application.ScreenUpdating = False
Set shSrc = ActiveSheet Set shRes = Worksheets.Add(After:=shSrc) shSrc.Columns("F:G").Copy shRes.Columns("A:B") shSrc.Columns("L:M").Copy shRes.Columns("C:D") shSrc.Columns("J").Copy shRes.Columns("E") shSrc.Columns("B").Copy shRes.Columns("F") MergeAddress shRes shRes.Columns("D").Delete
shRes.Sort.SortFields.Add Key:=shRes.Columns("A"), SortOn:=xlSortOnValues, Order:=xlAscending shRes.Sort.SortFields.Add Key:=shRes.Columns("B"), SortOn:=xlSortOnValues, Order:=xlAscending shRes.Sort.SortFields.Add Key:=shRes.Columns("E"), SortOn:=xlSortOnValues, Order:=xlAscending With shRes.Sort .SetRange shRes.Columns("A:E") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .Apply End With
lr = shRes.Cells(shRes.Rows.Count, "A").End(xlUp).Row arr() = shRes.Range("A1:E" & lr).Value For i = UBound(arr) To 3 Step -1 If arr(i, 1) = arr(i - 1, 1) And arr(i, 2) = arr(i - 1, 2) Then arr(i - 1, 3) = arr(i, 3) arr(i - 1, 4) = arr(i, 4) arr(i - 1, 5) = arr(i - 1, 5) & Chr(10) & arr(i, 5) arr(i, 1) = Empty End If Next i
shRes.Range("A1:E" & lr).Value = arr()
On Error Resume Next shRes.Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete On Error GoTo 0
Karataev, к сожалению упустила один момент, в столбце O идут разные услуги, а нужно, чтобы макрос добавлял даты на другой лист, если стоит услуга в столбце O "Выезд". Иначе даты дублируются, если в один день оказано больше одной услуги. Не могли бы, пожалуйста, поправить этот момент?
Karataev, к сожалению упустила один момент, в столбце O идут разные услуги, а нужно, чтобы макрос добавлял даты на другой лист, если стоит услуга в столбце O "Выезд". Иначе даты дублируются, если в один день оказано больше одной услуги. Не могли бы, пожалуйста, поправить этот момент?Kioto