Função para agrupar as coisas?

2
Hey guys amigos um pai me perguntou se eu sabia como fazer uma tarefa no excel no entanto eu não o faço para ajudá-lo, pensei que eu iria perguntar aqui. É isso que ele está tentando fazer.

Ele tem uma planilha de excel que parece algo semelhante a isso:

    A          B 
1   House 1    card 1 
2   House 1    card 2
3   House 1    card 3 
4   House 1    card 4 

Existem cerca de 500 entradas semelhantes a esta. Então, ao invés de entrar e manualmente pegar cada carta e movê-la para a primeira linha, então deletar as outras entradas da Casa 1 existe uma função de algum tipo que agruparia qualquer coisa com o mesmo nome e suas entradas seguintes. Como visual, ele está tentando transformar o exemplo anterior em:

  A        B       C       D       E
1 House 1  card 1  card 2  card 3  card 4

Obrigado por qualquer ajuda que alguém possa fornecer.

    
por cinderella 26.08.2016 / 02:57

1 resposta

2

SE a sua lista é ordenada na coluna A, então este método lhe dará o que você deseja.

Copie a lista na coluna A para outra coluna.

Em seguida, use Remover duplicados para obter uma lista exclusiva:

Então,naprimeiracélulaaoladodoprimeiroitemcolocado:

=IF(COLUMN(A:A)>COUNTIF($A:$A,$E1),"",INDEX($B:$B,MATCH($E1,$A:$A,0)+COLUMN(A:A)-1))

Em seguida, copie tantas colunas quanto o maior número de itens. Em seguida, copie para o final da lista.

Copieecoleosvaloresemumanovaplanilhaouemsimesmo.

Sevocêquiserfazerissonolugar;Euescreviestecódigoparaoutrositequepermanecerásemnome.Elefaráexatamenteoquevocêquerrapidamentenolugar:

SubFOOO()DiminArr()AsVariantDimoutArr()AsVariantDimwsAsWorksheetDimcntrwAsLongDimcntclmAsLongDimiAsLongDimjAsLongDimkAsLongDimrngAsRangeSetws=ActiveSheetWithwsSetrng=.Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
    'find the max number column that will be needed in the output
    cntclm = ws.Evaluate("MAX(COUNTIF(" & rng.Address & "," & rng.Address & "))") + 1
    'find the number of rows that will be needed in the output.
    cntrw = ws.Evaluate("SUM(1/COUNTIF(" & rng.Address & "," & rng.Address & "))")
    'put the existing data into an an array
    inArr = rng.Resize(, 2).Value
    'resize output array to the extents needed
    ReDim outArr(1 To cntrw, 1 To cntclm)
    'put the first value in the first spot in the output
    outArr(1, 1) = inArr(1, 1)
    outArr(1, 2) = inArr(1, 2)
    'these are counters to keep track of which slot the data should go.
    j = 3
    k = 1
    'loop through the existing data rows
    For i = 2 To UBound(inArr, 1)
        'test whether the data in A has changed or not.
        If inArr(i, 1) = inArr(i - 1, 1) Then
            'if not put the value in B in the next slot and iterate to the next column
            outArr(k, j) = inArr(i, 2)
            j = j + 1
        Else
            'if change start a new line in the outarr and fill the first two slots
            k = k + 1
            j = 3
            outArr(k, 1) = inArr(i, 1)
            outArr(k, 2) = inArr(i, 2)
        End If
    Next i
    'remove old data
    .Range("A:B").Clear
    'place new data in its place.
    .Range("A1").Resize(UBound(outArr, 1), UBound(outArr, 2)).Value = outArr
End With
End Sub

Antes:

Depois:

NOTA: os dois métodos exigem que a coluna A seja classificada.

    
por 26.08.2016 / 03:33