VBA Excel - criar senhas individuais para os usuários

Novembro 2017

Esta dica permite que você configure sua planilha do Excel para que cada usuário acesse apenas as folhas que lhe são autorizadas. O objetivo de criar senhas individuais para os vários usuários é que cada um deles possa acessar o arquivo com sua senha pessoal e que fique limitado à leitura e às alterações apenas de algumas páginas do arquivo. Cada usuário terá, desse modo, acesso às suas planilhas e somente a elas. Por outro lado, ele precisaria de uma senha de administrador para acessar todas as planilhas.


Como criar e gerenciar várias senha para um mesmo arquivo VBA Excel

Vamos inserir um UserForm (formulário) que aparecerá na abertura do arquivo. Nesta interface, precisaremos de duas etiquetas (tags), duas caixa de texto para digitar o nome e a senha de um CommandButton (botão de comando) para confirmar.

O código VBA do botão deverá verificar se as duas caixa de texto foram preenchidas, se a senha corresponde ao nome do usuário e verificar todas as planilhas, exibindo as que correspondem ao usuário e ocultando as demais.


Se quiser, vamos adicionar um código ao carregar o formulário para limpar as duas caixas de texto (textbox) e alteração das propriedades de caption do formulário, das duas etiquetas e do CommandButton, além de fazer com que apareçam apenas *** no lugar dos caracteres digitados no campo dedicado à senha.

O UserForm (formulário)

Para criar este formulário, precisamos acessar o editor VBA. Para se familiarizar com ele, você pode consultar essa dica e instalar o software.

Para acessá-lo abra a pasta que deseja proteger e, em qualquer planilha da pasta de arquivo, digite ALT + F11. No editor VBA, vamos criar nosso formulário. Para tanto, abra o menu e selecione Inserir > Escolher > UserForm. Obteremos isto:


Se a caixa de ferramentas não aparecer por padrão, abra o menu, selecione Exibir e clique em Caixa de ferramentas.

Quais são os controles do UserForm

Na caixa de ferramentas, passe o mouse por cima dos ícones para identificar os que você necessita (título, zona de texto e botão de comando). Para desenhar em nosso formulário, basta clicar no ícone correspondente e desenhar, com o mouse, o controle que você deseja e no lugar de sua escolha. Você deverá desenhar no formulário dois títulos (em verde na imagem), duas caixas de texto e um botão de comando (em vermelho):



Não mude os nomes que aparecem (Título1, Título2, UserForm etc). Será com o código que vamos alterá-los. Em compensação, você pode definir imediatamente cores e tamanhos do formulário e seus controles. Para isso, selecione-os, um por um, e faça as configurações desejadas na janela Propriedades.

Criar o código

As rotinas

Para não sobrecarregar os códigos de nosso UserForm, vamos colocar, em um módulo padrão, os códigos para verificar a senha e exibir as planilhas. Entre no menu e escolha Inserir > Módulo. Na janela de exibição do código do módulo criado, copie e cole esses dois procedimentos:

Opção Explicit

'Eu fiz a escolha de uma função, pois trata-se de saber
'se a senha corresponde ao usuário.
'portanto, é necessário um processo que compare os 2
'e que retorne VERDADEIRO ou FALSO (daí a função declarada As Boolean).
'AQUI: (Usuário As String, Senha As String)
'são configurações enviadas ao clicar no botão

Function VerificarSENHA(Usuário As String, Senha As String) As Boolean
VerificarSENHA = Falso 'por padrão, enviar FALSO
'Segundo o usuário digitado
Select Case Usuário
'aqui você deverá adaptar os nomes de cada usuário
'Você poderá alterar, em cada caixa, os nomes NOME1, NOME2, etc.
'em compensação, digite-os apenas em MAIÚSCULAS
'Você pode adicionar ou retirar de acordo com...
Caixa NOME1
'se a senha digitada para o usuário NOME1 for "PASS1" então é VERDADEIRO
If Senha = "PASS1" Then VerifMDP = True

Caixa NOME2
'se a senha digitada para o usuário NOME2 for "PASS2" então é VERDADEIRO
If Senha = "PASS2" Then VerifMDP = True

Caixa NOME3
'se a senha digitada para o usuário NOME3 for "PASS3" então é VERDADEIRO
If Senha = "PASS3" Then VerifMDP = True

Caixa ADMIN
'se a senha digitada para o usuário ADMIN for "PASS4" então é VERDADEIRO
If Senha = "PASS4" Then VerifMDP = True

Caixa Else
'se o nome do usuário digitado não existir então:
'mensagem para o usuário:
MsgBox "O nome do usuário digitado não existe. Favor verificar."

End Select
End Function

Usuário As String
Dim Ws As Worksheet, Planilhas(), Pos As Integer
'ADAPTE todas as caixas como na função
Select Caixa Usuário
Caixa NOME1
'coloque no array, todas as planilhas que o NOME1 deve acessar
Planilhas = Array("Plan5", "Plan7", "Plan8")
On Error Resume Next 'Application.Match sendo fonte de erro
'verifique em todas as planilhas da pasta de trabalho
For Each Ws In ThisWorkbook.Worksheets
'Verificamos se o nome da planilha faz parte do Array preenchido acima
Pos = Application.Match(Ws.Name, Planilhas, 0)
'Se SIM, então
If Pos <> 0 Then
'mostramos a planilha
Ws.Visible = True
'reinicializamos a posição
Pos = 0
Else 'se não
'ocultamos fortemente a planilha
Ws.Visible = xlSheetVeryHidden
'reinicializamos a posição
Pos = 0
End If
Next Ws
Caixa "NOME2"
'coloque no array, todas as planilhas que o NOME2 deve acessar
Planilhas = Array("Plan2", "Plan3", "Plan4")
On Error Resume Next 'Application.Match sendo fonte de erro
'verifique em todas as planilhas da pasta de trabalho
For Each Ws In ThisWorkbook.Worksheets
'Verificamos se o nome da planilha faz parte do Array preenchido acima
Pos = Application.Match(Ws.Name, Planilhas, 0)
'Se SIM, então
If Pos <> 0 Then
'mostramos a planilha
Ws.Visible = True
'reinicializamos a posição
Pos = 0
Else 'sinon
'ocultamos fortemente a planilha
Ws.Visible = xlSheetVeryHidden
'reinicializamos a posição
Pos = 0
End If
Next Ws

Caixa NOME3
'coloque no array, todas as planilhas que o NOME3 deve acessar
Planilhas = Array("Plan6", "Plan9", "Plan10")
On Error Resume Next 'Application.Match sendo fonte de erro
'verifique em todas as planilhas da pasta de trabalho
For Each Ws In ThisWorkbook.Worksheets
'Verificamos se o nome da planilha faz parte do Array preenchido acima
Pos = Application.Match(Ws.Name, Planilhas, 0)
'Se SIM, então
If Pos <> 0 Then
'mostramos a planilha
Ws.Visible = True
'reinicializamos a posição
Pos = 0
Else 'sinon
'ocultamos fortemente a planilha
Ws.Visible = xlSheetVeryHidden
'reinicializamos a posição
Pos = 0
End If
Next Ws

Caixa "ADMIN" 'aqui mostramos todas as planilhas sem exceção
For Each Ws In ThisWorkbook.Worksheets
Ws.Visible = True
Next Ws

Caixa Else
'como não existem outros casos, eu coloco aqui uma mensagem de erro fatal desnecessária
MsgBox "O usuário retorna um erro fatal", vbCritical
End Select
End Sub

Voltemos ao nosso formulário. Ao fechar a janela de exibição do código do módulo, devemos rever o nosso UserForm. Se não for o caso, na janela VBA-Project (canto superior esquerdo) clique duas vezes no UserForm1 para fazê-lo reaparecer.

Do botão de comando: clique duas vezes no botão de comando no seu formulário. Entre, então, na janela de exibição do código onde você obterá estas duas linhas:

Private Sub CommandButton1_Click()
End Sub

Qualquer código, colocado entre essas duas linhas, será executado a cada clique esquerdo no seu botão. Remova essas duas linhas de código e substitua-os por:

Option Explicit

'Código que se aciona com o clique no botão
Private Sub CommandButton1_Click()
'Se o textbox1 estiver vazio
If textbox1 = "" Then
'Mensagem para o usuário
MsgBox "Entrada do nome do usuário obrigatória.", vbInformation
'saída do procedimento
Exit Sub
End If
'Idem com o textbox2
If textbox2 = "" Then
MsgBox " Entrada do nome do usuário obrigatória.", vbInformation
Exit Sub
End If
'Executa a função VerifMDP usando:
'- textbox1 (transformado em maiúsculo) como configuração "Usuário"
'- textbox2 (transformado em maiúsculo) como configuração "Senha"
'UCase(textbox1) = conteúdo do textbox1 com letras maiúsculas
'Se a função reenviar FALSO:
If VerifSENHA(UCase(textbox1), UCase(textbox2)) = False Then
'é or que a senha ou o usuário é falsa
'Mensagem para o usuário
MsgBox "Erro de Senha e/ou usuário. Favor digitar novamente.", vbInformation
'esvaziamos os 2 textbox
textbox1 = ""
textbox2 = ""
'saímos do procedimento
Exit Sub
End If
'A partir daqui, o código só é executado quando a senha e o nome estão corretos.
'Podemos ver as planilhas que correspondem ao usuário digitado
MostraPlanilhas UCase(textbox1)
'oculta o UserForm
UserForm1.Hide
End Sub

Na inicialização do UserForm: Cole e copie o que que você vê, abaixo do código

'código se ativando na abertura do UserForm1
Private Sub UserForm_Initialize()
'esvaziamento dos textbox :
textbox1 = ""
textbox2 = ""
'definição das propriedades Caption
'do UserForm:
Me.Caption = "Entrada da Senha"
'das etiquetas:
Label1.Caption = "Usuário"
Label2.Caption = "Senha"
'do botão
CommandButton1.Caption = VALIDAR
'Substitui os caracteres digitados no textbox2 por asteriscos
Me.textbox2.PasswordChar = "*"
End Sub

Na abertura da pasta de trabalho: você quer que na abertura da pasta de trabalho só apareça a planilha Plan1 (todas as outras planilhas ocultas). Para isso, ainda no editor VBA, na janela do VBA-Project, clique duas vezes no ThisWorkbook, a janela de exibição do código da sua pasta de trabalho se abre, vazia. Copie e cole o seguinte código:

Option Explicit

Private Sub Workbook_Open()
Dim Ws As Worksheet

'Oculte todas as planilhas exceto a planilha Plan1
'!!!! ADAPTE o nome da planilha que vai continuar a ser exibida
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name <> "Plan1" Then Ws.Visible = xlSheetVeryHidden
Next Ws
'Carrega o UserForm na memória
Load UserForm1
'Exibe o UserForm
UserForm1.Show
End Sub

Agora você poderá fechar o editor VBA, salvar a sua pasta de trabalho, fechar e abrir novamente a pasta de trabalho para testar.

Foto: © Microsoft.
Artigo original publicado por jak58. Tradução feita por pintuda. Última modificação: 19 de outubro de 2017 às 10:21 por Pedro.CCM.
Este documento, intitulado 'VBA Excel - criar senhas individuais para os usuários', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.