Jump to content

Dificuldade com a Estrutura For Each e If em uma macro Excel


Ariane

Recommended Posts

Olá tenho uma tarefa, de macro em Excel, para resolver que me ocupa a cabeça já há vários dias...

Já fiz e refiz ,  até achei um código nesta plataforma que me auxiliou muito. Porém, estou com um problema em uma estrutura de repetição nesse código.

Vou deixar aqui o exercício, bem como a minha tentativa , na esperança que alguém me possa direcionar no caminho, sinto que estou perto mas alguma coisa falha..

//Exercício

Fazer uma macro que possa garantir o preenchimento automático de um dado específico na planilha. Esse dado, que será preenchido automaticamente, depende de outros dados específicos do preenchimento da planilha mas que estão correlacionados à ele.

 

//Código feito

Private Sub tbx2_Change()                  'Dentro do campo anterior,  do dado a ser preenchido automaticamente, comecei o código e chamei a macro relacionada que executará o programa principal.

If cx1.Value = "Novo" Then                  'Ele terá a opção de não ser "novo", por isso tem esse If.
    If cx2.Value = "PNM" Then               'Ele terá a opção de não ser "PNM", por isso tem esse If.
        If tbx2.Value = "001" Then            'Ele terá a opção de não ser "PNM", por isso tem esse If.
            Call Comparacao                       'Chamando a macro
        End If
    End If

End If

End Sub



              //Macro

Sub Comparacao()

Dim L As Range

    For Each L In Range("D5:D100")                                                   'D5:D100 será o tamanho da coluna que a estrutura For Each terá que ler
        If L.Value <> "001A"  Then                                                       'Estou com dificuldades para fazer a estrutura If, pois preciso garantir a fidelidade de que não entre novamente no mesmo If                                                                                                                    'quando sair e entrar no formulário para novo cadastro, pois não poderá repetir os valores de preenchimento automático (Valores                                                                                                            'para preenchimento automático serão: 001A, 002A, 003A...
            UserForm1.tbx3.Value = "001A"


       ElseIf L.Value <> 002A Then
            UserForm1.tbx3.Value = "002A"

        ElseIf L.Value <> 003A Then
            UserForm1.tbx3.Value = "003A"
        
        ElseIf L.Value <>"004A" Then
            UserForm1.tbx3.Value = "004A"
            
        Else:
        UserForm1.tbx3.Value = "001A"
            
        End If
        Exit Sub
    Next
End Sub

 

//Dificuldades encontrada:

Toda que entro no formulário para o preenchimento, o dado a ser preenchido automaticamente, é preenchido com valor repetido. Pois como a estrutura de repetição lê as linhas em vazio ela interpretará como valor diferente.

 

Atenciosamente, Ariane.

Fico no aguardo, de uma possível ajuda.

Obrigada!

Link to comment
Share on other sites

  • 1 year later...

Boa noite.
Acho que o teu problema está mal colocado e não deixa saber exatamente o que pretendes.
 

Em 12/02/2021 às 12:01, Ariane disse:
//Código feito

Private Sub tbx2_Change()                  'Dentro do campo anterior,  do dado a ser preenchido automaticamente, comecei o código e chamei a macro relacionada que executará o programa principal.

If cx1.Value = "Novo" Then                  'Ele terá a opção de não ser "novo", por isso tem esse If.
    If cx2.Value = "PNM" Then               'Ele terá a opção de não ser "PNM", por isso tem esse If.
        If tbx2.Value = "001" Then            'Ele terá a opção de não ser "PNM", por isso tem esse If.
            Call Comparacao                       'Chamando a macro
        End If
    End If

End If

End Sub

Nesta parte do código que presumo inclua 3 Caixas de texto (TextBox), a sub Comparação é chamada se as tres condições se verificarem em simultâneo?
Se for isso deves escrever o código desta forma:
 

If cx1.Value = "Novo" and cx2.value = "PNM" and tbx2.Value = "001" Then           
      Call Comparacao 
End If

 

Em 12/02/2021 às 12:01, Ariane disse:
Dim L As Range

    For Each L In Range("D5:D100")                                                   'D5:D100 será o tamanho da coluna que a estrutura For Each terá que ler
        If L.Value <> "001A"  Then                                                       'Estou com dificuldades para fazer a estrutura If, pois preciso garantir a fidelidade de que não entre novamente no mesmo If                                                                                                                    'quando sair e entrar no formulário para novo cadastro, pois não poderá repetir os valores de preenchimento automático (Valores                                                                                                            'para preenchimento automático serão: 001A, 002A, 003A...
            UserForm1.tbx3.Value = "001A"


       ElseIf L.Value <> 002A Then
            UserForm1.tbx3.Value = "002A"

        ElseIf L.Value <> 003A Then
            UserForm1.tbx3.Value = "003A"
        
        ElseIf L.Value <>"004A" Then
            UserForm1.tbx3.Value = "004A"
            
        Else:
        UserForm1.tbx3.Value = "001A"
            
        End If
        Exit Sub
    Next

Nesta parte do código tens que rever bem as condições, pois a variável L.Value pode assumir vários valores nas condições que colocas:
<>001A, pode ser 002A, 003A, 004A
<>002A, pode ser 001A, 003A, 004A
Na primeira condição <> 001A, o código vai colocar tudo como 001A e deixa de existir 002A, 003A e 004A, certo?
Revê isso bem.
 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.