VBA - Criando um formulário de Login


Vou mostrar como podemos automatizar o Microsoft Excel usando a linguagem VBA através da criação de um formulário de Login para proteger o acesso a uma planilha Excel.

É uma aplicação simples que mostra aos iniciantes e interessados automatizar tarefas no Microsoft Excel usando a linguagem VBA. Só isso.

Os recursos usados no projeto deste artigo foram:

Antes de iniciar temos que realizar duas configurações no Microsoft Excel 2007:

Obs: A necessidade de habilitar a execução de macros é que por padrão, o Excel coloca um nível de segurança mais elevado pois códigos maliciosos podem ser executados em scripts através de macros no Excel.

Vamos ativar a guia do desenvolvedor e logo  em seguida habilitar a execução de macros.

Para ativar a guia do desenvolvedor (se ainda não estiver ativa) siga os seguintes passos:

Abra o Excel 2007 e ative o Menu principal de opções clicando no botão superior a esquerda, conforme a figura abaixo;

A seguir clique na guia Opções do Excel para abrir a janela - Opções do Excel;

Nesta janela, selecione o item - Mais Usados - e a seguir marque o item - Mostrar guia Desenvolvedor na Faixa de Opções e clique no botão OK;

No menu do Excel selecione a guia do Desenvolvedor e em seguida clique em Segurança de Macro;

Na janela Central de Confiabilidade selecione a opção - Configurações de Macro - e marque o item para habilitar todas as macros conforme a figura abaixo:

Pronto , feito isso já podemos iniciar o desenvolvimento da aplicação VBA no Excel 2007.

Criando o Formulário de Login

Existem muitas maneiras de você proteger os dados de suas planilhas Excel, e neste artigo eu vou mostrar como podemos criar um formulário de login usando a linguagem VBA. Essa pode não ser a melhor opção para o seu caso pois o próprio Excel possui recursos que você pode usar para proteger os seus dados.(planilha, célula, etc.)

Meu objetivo é criar um formulário que será apresentando ao usuário, quando a planilha for aberta no Excel, solicitando o nome e senha de acesso.

Eu não vou usar um banco de dados, vou armazenar o nome do usuário e a senha em uma planilha Excel e assim eu aproveito para mostrar como podemos acessar essas informações usando VBA.

Então vamos supor que você tenha uma planilha Excel com dados importantes e deseja proteger o seu conteúdo de forma que somente você possa acessá-la. Essa planilha foi nomeada como Fluxo_Caixa.xlsm.

Abra então o Excel 2007 e selecione a planilha Fluxo_Caixa abrindo no Excel;

Obs: Para outras versões do Excel as referências aos itens de menu e opções podem variar.

Abaixo vemos planilha aberta no Excel. É uma planilha comum que desejamos proteger.

Observe que a planilha Plan2 foi renomeada para Macoratti. (Para renomear clique com o botão direito do mouse sobre o nome da planilha e selecione Renomear informando o nome nome)

Neste momento é tudo o que temos.

Vamos inserir uma nova planilha (a planilha Plan3 foi excluía) clicando com o botão direito do mouse sobre a planilha FLuxoCaixa e selecionando a opção Inserir:

Na janela Inserir escolha a opção Planilha e clique em OK;

Será incluída uma nova planilha, altere o seu nome nome para Login;

Nesta planilha selecione a célula A1 e digite Usuário e na célula B1 digite macoratti;

Selecione a célula A2 e digite Senha e na célula B2 digite 313233343536;(Esta senha esta criptografada e mais adiante vamos ver como obtivemos esse valor)

Abaixo vemos a planilha Login contendo os valores digitados nas células A1,A2,B1 e B2:

Acabamos de armazenar o nome do usuário e a senha na planilha Login nas células : B1(macoratti) e B2(313233343536)

Com a planilha Excel aberta pressione as teclas ALT+F11. Se preferir clique no menu Desenvolvedor e a seguir na opção Visual Basic.

Isso abrira o Editor Visual Basic; No editor Visual Basic clique no menu Inserir e a seguir em UserForm;

Um novo formulário chamado UserForm será criado na área de trabalho do Editor.

Ao seu lado irá aparecer a Caixa de Ferramentas contendo os controles que vamos usar para criar o formulário;

À sua direita temos a Janela de Propriedades do controle selecionado que iremos usar para definir o nome e outras propriedades dos controles;

Vamos então arrastar a partir da caixa de ferramentas os seguintes controles para o formulário e a seguir vamos alterar as propriedades indicadas conforme abaixo:

De forma que leiaute do formulário tenha a seguinte aparência:

Agora vamos definir o código necessário para realizar a autenticação do usuário e assim permitir ou não o seu acesso a planilha Excel.

Para isso vamos usar o evento Click do botão cmdLogin.

Antes de definir o código neste evento vamos definir uma variável com o nome senha na seção Geral do Editor VBA.

Com a janela do Editor VBA aberta, clique com o botão direito sobre o formulário frmLogin e selecione Exibir Codigo;

A seguir digite a declaração da variável senha:

Public senha As String

A seguir volte para a exibição do formulário e clique duas vezes sobre o botão Login para abrir na janela do editor de código VBA o evento Click, e a seguir vamos incluir o seguinte código neste evento:

Private Sub cmdLogin_Click()
  
    senha = Encriptar(txtSenha.Text)
  
   If txtUsuario.Text = Plan2.Range("B1") And senha = Plan2.Range("B2") Then
      MsgBox ("Bem-Vindo ao Fluxo de Caixa")
      Application.Visible = True
      Unload frmLogin
      Plan1.Visible = xlSheetVisible
      Plan2.Visible = xlSheetVeryHidden
      Plan1.Activate
  Else
    MsgBox (" Usuário/Senha incorretos...")
    If contador = 0 Then
      MsgBox ("A aplicação será encerrada !")
      Application.DisplayAlerts = False
      Application.Quit
    Else
      MsgBox (" Restam ainda " & contador & " tentavivas para fetuar o login...")
      contador = contador - 1
      txtUsuario = Empty
      txtSenha = Empty
      txtUsuario.SetFocus
    End If
  End If
End Sub

Vamos entender o código:

a variável senha recebe um valor encriptado da senha informada na caixa de texto txtSenha.Text:  

senha = Encriptar(txtSenha.Text)

A função Encriptar recebe a senha e faz a codificação da mesma.

Para criar a função Encriptar clique no menu  Inserir -> Procedimento;

A seguir informe o nome Encriptar e marque o Tipo como sendo uma Função pois este procedimento deverá retonar um valor que é a senha encriptada.

A seguir digite o seguinte código  na rotina Encriptar:

Obs: Antes da rotina , na seção Geral defina o comando Option Explicit e a variável contador que iremos usar adiante

Option Explicit
Public contador As Integer

Function Encriptar(DataValue As Variant) As Variant
    Dim x As Long
    Dim Temp As String
    Dim TempNum As Integer
    Dim TempChar As String
    Dim TempChar2 As String      
    For x = 1 To Len(DataValue)
        TempChar2 = Mid(DataValue, x, 1)
        TempNum = Int(Asc(TempChar2) / 16)        
        If ((TempNum * 16) < Asc(TempChar2)) Then                 
            TempChar = ConvToHex(Asc(TempChar2) - (TempNum * 16))
            Temp = Temp & ConvToHex(TempNum) & TempChar
        Else
            Temp = Temp & ConvToHex(TempNum) & "0" 
        End If
    Next x
    Encriptar = Temp
End Function

A seguir repita o procedimento para criar a função ConvToHex() cujo código é exibido a seguir:

Private Function ConvToHex(x As Integer) As String
    If x > 9 Then
        ConvToHex = Chr(x + 55)
    Else
        ConvToHex = CStr(x)
    End If
End Function

As duas funções acima trabalham em conjunto para receber um valor string (tratado como variant) e retornar um valor codificado.

A variável contador declarada será visível em toda a aplicação Excel.

No exemplo o usuário irá digitar um valor para usuário e senha e o valor da senha será codificado e comparado com o valor que armazenamos na planilha Login.

Após isso verificamos se o nome do usuário e a senha, já encriptada, informada corresponde aos valores na planilha Plan2 (Login) que incluímos nas células B1 e B2. Para obter o valor de uma célula usamos o nome da planilha seguido do objeto Range e a célula desejada: Plan2.Range("B1")

 If txtUsuario.Text = Plan2.Range("B1") And senha = Plan2.Range("B2")

Se o usuário e a senha estiverem corretos então executamos o código abaixo

      MsgBox ("Bem-Vindo ao Fluxo de Caixa")   -> Exibe uma caixa de mensagem com o texto indicado
      Application.Visible = True                       -> torna a aplicação visível
      Unload frmLogin                                    -> descarrega o formulário de login
      Plan1.Visible = xlSheetVisible                  -> torna a planilha Plan1 visível
      Plan2.Visible = xlSheetVeryHidden           -> torna a planilha Plan2 invisível (assim o usuário não tem acesso ao usuário e senha)

      Plan1.Activate                                       -> ativa a planilha Plan1

O objeto Application representa o Excel; em seu contexto existem a pasta de trabalho, as planilhas , células, etc.

Abaixo temos a hierarquia do modelo de objetos Excel resumido

Caso o usuário e/ou a senha não correspondam então o código abaixo será executado:

    MsgBox (" Usuário/Senha incorretos...")             -> Exibe uma caixa de mensagem com o texto indicado
    If contador = 0 Then                                        -> verifica o valor da variável contador (que declaramos na rotina criada acima)
       MsgBox ("A aplicação será encerrada !")          -> Se o valor do contador for igual a zero exibe mensagem de encerramento da aplicação
       Application.DisplayAlerts = False                    -> desabilita a exibição de mensagens de alerta do Excel
       Application.Quit                                           -> Encerra a aplicação

    Else
      MsgBox (" Restam ainda " & contador & " tentavivas para fetuar o login...")     -> exibe mensagem indicando o valor do contador
      contador = contador - 1                                  -> decrementa o contador em uma unidade (definimos 3 tentativas)
      txtUsuario = Empty                                         -> limpa a caixa de texto Usuario
      txtSenha = Empty                                            -> limpa a caixa de texto Senha
      txtUsuario.SetFocus                                        -> põe o foco na caixa de texto Usuario  
   End If

Dessa forma , já temos o formulário e o código prontos para uso.

Como e onde iremos usar esse código ?

Queremos que quando o usuário abra a  pasta de trabalho, e por consequência a planilha, o formulário de login seja apresentado para informação do usuário e senha.

Para isso temos que usar o evento Open da pasta de trabalho (WorkBook);

No editor de código VBA clique com o botão direito do mouse sobre o item EstaPasta_de_trabalho e selecione o item Exibir Código;

A seguir inclua o código conforme mostra a figura baixo no evento Open do WorkBook:

O código que será executado é o seguinte:

Application.EnableCancelKey = xlDisabled        
contador = 3
Plan1.Visible = xlSheetVeryHidden
Plan2.Visible = xlSheetVeryHidden
frmLogin.Show

- Primeiro desabilitamos as tecla ESC e Ctrl+Break de forma a impedir que o usuário interrompa a execução da macro;

Valores possíveis para EnableCancelKey:
xlDisabled
. A tratamento para a tecla Cancel está completamente desativada.
xlErrorHandler. A interrupção é enviada para o procedimento em execução como um erro, interceptável por um manipulador de
erro configurado com uma instrução On Error GoTo. O código de erro é detectável 18.
xlInterrupt. O procedimento atual é interrompido, e o usuário pode depurar ou terminar o procedimento.

- A seguir definimos a variável contador como igual a 3 e assim atribuímos 3 tentativas de senha/usuário incorretos;
- Tornamos a planilha Plan1 invisível;
- Tornamos a planilha Plan2 invisível;
- Exibimos o formulário de login;

Ah ! o valor da senha informado na planilha Login , célula B2 que é igual a 313233343536 foi obtido da rotina Encriptar. Esse valor foi colocado na planilha pois mesmo que alguém acesse a planilha e obtenha o valor ele estará codificado não poderá ser usado. Esse valor corresponde a 123456.

E dessa forma usando VBA vimos como criar um formulário de login, realizar a autenticação e proteger uma planilha via código VBA usando o Excel 2007.

Pegue o projeto completo aqui: Fluxo_Caixa_EXCEL.zip

Eu sei é apenas Visual Basic for Applications (VBA), mas eu gosto...

Eu deixo para você descobrir como cancelar as teclas CTRL+SHIFT e assim impedir que o usuário tenha acesso direto à planilha.(dica : veja este link : http://www.rondebruin.nl/key.htm )

"Em verdade , em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão."
João-5:25

Referências:


José Carlos Macoratti