Notifications
Clear all

Comparar planilhas e alterar no formulário

7 Posts
3 Usuários
0 Reactions
2,099 Visualizações
(@fcarlosc)
Posts: 0
New Member
Topic starter
 

Boa-noite

Pessoal, gostaria de um auxilio para comparar e alterar a planilha usando formulário.
Tenho a Plan2(DIG) e a Plan3(VER), na Plan2 eu faço a primeira digitação e na Plan3 faço uma segunda digitação, queria que ao abrir o formulário ele compare as planilhas.

Ex.: Na Plan3(VER) comparar com a Plan2(DIG)
o campo ORDEM seria um (ID)

então ele iria comparar o campo "NOME" da Plan3(VER) com o campo "NOME" da Plan2(DIG) se for <> mostrar a textbox vazia e colorida para que eu possa digitar o nome correto e o mesmo para os outros campos. Quando eu der enter no último campo gravar as alterações na Plan3(VER) e ir para o próximo (ID).

Att,

Francisco

 
Postado : 21/11/2017 4:59 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia!!

Compara múltiplas colunas de duas guias e cola as diferenças em outra guia.

Option Explicit

Sub Comparar()
'Compara a Plan2(DIG) com a Plan3(VER) e coloca as diferenças em Plan4(alevba)
'A parte do formulário eu não entendi!!
    Dim ar As Variant
    Dim arr As Variant
    Dim Var As Variant
    Dim v()
    Dim i As Long
    Dim n As Long
    Dim j As Long
    Dim str As String
    
    ar = Plan2.Cells(2, 1).CurrentRegion.Value
    With CreateObject("Scripting.Dictionary")
        .CompareMode = 1
        ReDim v(1 To UBound(ar, 2))
        For i = 2 To UBound(ar, 1)
            For n = 1 To UBound(ar, 2)
                str = str & Chr(2) & ar(i, n)
                v(n) = ar(i, n)
            Next
            .Item(str) = v: str = ""
        Next
        ar = Plan3.Cells(2, 1).CurrentRegion.Resize(, UBound(v)).Value
        For i = 2 To UBound(ar, 1)
            For n = 1 To UBound(ar, 2)
                str = str & Chr(2) & ar(i, n)
                v(n) = ar(i, n)
            Next
            If .exists(str) Then
                .Item(str) = Empty
            Else
                .Item(str) = v
            End If
            str = ""
        Next
        For Each arr In .keys
            If IsEmpty(.Item(arr)) Then .Remove arr
        Next
        Var = .items: j = .Count
    End With
    With Plan4.Range("a1").Resize(, UBound(ar, 2))
        .CurrentRegion.ClearContents
        .Value = ar
        If j > 0 Then
            .Offset(1).Resize(j).Value = Application.Transpose(Application.Transpose(Var))
        End If
    End With
End Sub

Att

 
Postado : 22/11/2017 5:17 am
(@fcarlosc)
Posts: 0
New Member
Topic starter
 

Boa-tarde Alexandre

Obrigado por responder, porém não seria bem isso que eu estava pensando. Imagine minha planilha com 1.000 registros na Plan(DIG) e 1.000 na Plan(VER) aí sendo feito essa comparação, suponhamos que existissem uns 500 registro diferentes...a macro iria copiar para a Plan4 1.000 registro para serem analisados.

A idéia seria:

Vou ter 2 formulários --> Um para DIGITAÇÃO e outro para VERIFICAÇÃO

Vou fazer a digitação dos registros...aqui é a parte mais tranquila se vai ser digitado certo ou errado, vou pegar esse erro na "verificação"...!!!
Vou realizar a verificação desses registros...aqui começa o esquema. Quando eu digitar o Nome por exemplo, se houver alguma diferença vai mostrar uma msg que está diferente e vou realizar uma segunda "verificação" ou seja vou digitar o nome 2 vezes para poder ir para o próximo textbox. (isso seria para que o cara que estiver fazendo a verificação ter a certeza de que ele está verificando o nome corretamente, se estiver correto, quem errou foi o cara da digitação). Aí entra o próximo passo...!

Obs: nem sempre o cara que está verificando presta atenção, e mesmo assim ele pode errar o nome. Então estaria o nome errado tanto na digitação quanto na verificação.

O 3º formulário seria COMPARAR

Quando abrir o formulário ele iria direto no primeiro registro e já faria essa comparação, se o Nome estiver igual na Plan(DIG) e Plan(VER) ele apenas mostra o nome completo no textbox.
Se estiver diferente, ele não mostra o nome no textbox e deixa colorido, assim eu vou saber onde está diferente e vou digitar o nome correto. Isso para os demais textbox e no último textbox após o "ENTER" ir para o próximo registro (ID) e continuar a comparação.

 
Postado : 22/11/2017 11:18 am
(@fcarlosc)
Posts: 0
New Member
Topic starter
 

Boa-noite

Fiz uma mudança para comparar com "AfterUpdate" quando digito o "POSTO", até aí tudo bem. Não consegui fazer um laço para comparar nas próximas linhas.
Se alguém puder me ajudar, agradeço.

Att,

Francisco

 
Postado : 23/11/2017 3:10 pm
(@fcarlosc)
Posts: 0
New Member
Topic starter
 

Boa-noite

Alguém poderia me ajudar com uma repetição no código, pois o que fiz só faz a comparação na primeira linha, se eu colocar o próximo código ele chama no formulário mais não faz a comparação.
Sei que o problema está nesta parte do código:

TextBox2.Value = c.Cells(1, 2).Value....depois no próximo textbox: TextBox3.Value = c.Cells(1, 3).Value

sei que está parte é (linha, coluna), mais não consegui fazer uma Instrução de repetição para dar continuidade nas próximas linhas.

Att,

Francisco

 
Postado : 26/11/2017 5:12 pm
(@fcarlosc)
Posts: 0
New Member
Topic starter
 

Boa-noite

Alguém para dar um "help" nesse formulário...!?
Falta pouco para completar a 1ª fase.

Att,

Francisco

 
Postado : 30/11/2017 7:18 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

fcarlosc,

Boa tarde!

Examinei seu código e verifiquei que fica inviável o tipo de comparação que você quer fazer. Pelo menos comparando todos os 27 campos das planilhas (exceto a coluna A). Veja:
1 - A lógica montada no seu "AfterUpdate" está equivocada. Ela jamais ira fazer a comparação de todos os campos. Para fazer a comparação que você quer seriam necessários pelos menos dois FOR e vários IF's e ELSEIF's. Isso tornaria a comparação e a planilha muito lenta, principalmente quando imaginarmos uma planilha com mais de 1.000 linhas por exemplo.

No arquivo anexo, comecei a fazer uma lógica diferente da sua e que faria a comparação da forma que você quer. Ou seja, verificar cada um dos campos das duas planilhas e se não forem iguais, destacar a caixa de texto no formulário com a cor amarela. Veja que só no primeiro IF dentro do laço, já houve a necessidade de comparar a igualdade entre todos os campos. Se todos forem iguais, é só levar os valores para todas as caixas de texto. Se tiver UM diferente, você vai para um ELSE. Nesse ELSE você precisa primeiro verificar se todas as linhas da planilha VER já foram verificadas (If j = UltimaLinhaVER). Somente após isso, é que você vai ter que descobrir que colunas são diferentes.

A partir desse ponto, os IF's e ELSEIF's que devem ter dentro do código são imensos. Isso tornará a planilha inviável, pois você terá que combinar coluna a coluna (só aí serão 27 ELSEIF's, depois terão as outras combinações: combinar B com B e com C (27 x 3 combinações), combinar B com B, com C e com D ( 27 x 4 combinações) e assim por diante até quando tiver apenas A combinando com A e todas as outras forem diferentes. Aí fica fácil pois é só tornar todas as caixas de texto amarelas.

Se você realmente precisa dessa comparação, tem duas saídas:
1 - continuar o código que eu comecei até o final, correndo o risco de inviabilizar seu arquivo.
2 - Pensar em uma forma diferente de fazer a comparação.

Atenção: O arquivo não está funcionando pois o código não foi terminado. Veja nos comentários que entenderá a lógica e o código.

 
Postado : 02/12/2017 1:41 pm