VBA Excel - criar senhas individuais para os usuários

O objetivo de criar senhas individuais no Excel é que cada um possa acessar o arquivo com sua senha pessoal e fique limitado à leitura e alterações apenas de algumas páginas do arquivo. Cada usuário terá, desse modo, acesso somente a determinadas planilhas e somente uma senha de administrador dá acesso a todas as planilhas.

Como criar senhas para um arquivo do Excel

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

O código VBA do botão deverá verificar se as duas caixas 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 para limpar as duas caixas de texto ao carregar o formulário e fazer com que apareçam apenas asteriscos no lugar dos caracteres digitados no campo dedicado à senha.

Como criar um formulário

Para criar esse formulário, acesse a interface VBA (atalho Alt + F11). Agora, na barra de ferramentas, clique em Inserir > UserForm:

Agora, na caixa de ferramentas, clique sobre o ícone que deseja e desenhe o espaço que ele ocupará na janela do formulário. Para o nosso caso, precisaremos de dois rótulos (ícone A), duas caixas de texto (ícone abl) e um botão de comando (ícone ab). Os ícones estão indicados na imagem abaixo:

Para projetar 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. Será com o código que vamos alterá-los. Em compensação, você pode definir 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

Para não sobrecarregar os códigos de nosso formulário, vamos colocar, em um módulo padrão, os códigos para verificar a senha e exibir as planilhas. Na barra de ferramentas da interface VBA, 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 formulário. Se não for o caso, localize UserForm1 na janela no canto superior esquerdo e clique duas vezes sobre ele.

Agora, clique duas vezes no botão de comando no seu formulário. Entre 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 com o botão esquerdo do mouse sobre o botão de comando. Remova essas duas linhas de código 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

Por último, na inicialização do UserForm, copie e cole 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

Se você quer que, na abertura da pasta de trabalho, só apareça a planilha Plan1 e todas as outras permaneçam ocultas. Para isso, na coluna à esquerda, dê um duplo clique em ThisWorkbook. A janela de exibição do código da sua pasta de trabalho se abre. 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: © rawpixel - 123RF.com

Nosso conteúdo é produzido em colaboração com especialistas em tecnologia da informação sob o comando de Jean-François Pillou, fundador do CCM.net. CCM é um site sobre tecnologia líder em nível internacional e está disponível em 11 idiomas.
Veja também
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.

Assine nossa newsletter!

Assine nossa newsletter!
Junte-se à comunidade