2015-09-16 2 views
1

У меня довольно сложная проблема.Манипулирование электронной таблицы Excel, удаление строк на основе значений в столбце, а затем удаление большего количества строк на основе значений в другом столбце

У меня есть файл журнала, который при вводе в excel столбец «I» содержит идентификаторы событий, а столбец J содержит специальный ключ, который сохраняет определенную четную группу.

Все, что я хочу сделать, это удалить любые строки, которые не содержат значения 102 в столбце идентификатора события. И ТОГДА мне нужно проверить пользовательский ключ (столбец J) и удалить строки, которые являются дубликатами, поскольку любые дубликаты будут ложно показывать другую статистику, которую я хочу.

Я дошел до того, что смог получить значения из столбцов, используя объекты com, и значение ячейки .entirecolumn и т. Д., Но я полностью зациклен на том, как я могу объединить надежный способ удаления строк. Я не мог понять, как получить строку для каждого значения.

Чтобы дать немного больше ясности это мой мыслительный процесс на то, что мне нужно сделать:

Если значение ячейки в колонке я не = 102 Затем удалите строку, ячейка содержит. Повторите для всех строк в таблице. И THEN- Прочитайте каждую ячейку в столбце J и удалите все строки, содержащие дубликаты, на основе значений в столбце J. Сохраните таблицу.

Можно ли мне помочь?



Дополнительная информация:

Колонка I содержит строку, которая является событием номер документа, например = 1029 Колонка J содержит строку, которая представляет собой смесь из цифр и букв = 1ASER0X3NEX0S

+0

Во-первых, у вас есть совершенно несущественные теги по этому вопросу - что делать с [tag: mysql] и [tag: vba]? Во-вторых, вам нужно показать нам, что вы уже пробовали, и что не работает. Наконец, это утверждение _ «Детали не слишком важны ...» _ это никогда не следует принимать, задавая вопрос, на который вы не знаете ответа. Посмотрите, как обеспечить [mcve] –

+0

Хорошо, дайте мне минутку. – Ellz

+0

Спасибо Макрос, я посмотрю и узнаю по ссылке. – Ellz

ответ

1

Ellz, я согласен с Macro Man в том, что ваши теги вводят в заблуждение и, что более важно, мне действительно нужно знать детали Column J.

Howev er, я так устал от грубых сообщений сегодня, а ваш был вежлив и уважителен, поэтому я вложил код ниже, который сделает трюк ... если столбец J может быть строкой (детали, которые вы нам не дали ... посмотри, что на Макро-мужчине?).

Существует множество способов проверки дубликатов. Один из них - попытаться добавить уникальный ключ в коллекцию и посмотреть, вызывает ли она ошибку. Многие не хотели бы эту философию, но, казалось, хорошо для вас, потому что это также дает вам коллекцию всех уникальных (то есть остальные) ключей в колонке J.

Sub Delete102sAndDuplicates() 
    Dim ws As Worksheet 
    Dim uniques As Collection 
    Dim rng As Range 
    Dim rowPair As Range 
    Dim iCell As Range 
    Dim jCell As Range 
    Dim delRows As Range 

    Set ws = ThisWorkbook.Worksheets("Sheet1") 
    Set rng = Intersect(ws.UsedRange, ws.Range("I:J")) 
    Set uniques = New Collection 

    For Each rowPair In rng.Rows 

     Set iCell = rowPair.Cells(, 1) 
     Set jCell = rowPair.Cells(, 2) 

     On Error Resume Next 
     uniques.Add jCell.Value2, jCell.Text 

     If Err = 457 Or iCell.Value2 = 102 Then 
      On Error GoTo 0 
      If delRows Is Nothing Then 
       Set delRows = rowPair.EntireRow 
      Else 
       Set delRows = Union(delRows, rowPair.EntireRow) 
      End If 
     End If 

    Next 

    If Not delRows is Nothing then 
     MsgBox delRows.Address(False, False) & " deleted." 
     delRows.Delete 
    End If 

End Sub 
+0

Это именно то, что я хочу, чтобы Ambie. Большое вам спасибо! Значения в J действительно являются строкой, например, 1918ERACSD7362 Мне просто нужно было посмотреть, как кто-то может это сделать, поэтому я могу узнать, как это работает и исправить его вместе снова! – Ellz

0

Есть целый ряд способов что это можно сделать, и что лучше всего будет зависеть от того, как часто вы выполняете эту задачу и хотите ли вы полностью автоматизировать ее. Так как вы добавили свой вопрос с VBA Я предполагаю, что вы будете счастливы с ответом на VBA на основе:

Sub removeValues() 

Range("I1").Select 'Start at the top of the I column 
'We are going to go down the column until we hit an empty row 
Do Until IsEmpty(ActiveCell.Value) = True 
    If ActiveCell.Value <> 102 Then 
     ActiveCell.EntireRow.Delete 'Then delete the row 
    Else 
     ActiveCell.Offset(1).Select 'Select the cell below 
    End If 
Loop 

'Now we have removed all non-102 values from the column, let`s remove the duplicates from the J column 
Range("A:J").RemoveDuplicates Columns:=10, Header:=xlNo 

End Sub 

Ключ линии есть Range("A:J").RemoveDuplicates. Он удалит строки из указанного вами диапазона в соответствии с дубликатами, которые он находит в указанном столбце. В этом случае они удалят элементы из столбцов A-J на основе дубликатов в столбце 10 (это J).Если ваши данные превышают столбец J, вам необходимо заменить "A:J" на соответствующий диапазон. Обратите внимание, что значение Columns относится к индексу первого столбца, поэтому, если столбец J равен 10, если этот диапазон начинается с A (1), то это будет 2, например, если диапазон составляет только I:J. Имеет ли это смысл?

(Примечание: использование ActiveCell на самом деле не самая лучшая практика, но это метод, который, очевидно, переводит на то, что вы пытались сделать, и, как кажется, вы новичок в VBA, я думал, что это будет проще всего понять) ,

+0

VBA приветствовалось также, спасибо, меня больше интересовало, как люди это делают, поэтому я мог бы изучить код, а затем исправить его вместе, чтобы удовлетворить мои потребности. – Ellz

+0

Я хотел бы дать дополнительную благодарность за то, что потратил время, чтобы объяснить это мне. Это очень ценится! – Ellz

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