2015-10-03 5 views
-2

У меня есть таблица Excel с 4000 строк, отформатированных с семью столбцами ниже. Я хочу отключить первый столбец и объединить все соответствующие строки. Таким образом, для первых двух строк ниже они сливаются в одну строку с C2 & C3, F2 & F3 и G2 & G3 в одной ячейке в соответствующих столбцах. Например:Объединить несколько строк на основе первого столбца

Я хотел бы слитые строки, чтобы выглядеть следующим образом:

8876 AIX 1.1.1.1,2.2.2.2 Oracle 11.2.0.3.15 Purple,Blue Jim Smith,Bob Guy 

Оригинальная таблица выглядит следующим образом:

8876 AIX 1.1.1.1 Oracle 11.2.0.3.15 Purple Jim Smith 
8876 AIX 2.2.2.2 Oracle 11.2.0.3.15 Blue Bob Guy 

Спасибо, Chris

+0

Я понимаю. Куда должен идти ваш выход? Должна ли она заменить существующие записи или перейти на другой лист? –

+0

Добро пожаловать в переполнение стека. Это не бесплатная служба написания кода, но мы будем рады помочь вам с кодом, который вы пытаетесь разработать. Пожалуйста, напишите, что вы сделали, и где вы столкнулись с трудностями. Также см. Раздел HELP для получения информации о том, как опубликовать хороший вопрос. –

+0

@Bas Verlaat - да, просто замена нескольких строк одной строкой является целью. Благодарю. – Flyingmunk

ответ

0

Вы можете используйте это

Public Sub StartMerge() 

    MergeRecords ActiveSheet.Range("$A$10:$H$19") 

End Sub 

Public Sub MergeRecords(rInputRange As Range, Optional sDelimiter As String = ",") 

    Dim oRow  As Range 
    Dim sPrevKey As String 
    Dim oPrevRow As Range 
    Dim i   As Long 
    Dim j   As Long 
    Dim bLoop  As Boolean 
    Dim lRowIndex As Long 
    Dim aItems() As String 

    bLoop = True 
    lRowIndex = 1 

    Do While bLoop 
     Set oRow = rInputRange.Rows(lRowIndex) 
     If oRow.Cells(1) = sPrevKey Then 
      For i = 2 To oRow.Cells.Count 
       If InStr(oRow.Cells(i), sDelimiter) <> 0 Then 
        aItems = Split(oRow.Cells(i), sDelimiter) 
        For j = 0 To UBound(aItems) 
         If InStr(oPrevRow.Cells(i), aItems(j)) = 0 Then 
          oPrevRow.Cells(i) = oPrevRow.Cells(i) & "," & aItems(j) 
         End If 
        Next j 
       Else 
        If InStr(oPrevRow.Cells(i), oRow.Cells(i)) = 0 Then 
         oPrevRow.Cells(i) = oPrevRow.Cells(i) & "," & oRow.Cells(i) 
        End If 
       End If 
      Next i 
      oRow.EntireRow.Delete xlUp 
     Else 
      Set oPrevRow = oRow 
      sPrevKey = oRow.Cells(1) 
      lRowIndex = lRowIndex + 1 
     End If 
     If lRowIndex > rInputRange.Rows.Count Then bLoop = False 
    Loop 

End Sub 

Сначала сделайте резервную копию. Предполагается, что в первой колонке содержится ключ

+0

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

+0

Хорошая точка. Я внесла поправки в код –

+0

@Bas Verlaat - мой VBA очень слаб. Как вызвать процедуру, когда она требует аргументов? Макрос не отображается в списке, поэтому я немного запутался в том, как его вызвать. Другими словами, как «MergeRecords» получают необходимые аргументы? Благодарю. – Flyingmunk

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