VBA Excel - Senha e Usuários

Dezembro 2016


Esta dica permite que você configure sua planilha do Excel para que cada usuário acesse apenas as folhas que lhe são autorizadas.

Introdução


O objetivo é que cada usuário possa acessar o arquivo com sua senha pessoal e que fique limitado à leitura e às alterações de certas páginas do arquivo. Cada usuário teria acesso às suas planilhas e somente à estas, especificamente. Por outro lado, ele precisaria de uma senha de administrador para acessar todas as planilhas.

Apresentação


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,
  • Verificar se a senha corresponde ao nome do usuário,
  • Verificar todas as planilhas, exibir as que correspondem ao usuário e ocultar "fortemente" as outras.

Se quiser, vamos adicionar um código:
  • Ao carregar o UserForm :
    • Limpeza das duas caixas de texto (TextBox),
    • Alteração das propriedades de "caption" do UserForm, das 2 etiquetas e do CommandButton para exibir o que quiser (Usuário, Senha, Confirmar, etc).
    • Para que apareçam apenas *** no lugar dos caracteres digitados no "textbox de senha".


OBSERVAÇÃO: Eu chamo ocultar "fortemente" uma planilha, o fato de não poder exibí-la, mesmo através do menu Exibir. Para isso, a propriedade Visível da planilha deve ser definida como: xlSheetVeryHidden ("planilha excel fortemente oculta").

O UserForm (formulário)


Para criar este UserForm, precisamos acessar o editor VBA. Para se familiarizar com ele, você pode consultar esta dica. Para acessá-lo:
  • Abra a pasta interessada,
  • Em qualquer planilha da pasta de arquivo, digite o arquivo de teclado: ALT+F11

No editor VBA, vamos criar notre UserForm. Pour cela, rien de plus simple :
Menu: Inserir > Escolher: UserForm.
Obteremos isto:

OBSERVAÇÃO: Se a caixa de ferramentas não aparecer por padrão: Menu > Exibir, clique em "Caixa de ferramentas".

Os controles de nosso UserForm


Na caixa de ferramentas, passando por cima dos ícones com o mouse, vamos identificar os controles que nos interessam hoje, a saber:
  • Título
  • Zona de texto
  • Botão de comando

Para desenhar em nosso formulário (UserForm), basta clicar na caixa de ferramentas, no ícone correspondente e desenhar, com o mouse, o controle que você desejar, no formulário, no lugar de sua escolha. Você deverá desenhar no formulário dois títulos (labels - em verde na imagem), duas caixas de texto (textbox) e um botão de comando (CommandButton - vermelho na imagem).

NOTA: Não mude os nomes que aparecem (Título1, Título2, UserForm, etc). É com o código que vamos alterá-los.

Em compensação, você pode definir imediatamente as cores e os tamanhos do seu UserForm e seus controles. Para isso, selecione-os, um por um, e faça as configurações desejadas na janela "Propriedades".

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.

Para isso: Menu > Inserir; Escolha: 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, por que 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 Casa, os nomes NOME1, NOME2, etc.
'em compensação, digite-os apenas em MAIÚSCULAS
'Você pode adicionar ou retirar de acordo com...
Casa "NOME1"
'se a senha digitada para o usuário NOME1 for "PASS1" então é VERDADEIRO
If Senha = "PASS1" Then VerifMDP = True

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

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

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

Casa 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

Sub AfficheFeuilles(Usuário As String)
Dim Ws As Worksheet, Planilhas(), Pos As Integer
'ADAPTE todas as casas como na função
Select Casa Usuário
Casa "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
Casa "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

Casa "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

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

Casa 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 (UserForm). 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 UserForm. Você entra, 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 2 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 :

Sob o código que você acabou de colar, copie/cole isso:

'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 sua pasta de trabalho:
- Só apareça a planilha "Plan1" (todas as outras planilhas foram ocultas fortemente)
- Apareça o seu Userform
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 sua pasta de trabalho para testar.

Exemplo


Aqui, você encontrará uma pasta de demonstração. Nome do usuário: ADMIN, senha: ADMIN (que você poderá digitar tanto em minúsculas quanto em maiúsculas).

Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « VBA Excel - Senha e Usuários »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.