Como posso obter os valores únicos presentes em uma coluna para cada conjunto de valores idênticos em outra coluna?

0

Eu tenho as duas colunas a seguir:

Con.By  Prod
   A     1
   A     1
   A     2
   A     2
   B     1
   B     1
   B     2
   B     2

Posso obter facilmente os valores únicos na coluna Con.By ou na coluna Prod . No entanto, minha exigência é obter os valores exclusivos na coluna Prod para cada um dos valores exclusivos na coluna Con.By . Portanto, minha saída pretendida para as colunas de dados acima seria:

Con.By  Prod
   A     1
         2
   B     1
         2

Eu nem sei por onde começar. Eu tentei escrever um código VBA para filtrar a coluna Con.By para cada valor individualmente e, em seguida, encontrar valores exclusivos na coluna Prod . No entanto, esse método não funciona, pois minha coluna Con.By contém muitas entradas e algumas podem mudar com o tempo.

Qual é a melhor maneira de obter a saída que eu preciso? Existem fórmulas de excel ou requer codificação VBA?

    
por Achyutha Mohan 15.10.2015 / 20:48

3 respostas

0

Você pode tentar este método. Ele faz uso de uma classe definida pelo usuário para ajudar na coleta de itens exclusivos na segunda coluna.

O código, nos Módulos Regular e de Classe, utiliza o fato de que, quando você tenta adicionar um membro à coleção que possui a mesma Chave que um membro existente, será gerado um erro 457 . / p>

Você pode ver no código onde fazer alterações para considerar as diferenças em sua planilha e intervalos para a Origem (Src) e Resultados (Res).

Você DEVE RENOMEAR o módulo da classe cConBy . Depois que você Insert Class Module , F4 abre a janela de propriedades. Altere o parâmetro Name lá.

Módulo de turma

Option Explicit
Private pConBy As String
Private pProd As String
Private pProds As Collection

Private Sub Class_Initialize()
    Set pProds = New Collection
End Sub

Public Property Get ConBy() As String
    ConBy = pConBy
End Property
Public Property Let ConBy(Value As String)
    pConBy = Value
End Property

Public Property Get Prod() As String
    Prod = pProd
End Property
Public Property Let Prod(Value As String)
    pProd = Value
End Property

Public Function AddProd(Value As String)
    On Error Resume Next
    pProds.Add Value, CStr(Value)
    On Error GoTo 0
End Function

Public Property Get Prods() As Collection
    Set Prods = pProds
End Property

Módulo regular

Option Explicit
Sub UniqueConBy()
    Dim cCB As cConBy, colCB As Collection
    Dim wsSrc As Worksheet, wsRes As Worksheet, rRes As Range
    Dim vSrc As Variant, vRes() As Variant
    Dim I As Long, J As Long, K As Long
    Dim lRowCount As Long

'Source and results location
Set wsSrc = Worksheets("Sheet1")
Set wsRes = Worksheets("Sheet1")
    Set rRes = wsRes.Cells(1, 5)
With wsSrc
    vSrc = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(columnsize:=2)
End With

'Collect and consolidate the data
Set colCB = New Collection
On Error Resume Next
For I = 2 To UBound(vSrc, 1)
    Set cCB = New cConBy
    With cCB
        .ConBy = vSrc(I, 1)
        .Prod = vSrc(I, 2)
        .AddProd .Prod
        lRowCount = lRowCount + 1
        colCB.Add cCB, CStr(.ConBy)
        Select Case Err.Number
            Case 457
                With colCB(CStr(.ConBy))
                    lRowCount = lRowCount - .Prods.Count - 1
                    .AddProd cCB.Prod
                    lRowCount = lRowCount + .Prods.Count
                End With
                Err.Clear
            Case Is <> 0
                MsgBox "Error: " & Err.Number & vbTab & Err.Description
                Stop
        End Select
    End With
Next I
On Error GoTo 0

'Create results array
ReDim vRes(0 To lRowCount, 1 To 2)

'column labels
For I = 1 To UBound(vRes, 2)
    vRes(0, I) = vSrc(1, I)
Next I

'populate the array
For I = 1 To colCB.Count
    With colCB(I)
        K = K + 1
        vRes(K, 1) = .ConBy
        vRes(K, 2) = .Prods(1)
        For J = 2 To .Prods.Count
            K = K + 1
            vRes(K, 2) = .Prods(J)
        Next J
    End With
Next I

Set rRes = rRes.Resize(UBound(vRes, 1) + 1, UBound(vRes, 2))
With rRes
    .EntireColumn.Clear
    .Value = vRes
    With .Rows(1)
        .Font.Bold = True
        .HorizontalAlignment = xlCenter
    End With
    .EntireColumn.AutoFit
End With

End Sub

EDITAR:

Um método alternativo, que se aproxima do que você quer, mas que oferece uma saída ligeiramente diferente, seria simplesmente usar a opção Remover Duplicatas na guia Data Ribbon / Data Tools. Você selecionaria as colunas A e B.

Garanta que seus dados sejam classificados antes de aplicar esse método (a classificação não seria necessária usando o método VBA).

Com seus dados postados, os resultados seriam semelhantes:

VocêpoderiausaraformataçãocondicionalparaeliminarasentradasduplicadasnaColunaA.porexemplo:useumafórmulade=$A2=$A1eformateacordotextoparateramesmacordoplanodefundo.OvalorCon.Byaindaestarialá,masnãoseriavisível.

    
por 15.10.2015 / 21:48
0

Experimente a seguinte receita, que eu acho mais fácil de entender, mas talvez não tão amigável quanto a automação como a resposta de Ron.

  1. Supondo que Con.By esteja na coluna A e Prod esteja na coluna B, em outra coluna (digamos C), concatene as duas colunas com um separador, e. "_":

    =A2&"_"&B2 , que é o mesmo que =CONCATENATE(A2,"_",B2)

  2. Usando seu exemplo, a saída será como A_1 , etc. Copie a coluna C e Paste Values somente na coluna D.

  3. Destaque Coluna D e, usando o menu da faixa de opções, selecione Data -> Remove Duplicates . A coluna D será semelhante a: A_1 A_2

  4. Para dividir os dados de volta em duas colunas separadas, use o menu da faixa de opções e selecione Data -> Text to Columns . Escolha 'Delimitado

por 16.10.2015 / 15:14
0

Experimente a seguinte receita, que eu acho mais fácil de entender, mas talvez não tão amigável quanto a automação como a resposta de Ron.

  1. Supondo que Con.By esteja na coluna A e Prod esteja na coluna B, em outra coluna (digamos C), concatene as duas colunas com um separador, e. "_":

    =A2&"_"&B2 , que é o mesmo que =CONCATENATE(A2,"_",B2)

  2. Usando seu exemplo, a saída será como A_1 etc. Copie a coluna C e Paste Values somente na coluna D.

  3. Destaque Coluna D e, usando o menu da faixa de opções, selecione Data -> Remove Duplicates . A coluna D será semelhante a: A_1 A_2

  4. Para dividir os dados de volta em duas colunas separadas, use o menu da faixa de opções e selecione Data -> Text to Columns . Escolha Delimited como a primeira opção e Other como o segundo. Seu delimitador é _ neste caso.

Isso fornecerá resultados próximos ao que você deseja.

    
por 16.10.2015 / 15:17