2014-11-03 5 views
0

У меня есть следующий скрипт, который хорошо работает в документах google ->. Это не работает с множеством строк. Я угадываю из-за того, что массив продолжает увеличиваться, что отслеживает значения.Удалите повторяющиеся строки на основе значения ячейки в столбце

Мне нужен сценарий, который я могу запустить в MS EXCEL, который удалит строки, имеющие дублирующее значение в столбце. (Если столбец не является "")

Google скрипт Docs, который работает для небольших файлов:

function removeDuplicates() 
{ 
    var s = SpreadsheetApp.getActiveSheet(); 
    var c = Browser.inputBox("Please", "Type in the column name (e.g.: A, B, etc.)", Browser.Buttons.OK_CANCEL); 
    var r, v; 
    var aValues = []; 
    try 
    { 
    if(c != "cancel") 
    { 
     r = 2; // first row is row two 
     while (r <= s.getLastRow()) 
     { 
     v = s.getRange(c + r).getValue(); 
     if(v != "") 
     { 
      if(aValues.indexOf(v) == -1) 
      { 
      aValues.push(v); 
      } 
      else 
      { 
      s.deleteRow(r); 
      continue; 
      } 
     } 
     r++; 
     } 
     Browser.msgBox("Duplicates removed!"); 
    } 
    } catch (e) {Browser.msgBox("Error Alert:", e.message, Browser.Buttons.OK);} 
} 

Любая помощь будет оценена.

+0

Вы пробовали данные команды ленты ► Инструменты данных ► Удалить дубликаты или у вас есть более ранняя версия Excel? Является ли это частью более широкой программы VBA? – Jeeped

+0

Кажется, удаленные дубликаты также удаляют повторяющиеся пустые строки (что мне нужно сохранить). Это просто простая процедура, которую мне нужно иметь на нескольких листах. –

+0

Вы, конечно, правы. Я вводил в заблуждение две операции, которые не отвечали друг на друга. (Автофильтр для непустого, а затем Удалить дубликаты не дедуплируются только для видимых ячеек) – Jeeped

ответ

1

Вот что похоже на счет.

Sub dedupe_ignore_blanks() 
    Dim r As Long, v As Long, vVALs As Variant, sCOL As String 
    Application.ScreenUpdating = False 
    Application.EnableEvents = False 
    Application.Calculation = xlCalculationManual 
    With ActiveSheet.Cells(1, 1).CurrentRegion 
     sCOL = "B" 
     sCOL = Application.InputBox("Type in the column name (e.g.: A, B, etc.)", _ 
      "Please", sCOL, 250, 75, "", , 2) 
     If CBool(Len(sCOL)) And sCOL <> "False" Then 
      For r = .Rows.Count To 2 Step -1 
       If Application.CountIf(.Columns(sCOL), .Cells(r, sCOL).Value) > 1 Then _ 
        .Rows(r).EntireRow.Delete 
      Next r 
     End If 
    End With 
FallThrough: 
    Application.Calculation = xlCalculationAutomatic 
    Application.EnableEvents = True 
    Application.ScreenUpdating = True 
End Sub 

я понял из вашего кода, который вы имели строку заголовка в строке данных 1. Application.CountIF не сосчитать пустые ячейки.

+0

Волшебно! Принял некоторое время, чтобы бежать, но он выполнил свою работу. –

+0

@ChrisMuench - спасибо за продолжение. Если это повторяющаяся задача, и вы хотите сделать ее более эффективной, выключение * screenupdating * и * enableevents * off и установка * расчета * вручную в начале операции и восстановление их в конце значительно улучшит время выполнения. Улучшено выше. – Jeeped

+0

Это не то, что я часто делаю. Вероятно, это займет 20-30 минут на электронной таблице в 100 000 строк, что является очень приемлемым –

Смежные вопросы