Função Não Funciona...
 
Notifications
Clear all

Função Não Funciona com Muitos Ítens

6 Posts
2 Usuários
0 Reactions
1,713 Visualizações
(@pedrobb)
Posts: 38
Trusted Member
Topic starter
 

Pessoal,
Achei a função abaixo na internet e funciona somente com poucos ítens.
Coloquei 600 nomes colunas A e B pra comparar e dá o erro:
Esta chave já está associada a um elemento dessa coleção (Erro 457) nos comandos ADD.
Como corrigir?

Sub relacionar_itens_que_falta()

    Dim a, b, c As Integer
    
    Dim vLista1 As Dictionary
    Dim vLista2 As Dictionary
    Dim vLista3 As New Collection
    Dim vListaItem As Variant
    Dim vCelula1, vCelula2 As Range

    Set vLista1 = New Dictionary
    Set vLista2 = New Dictionary
    
    [resultado].Value = ""
    
    a = Cells(Rows.Count, "A").End(xlUp).Row
    
    For Each vCelula1 In Range("A1:A" & a)
        With vLista1
            .CompareMode = BinaryCompare
            .Add CStr(vCelula1.Value), CStr(vCelula1.Value)
        End With
    Next
    
    b = Cells(Rows.Count, "B").End(xlUp).Row
    
    For Each vCelula2 In Range("B1:B" & b)
        With vLista2
            .CompareMode = BinaryCompare
            .Add CStr(vCelula2.Value), CStr(vCelula2.Value)
        End With
    Next
    
    For Each vListaItem In vLista1
        If Not vLista2.Exists(vListaItem) Then
            On Error Resume Next
            vLista3.Add CStr(vListaItem), CStr(vListaItem)
            On Error GoTo 0
        End If
    Next
    
    c = 1
    
    For Each vListaItem In vLista3
        Cells(c, "C") = vListaItem
        c = c + 1
    Next
    Range("G2").FormulaR1C1 = _
        "=""Macro executada [ ""&COUNTA(resultado)&"" ] números relacionados na coluna(C), sem os [ ""&COUNTA(R[-1]C[-5]:R[28]C[-5])&"" ]  da coluna(B)"""
    Range("K19").Select
End Sub
 
Postado : 16/10/2019 4:59 pm
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

Não entendi, e não consegui qualquer mensagem de erro utilizando a comparação em algo perto de 650 registros por coluna.
Qual os passos que executa/executor?
Pode dispor seu modelo? (utilize algum site de compartilhamento de arquivos tipos Sendspace/dropbox/google drive..) e informe aqui o link
Genericamente o erroo indica que está querendo/tentando incluir um registro na collection, porem a chave atribuida ja está em uso.
https://docs.microsoft.com/pt-br/office/vba/language/reference/user-interface-help/this-key-is-already-associated-with-an-element-of-this-collection-error-457

Reinaldo

 
Postado : 16/10/2019 5:55 pm
(@pedrobb)
Posts: 38
Trusted Member
Topic starter
 

Obrigado, Reinaldo.
Segue o link:
https://www.sendspace.com/file/ub9axa

Primeiro execute a macro. Depois escreva "4" em B11 e tente executar pra ver o erro.

 
Postado : 16/10/2019 6:41 pm
(@pedrobb)
Posts: 38
Trusted Member
Topic starter
 

Pessoal,
Percebi que o erro não está relacionado à quantidade de ítens.
As colunas A e B não permitem termos repetidos (seja letra ou número).
Sem valores repetidos e sem Células Vazias, funciona.
Mas não sei como resolver, pois preciso que a função aceite células vazias e/ou repetidas nas Colunas A e B, mas que Liste na Coluna C apenas os Valores Exclusivos que faltam na Coluna B.

 
Postado : 17/10/2019 8:32 am
Reinaldo
(@rlm)
Posts: 246
Estimable Member
 

No momento também não sei como resolver, e sem muito tempo para verificar, apesar de não gostar, tente como paliativo utilizar "On Error"
+/- assim:

Sub relacionar_itens_que_falta()
Dim a As Integer, b As Integer, c As Integer
Dim vLista1 As Dictionary, vLista2 As Dictionary
Dim vLista3 As New Collection
Dim vListaItem As Variant
Dim vCelula1 As Range, vCelula2 As Range

Set vLista1 = New Dictionary
Set vLista2 = New Dictionary

[resultado].Value = ""

a = Cells(Rows.Count, "A").End(xlUp).Row

For Each vCelula1 In Range("A1:A" & a)
    On Error Resume Next
    With vLista1
        .CompareMode = BinaryCompare
        .Add CStr(vCelula1.Value), CStr(vCelula1.Value)
    End With
Next

b = Cells(Rows.Count, "B").End(xlUp).Row

For Each vCelula2 In Range("B1:B" & b)
    On Error Resume Next
    With vLista2
        .CompareMode = BinaryCompare
        .Add CStr(vCelula2.Value), CStr(vCelula2.Value)
    End With
Next

For Each vListaItem In vLista1
    If Not vLista2.Exists(vListaItem) Then
        On Error Resume Next
        vLista3.Add CStr(vListaItem), CStr(vListaItem)
        On Error GoTo 0
    End If
Next

c = 1

For Each vListaItem In vLista3
    Cells(c, "C") = vListaItem
    c = c + 1
Next
Range("G2").FormulaR1C1 = _
    "=""Macro executada [ ""&COUNTA(resultado)&"" ] números relacionados na coluna(C), sem os [ ""&COUNTA(R[-1]C[-5]:R[28]C[-5])&"" ]  da coluna(B)"""
Range("K19").Select
End Sub

Reinaldo

 
Postado : 17/10/2019 11:15 am
(@pedrobb)
Posts: 38
Trusted Member
Topic starter
 

Reinaldo,
Obrigado!
Funciona com On error resume next.

Talvez apareça outra alternativa tratando dos valores repetidos e vazios.

 
Postado : 17/10/2019 2:07 pm