none
Outro MsgBox para validar a primeira digitação de senha RRS feed

  • Pergunta

  • Prezados,

    A macro abaixo, tanto de proteger, quanto de desproteger planilhas, estão funcionando bem.

    Contudo o quadro, o MsgBox, que surge para que seja digitada a senha não pede a confirmação da senha. Ou seja, caso eu erre na primeira digitação, jamais descobrirei o erro e as planilhas ficarão definitivamente travadas.

    Gostaria que houvesse uma segunda digitação da senha para validar a primeira.

    Agradecido.


    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String
        Dim lQtdePlan As Integer
        Dim lPlanAtual As Integer
     
        'Solicita a senha
        'O método InputBox é utilizado para solicitar um valor através de um formulário
        lPass = InputBox("Proteger todas as planilhas:", "Senha")
     
        'Inicia as variáveis
        'O método Worksheets.Count passa a quantidade de planilhas existentes no arquivo
        lQtdePlan = Worksheets.Count
        lPlanAtual = 1
     
        'Loop pelas planilhas
        'A função While realiza um loop de código enquanto não passar por todas as planilhas contadas
        While lPlanAtual <= lQtdePlan
            'O método Worksheets(lPlanAtual).Activate ativa a planilha conforme o índice atual 1, 2, 3...
            Worksheets(lPlanAtual).Activate
     
            'O método .Protect proteje a planilha passando os parâmetros para proteger
            'objetos de desenho, conteúdo, cenários e passando o password digitado
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=lPass
     
            'Muda o índice para passar para a próxima planilha
            lPlanAtual = lPlanAtual + 1
        Wend
     
        'O método MsgBox exibe um formulário de aviso ao usuário.
        MsgBox "Planilhas protegidas!"
     
    End Sub
    Sub lsDesprotegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String
        Dim lQtdePlan As Integer
        Dim lPlanAtual As Integer
     
        'Solicita a senha
        'O método InputBox é utilizado para solicitar um valor através de um formulário
        lPass = InputBox("Desproteger todas as planilhas:", "Senha")
     
        'Inicia as variáveis
        'O método Worksheets.Count passa a quantidade de planilhas existentes no arquivo
        lQtdePlan = Worksheets.Count
        lPlanAtual = 1
     
        'Loop pelas planilhas
        'A função While realiza um loop de código enquanto não passar por todas as planilhas contadas
        While lPlanAtual <= lQtdePlan
            'O método Worksheets(lPlanAtual).Activate ativa a planilha conforme o índice atual 1, 2, 3...
            Worksheets(lPlanAtual).Activate
     
            'O método .UnProtect desprotege a planilha
            ActiveSheet.Unprotect Password:=lPass
     
            'Muda o índice para passar para a próxima planilha
            lPlanAtual = lPlanAtual + 1
        Wend
     
        'O método MsgBox exibe um formulário de aviso ao usuário.
        MsgBox "Planilhas desprotegidas!"
     
    End Sub


    Marco Antonio.

    sábado, 12 de janeiro de 2019 17:55

Respostas

  • Revendo seu código original percebi que você apagou duas linhas importantes que eliminariam este problema:

    'Inicia as variáveis
        'O método Worksheets.Count passa a quantidade de planilhas existentes no arquivo
        lQtdePlan = Worksheets.Count
        lPlanAtual = 1

    Aproveitando, em casos como este, é mais simples e legível utilizar um "For" ao invés do "While" (ambos funcionam):

    For i = 1 to lQtdePlan

    '...

    De toda forma, retornando com as linhas eliminadas seu código deve funcionar.

    Qualquer coisa avisa aí.


    Filipe Magno

    • Marcado como Resposta Marco1226 segunda-feira, 21 de janeiro de 2019 20:15
    segunda-feira, 21 de janeiro de 2019 19:48
  • Deu certíssimo.

    Obrigado.


    Marco Antonio.

    • Marcado como Resposta Marco1226 segunda-feira, 21 de janeiro de 2019 20:15
    segunda-feira, 21 de janeiro de 2019 20:15

Todas as Respostas

  • há algumas formas de fazer, mas talvez a mais simples seja:

    Dim lpass As String, lpass1 As String, lpass2 As String Do 'Solicita a senha 'O método InputBox é utilizado para solicitar um valor através de um formulário lpass1 = InputBox("Proteger todas as planilhas:", "Senha") lpass2 = InputBox("Proteger todas as planilhas:", "Confirma sua Senha")

    'Se deixar sem senha for permitido, sugiro emitir um aviso antes de prosseguir e alterar o teste a seguir. If lpass1 = lpass2 And lpass1 <> vbNullString Then lpass = lpass1: Exit Do 'Aqui você pode incluir um escape se for possível desistir de inserir senha (basta incluir uma variável na resposta do MsgBox): MsgBox "As senhas digitadas não conferem, tente de novo!", vbCritical, "Erro nas senhas!" Loop


    Atende?

    Filipe Magno

    sábado, 12 de janeiro de 2019 18:19
  • Bom dia,

    Não consegui meu amigo. Quando inclui os códigos realmente apareceu as duas caixas de mensagens, porém a mensagem avisando que a senha estava errada continuava aparecendo mesmo a senha sendo digitada corretamente.

    Se possível peço que introduza nos códigos abaixo as mudanças, pois, por falta de conhecimento, senti dificuldades em fazê-lo. Ou seja, peço que envie os códigos para que eu possa apenas copiar e colar. Veja o original abaixo:

    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String
        Dim lQtdePlan As Integer
        Dim lPlanAtual As Integer
     
        'Solicita a senha
        'O método InputBox é utilizado para solicitar um valor através de um formulário
        lPass = InputBox("Proteger todas as planilhas:", "Senha")
     
        'Inicia as variáveis
        'O método Worksheets.Count passa a quantidade de planilhas existentes no arquivo
        lQtdePlan = Worksheets.Count
        lPlanAtual = 1
     
        'Loop pelas planilhas
        'A função While realiza um loop de código enquanto não passar por todas as planilhas contadas
        While lPlanAtual <= lQtdePlan
            'O método Worksheets(lPlanAtual).Activate ativa a planilha conforme o índice atual 1, 2, 3...
            Worksheets(lPlanAtual).Activate
     
            'O método .Protect proteje a planilha passando os parâmetros para proteger
            'objetos de desenho, conteúdo, cenários e passando o password digitado
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=lPass
     
            'Muda o índice para passar para a próxima planilha
            lPlanAtual = lPlanAtual + 1
        Wend
     
        'O método MsgBox exibe um formulário de aviso ao usuário.
        MsgBox "Planilhas protegidas!"
     
    End Sub

    Muito obrigado.


    Marco Antonio.

    domingo, 13 de janeiro de 2019 12:39
  • Bom, é possível elaborar mais o código, pra ficar mais robusto, mas de maneira simples, o que precisa fazer é trocar:

    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String
        Dim lQtdePlan As Integer
        Dim lPlanAtual As Integer
     
        'Solicita a senha
        'O método InputBox é utilizado para solicitar um valor através de um formulário
        lPass = InputBox("Proteger todas as planilhas:", "Senha")
    
    
    '(Continua...)

    Por:

    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String, lpass1 As String, lpass2 As String
        Dim lQtdePlan As Long
        Dim lPlanAtual As Long
     
        Do
        	'Solicita a senha
        	'O método InputBox é utilizado para solicitar um valor através de um formulário
        	lpass1 = InputBox("Proteger todas as planilhas:", "Senha")
        
        	lpass2 = InputBox("Proteger todas as planilhas:", "Confirma sua Senha")
        
    
        	'Se deixar sem senha for permitido, sugiro emitir um aviso antes de prosseguir e alterar o teste a seguir.
        	If lpass1 = lpass2 And lpass1 <> vbNullString Then lpass = lpass1: Exit Do
        
        	'Aqui você pode incluir um escape se for possível desistir de inserir senha (basta incluir uma variável na resposta do MsgBox):
        	MsgBox "As senhas digitadas não conferem, tente de novo!", vbCritical, "Erro nas senhas!"
        Loop
    
    
    '(Continua...)

    Compreendeu?


    Filipe Magno

    domingo, 13 de janeiro de 2019 18:12
  • Boa tarde Filipe,

    Quase funcionou. Pediu a senha, depois pediu a repetição da senha. Porém ao clicar na repetição da senha surgiu a mensagem: "Subscrito fora do Intervalo". E não completou o travamento das planilhas.

    Veja abaixo os códigos que usei:

    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String, lpass1 As String, lpass2 As String
        Dim lQtdePlan As Long
        Dim lPlanAtual As Long
     
        Do
            'Solicita a senha
            'O método InputBox é utilizado para solicitar um valor através de um formulário
            lpass1 = InputBox("Proteger todas as planilhas:", "Senha")
        
            lpass2 = InputBox("Proteger todas as planilhas:", "Confirma sua Senha")
        

            'Se deixar sem senha for permitido, sugiro emitir um aviso antes de prosseguir e alterar o teste a seguir.
            If lpass1 = lpass2 And lpass1 <> vbNullString Then lPass = lpass1: Exit Do
        
            'Aqui você pode incluir um escape se for possível desistir de inserir senha (basta incluir uma variável na resposta do MsgBox):
            MsgBox "As senhas digitadas não conferem, tente de novo!", vbCritical, "Erro nas senhas!"
        Loop


     
        'Loop pelas planilhas
        'A função While realiza um loop de código enquanto não passar por todas as planilhas contadas
        While lPlanAtual <= lQtdePlan
            'O método Worksheets(lPlanAtual).Activate ativa a planilha conforme o índice atual 1, 2, 3...
            Worksheets(lPlanAtual).Activate
     
            'O método .Protect proteje a planilha passando os parâmetros para proteger
            'objetos de desenho, conteúdo, cenários e passando o password digitado
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=lPass
     
            'Muda o índice para passar para a próxima planilha
            lPlanAtual = lPlanAtual + 1
        Wend
     
        'O método MsgBox exibe um formulário de aviso ao usuário.
        MsgBox "Planilhas protegidas!"
     
    End Sub

    Como corrigir?

    Muito obrigado.


    Marco Antonio.

    quinta-feira, 17 de janeiro de 2019 16:10
  • Pelo que vejo no código, há possibilidade de ocorrer este erro em:

    Worksheets(lPlanAtual).Activate

    uma vez que sua variável "lPlanAtual" começa em "Zero" e deveria começar em "1".

    Onde ficou marcado o erro que citou? Na parte de digitação da senha não faz sentido.

    Aguardo.



    Filipe Magno

    segunda-feira, 21 de janeiro de 2019 00:23
  • Boa tarde Filipe,

    Posso mandar o arquivo para seu email? Ao rodar a macro você descobrirá o erro rapidinho.

    Aguardo e agradeço.

    Marco.


    Marco Antonio.

    segunda-feira, 21 de janeiro de 2019 16:20
  • Boa tarde.

    Se quiser mandar o arquivo, anexe-o no OneDrive e cole o link aqui, mas antes de fazer isso execute seu código linha a linha (F8) e identifique onde ocorre o erro. Com certeza a linha que indiquei está com erro e exibirá uma mensagem igual a que você relatou.


    Filipe Magno

    segunda-feira, 21 de janeiro de 2019 16:58
  • Boa tarde,

    Executei e realmente o erro foi onde você indicou. Abaixo coloco em negrito o lugar exato.

    Contudo não sei como acertar. O que sugere?

    Sub lsProtegerTodasAsPlanilhas()
        'Declara as variáveis necessárias
        Dim lPass As String, lpass1 As String, lpass2 As String
        Dim lQtdePlan As Long
        Dim lPlanAtual As Long
     
        Do
            'Solicita a senha
            'O método InputBox é utilizado para solicitar um valor através de um formulário
            lpass1 = InputBox("Proteger todas as planilhas:", "Senha")
        
            lpass2 = InputBox("Proteger todas as planilhas:", "Confirma sua Senha")
        

            'Se deixar sem senha for permitido, sugiro emitir um aviso antes de prosseguir e alterar o teste a seguir.
            If lpass1 = lpass2 And lpass1 <> vbNullString Then lPass = lpass1: Exit Do
        
            'Aqui você pode incluir um escape se for possível desistir de inserir senha (basta incluir uma variável na resposta do MsgBox):
            MsgBox "As senhas digitadas não conferem, tente de novo!", vbCritical, "Erro nas senhas!"
        Loop


     
        'Loop pelas planilhas
        'A função While realiza um loop de código enquanto não passar por todas as planilhas contadas
        While lPlanAtual <= lQtdePlan
            'O método Worksheets(lPlanAtual).Activate ativa a planilha conforme o índice atual 1, 2, 3...
            Worksheets(lPlanAtual).Activate
     
            'O método .Protect proteje a planilha passando os parâmetros para proteger
            'objetos de desenho, conteúdo, cenários e passando o password digitado
            ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=lPass
     
            'Muda o índice para passar para a próxima planilha
            lPlanAtual = lPlanAtual + 1
        Wend
     
        'O método MsgBox exibe um formulário de aviso ao usuário.
        MsgBox "Planilhas protegidas!"
     
    End Sub

    Grato.


    Marco Antonio.

    segunda-feira, 21 de janeiro de 2019 19:40
  • Revendo seu código original percebi que você apagou duas linhas importantes que eliminariam este problema:

    'Inicia as variáveis
        'O método Worksheets.Count passa a quantidade de planilhas existentes no arquivo
        lQtdePlan = Worksheets.Count
        lPlanAtual = 1

    Aproveitando, em casos como este, é mais simples e legível utilizar um "For" ao invés do "While" (ambos funcionam):

    For i = 1 to lQtdePlan

    '...

    De toda forma, retornando com as linhas eliminadas seu código deve funcionar.

    Qualquer coisa avisa aí.


    Filipe Magno

    • Marcado como Resposta Marco1226 segunda-feira, 21 de janeiro de 2019 20:15
    segunda-feira, 21 de janeiro de 2019 19:48
  • Deu certíssimo.

    Obrigado.


    Marco Antonio.

    • Marcado como Resposta Marco1226 segunda-feira, 21 de janeiro de 2019 20:15
    segunda-feira, 21 de janeiro de 2019 20:15