Страницы: 1 2 След.
RSS
Удаление повторяющихся строк.
 
Помогите  пожалуйста с удалением  повторяющихся строк.  
Нужно  удалить одну  из  двух  повторяющихся строк. Критерием  отбора является столбец «К»  
Пожалуйста  помогите отчет горит!
 
Через данные - фильтр - автофильтр? Дальше выбираете значение и удаляете дубликаты.  
Или принципиально макросом надо?
 
{quote}{login=}{date=01.03.2011 12:52}{thema=}{post}Через данные - фильтр - автофильтр? Дальше выбираете значение и удаляете дубликаты.  
Или принципиально макросом надо?{/post}{/quote}  
 
У меня база из 10 000 строк - вручную ч/з фильтр-сложновато будеть
 
ок, значит макросом.  
 
...Нужно удалить одну из двух повторяющихся строк. Критерием отбора является столбец «К»....  
 
Как быть, если строк одинаковых по столбцу К больше 2? 3? 8?  
Надо оставить только одну? Или только одну удалить?
 
в доп столбец формулу:  
 
=СЧЁТЕСЛИ($K$2:K2;K2)=1  
 
дальше автофильтр и по доп столбцу все "ЛОЖЬ" - удалить. см файл
Редко но метко ...
 
Я пользуюсь таким дресним кодом (сейчас глянул - причесать вероятно пора...).  
Но работает. Делает бекап перед изменением.  
Сперва лист отсортируйте по этой колонке.  
 
Sub DelDuplicatesAfterSorted()  
Dim del As Long  
Dim x As Integer  
'Dim x As String  
   If MsgBox("All Changes Will Be Saved!" & Chr(13) & "Ispected Active Column." & Chr(13) & "Continue?", vbExclamation + vbOKCancel, "Warning!") = vbCancel Then  
    Exit Sub  
    End If  
       
WbPth = ActiveWorkbook.Path  
WbName = ActiveWorkbook.Name  
'x = (InputBox("What Column Inspected?", , 4)) * 1  
'x = InputBox("What Column Inspected? (Letter)", "x", "A", 1500, 2000)  
x = ActiveCell.Column  
Application.ScreenUpdating = False  
 
strDate = Format(Now, "yyyy.mm.dd-hh.mm.ss")  
Set fs = CreateObject("Scripting.FileSystemObject")  
If fs.FolderExists("c:\Temp\") = False Then MkDir "c:\Temp"  
 
                ActiveWorkbook.SaveAs Filename:="c:\Temp\BackupBeforeDelDuplicates." & strDate & "." & ActiveWorkbook.Name, _  
                FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=True, CreateBackup:=False  
 
Application.DisplayAlerts = False  
 
                 ActiveWorkbook.SaveAs Filename:=WbPth & "\" & WbName, _  
                FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False  
                 
Application.DisplayAlerts = False  
 
With ActiveSheet.UsedRange  
 For Each cc In .Columns(x).Cells  
cikl:  
   If Cells(cc.Row, x).Value = Cells(cc.Row + 1, x).Value _  
   And Cells(cc.Row + 1, x).Value <> "" Then  
       Application.StatusBar = " Working on  " & cc.Row & " Row" ' визуализация работы  
       Rows(cc.Row + 1).EntireRow.Delete Shift:=xlUp  
       del = del + 1  
      ' Rows(cc.Row + 1).EntireRow.Hidden = True  
                         
      GoTo cikl  
   End If  
 Next  
End With  
 
Application.StatusBar = False 'сбрасываем визуализацию работы  
Application.ScreenUpdating = True  
 
MsgBox "Ok! Deleted " & del & " Rows!"  
 
End Sub
 
{quote}{login=}{date=01.03.2011 12:59}{thema=}{post}ок, значит макросом.  
 
...Нужно удалить одну из двух повторяющихся строк. Критерием отбора является столбец «К»....  
 
Как быть, если строк одинаковых по столбцу К больше 2? 3? 8?  
Надо оставить только одну? Или только одну удалить?{/post}{/quote}  
 
Надо оставить одну.
 
В заголовке столбца "К" давим кнопку.  
Текст макроса - в модуле. Ну и тут:  
 
Sub Muhan()    
Dim lngI As Long  
For lngI = Cells(Rows.Count, 11).End(xlUp).Row To 2 Step -1  
   If Cells(lngI, 11).Value = Cells(lngI - 1, 11).Value Then  
       Rows(lngI).Delete Shift:=xlUp  
   End If  
Next lngI  
 
End Sub
 
{quote}{login=GIG_ant}{date=01.03.2011 01:00}{thema=}{post}в доп столбец формулу:  
 
=СЧЁТЕСЛИ($K$2:K2;K2)=1  
 
дальше автофильтр и по доп столбцу все "ЛОЖЬ" - удалить. см файл{/post}{/quote}  
 
Огромное спасибо! Вы спасли меня!
 
{quote}{login=}{date=01.03.2011 01:16}{thema=}{post}В заголовке столбца "К" давим кнопку.  
Текст макроса - в модуле. Ну и тут:  
 
Sub Muhan()    
Dim lngI As Long  
For lngI = Cells(Rows.Count, 11).End(xlUp).Row To 2 Step -1  
   If Cells(lngI, 11).Value = Cells(lngI - 1, 11).Value Then  
       Rows(lngI).Delete Shift:=xlUp  
   End If  
Next lngI  
 
End Sub{/post}{/quote}  
 
 
Спасибо Большое Вам  
Проблема решена. Спасибо всем!  
Вопрос снят.
 
Добрый день! Продолжу тему.  
Я попытался решить эту задачу сам. Пошел вот по такому пути (см макрос в файле).  
НО не сразу увидел что одна фамилия повторяется трижды, и мой код удаляет только один дубль. Можно это обойти в моем макросе или нет? Спасибо за пояснения.
 
В Вашем коде нельзя.  
Вы используете "для каждого", но в процессе потихоньку эти "каждые" удаляете. Я вообще с трудом представляю, что там думает по этому поводу код...
 
Заменить If на цикл:  
 
Sub DelRowDuble()  
Dim a As Range  
Dim b As Long  
b = Cells(Rows.Count, 11).End(xlUp).Row  
   For Each a In Range(Cells(1, 11), Cells(b, 11))  
       Do While a <> "" And a = a.Offset(1, 0)  
           a.Offset(1, 0).EntireRow.Delete  
       Loop  
   Next a  
End Sub
 
Или так  
Sub DelRowDuble()  
Dim i As Long  
Dim b As Long  
b = Cells(Rows.Count, 11).End(xlUp).Row  
Application.ScreenUpdating = False  
For i = b To 2 Step -1  
       If Cells(i, 11).Value = Cells(i - 1, 11).Value Then  
       If Cells(i, 11).Value <> "" Then Rows(i).Delete  
       End If  
       Next i  
Application.ScreenUpdating = False  
End Sub
 
Вариант казанского для меня попроще воспринимается ( пока выполняются условия удаляем строку).  
RAN, For i = b To 2 Step -1 b - понятно строка с переменной, а конец цикла 2 это 2-я строка в столбце с переменной?  
 
95553
 
я не RAN, но ответ - ДА.
 
{quote}{login=}{date=01.03.2011 03:10}{thema=}{post}не RAN{/post}{/quote},  
Спасибо, я тут попробовал 2 на 10 поменять и понял, что да :)
 
подскажите по этой же теме, подошел вот этот макрос:  
Sub Muhan()    
Dim lngI As Long  
For lngI = Cells(Rows.Count, 11).End(xlUp).Row To 2 Step -1  
If Cells(lngI, 11).Value = Cells(lngI - 1, 11).Value Then  
Rows(lngI).Delete Shift:=xlUp  
End If  
Next lngI  
 
End Sub  
 
но это если на странице одна таблица, а если на странице несколько таблиц и нужно в каждой удалить повторяющуюся строку, то что нужно переделать в макросе?  
Спасибо.
 
и еще к предыдущему вопросу, если нужно удалять строки по значению не одного а двух столбцов, то как тогда будет выглядеть макрос?  
Спасибо еще раз.
 
переделывать нужно многое, т.к. макрос удаляет строки с листа  
Вариант - таблицы каждую на свой лист и к ним макрос применять.  
Таблицы должны быть единообразные.  
Или кладите пример - вот что есть, вот так хочу - будем думать...
 
{quote}{login=Евгения}{date=19.08.2011 12:10}{thema=}{post}и еще к предыдущему вопросу, если нужно удалять строки по значению не одного а двух столбцов, то как тогда будет выглядеть макрос?  
Спасибо еще раз.{/post}{/quote}  
Добавить условие для удаления. Например:  
 
If Cells(lngI, 11).Value = Cells(lngI - 1, 11).Value And Cells(lngI, 12).Value = Cells(lngI - 1, 12).Value Then
 
не, на разные листы нельзя, нужно обязательно на одном, вот пример приложила:  
в таблице 1 нужно удалить строки с повторяющимися значениями в столбцах, ОБЯЗАТЕЛЬНО, и J и К, аналогично в таблице 2 столбцы O и P и в таблице 3 E и F. Количество строк в таблицах постоянное. Спасибо.
 
{quote}{login=Евгения}{date=19.08.2011 12:29}{thema=}{post} Количество строк в таблицах постоянное. {/post}{/quote}  
 
Точно? Это важно!
 
Еще вдогонку вопрос - в таблицах данные вразнобой стоят или дубликаты друг за другом?
 
Точно? Это важно!{/post}{/quote}  
 
Ну..если очень редко меняется, добавляется вручную, но я думала что это не будет существенно, но если очень важно, то да меняется, но редко, редко.  
 
А про вопрос вдогонку я что-то не поняла о чем он.
 
количество строк в таблицах переменное/постоянное важно, т.к. в вашем случае придется запускать 3 цикла по удалению дубликатов - из таблицы 1 по своему условию, из таблицы 2 - по своему условию, из таблицы 3 - по своему.  
Соответственно для каждого цикла надо определять с какими строками ему работать, чтобы не было ситуации, когда проверка происходит по значению не в тех столбцах.  
По вопросу сортировки данных: идея макроса такая - берется значение из последней строки таблицы в нужных столбцах и сравнивается со значением из предпоследней строки. Если совпадают - последнюю строку удаляем. Если НЕ совпадают - берем предпоследнюю строку и сравниваем с пред-пред-последней и т.д.  
Теперь представьте ситуацию, когда дубликаты расположены НЕ ПОДРЯД в таблице.  
Поэтому если значения подрряд - все хорошо. Если нет, то надо  либо сортировать сначала, потом удалять, либо перекраивать проверку на совпадения.
 
Количество строк в таблицах переменное/постоянное можно обойти, если использовать CurrentRegion ячеек с Таблица 1, Таблица 2 и Таблица 3.  
Лишь бы между таблицами была пустая строка. Хотя если не будет - тоже не страшно, вроде должно отработать сразу по двум таблицам, но два раза :)  
 
Прописать в коде поиск этих ячеек через Find или тупо перебором, даже можно сверху вниз.  
Потом цикл по этой области снизу вверх и удаление.  
 
Вот только не понял, почему всюду Пол и ИИН сравниваете - там ведь никогда нет совпадений? Или я что-то путаю?
 
{quote}{login=}{date=19.08.2011 12:47}{thema=}{post}По вопросу сортировки данных: идея макроса такая - берется значение из последней строки таблицы в нужных столбцах и сравнивается со значением из предпоследней строки. Если совпадают - последнюю строку удаляем. Если НЕ совпадают - берем предпоследнюю строку и сравниваем с пред-пред-последней и т.д.  
Теперь представьте ситуацию, когда дубликаты расположены НЕ ПОДРЯД в таблице.  
Поэтому если значения подрряд - все хорошо. Если нет, то надо  либо сортировать сначала, потом удалять, либо перекраивать проверку на совпадения.{/post}{/quote}  
 
нет строки расположены не подряд, одна может быть вначале, другая в конце таблицы
 
{quote}{login=Hugo}{date=19.08.2011 12:52}{thema=}{post}  
Вот только не понял, почему всюду Пол и ИИН сравниваете - там ведь никогда нет совпадений? Или я что-то путаю?{/post}{/quote}  
 
нет, нет я их не сравниваю, я сравниваю строки с одинаковыми значениями в этих двух столбцах
 
{quote}{login=Евгения}{date=19.08.2011 12:29}{thema=}{post}не, на разные листы нельзя, нужно обязательно на одном, вот пример приложила:  
в таблице 1 нужно удалить строки с повторяющимися значениями в столбцах, ОБЯЗАТЕЛЬНО, и J и К, аналогично в таблице 2 столбцы O и P и в таблице 3 E и F. Количество строк в таблицах постоянное. Спасибо.{/post}{/quote}  
Ведь все может быть проще...  
Почему нельзя сделать из трех однотипных таблиц одну? Число строк - по 30, число полей в них одинаковое - 20, только блоки "пол"&"ИНН" непонятно по какой логике перемещены...  
Вы, видимо, чего-то не договариваете...  
-76079-
Страницы: 1 2 След.
Читают тему
Наверх