Ir ao conteúdo
  • Cadastre-se
Roronoa Zero

VBA Tela de Login e Foto

Recommended Posts

Bom Dia Pessoal,

Estou precisando da ajuda de vocês, estou criando um sistema de login no VBA, mas o problema é que eu só sei fazer para um usuario, tem como eu criar uma planilha a parte para fazer um "banco de dados"? 

Queria que ele fizesse o seguinte comparativo....

 

SE 123 For do Grupo Direção Acesso liberado para logar,Caso não msg box Você não tem autorização para logar neste campo e fecha a tela de login

SE 123 Tiver a Senha 123 aparecer a msg box de Bem Vindo na barra ....(isto eu fiz, mas como eu coloco o nome do usuario de acordo com a Matricula dele?) EX MsgBox "NOME DO USUARIO (de acordo com a matricula)", vbExclamation, "SEJA BEM VINDO"

ai vem o questionamento se deseja autorizar ou não...isto ta no Cod la de baixo

Agora q vem o X da questão

como eu faço para ele copiar a assinatura e colar no campo que ele fez o login? ( A assinatura tem q ser de acordo com a matricula)

(O campo da assinatura vem em branco, colei ali só para mostrar como ficaria)

 

 

 

E esta tela tem a seguinte função. Cada usuario terá uma foto com uma assinatura (Rubrica). Então toda vez que fizer o login e autorizar ele puxa esta imagem e cola no campo abaixo de onde foi realizado o login. 

 

Vou colocar no Drive os prints para ajudar a compreender

Print1 - Mapa Aonde sera realizado os logins e a "colagem" das assinaturas

Print2 - Os Usuarios ( queria saber se tem como faze um acesso por restrição, ex...o usuário de compras só pode logar no campo de compras, assim como o da direção somente na direção e a assist.o mesmo processo.............só pode existir um grupo para cada usuario, ele não pode ser de 2 ao mesmo tempo)

Print3 - VBA e Useform de Login

 

https://drive.google.com/folderview?id=0By4_xmfmX0mBeTJrMlkzREtTczA&usp=sharing

 

Codigo que to usando 

 

Private Sub CommandButton1_Click()If TextBox1.Text = "5462" And TextBox2.Text = "123" ThenMsgBox "VICTOR CARDOSO", vbExclamation, "SEJA BEM VINDO"Sheets("Banco de Dados").SelectDim resultado As VbMsgBoxResultresultado = MsgBox("Você deseja autorizar o mapa?", vbYesNo, "Autorização do Processo")If resultado = vbYes ThenTítulo = "Assinatura"CxDialog = MsgBox("Autorização Realizada Com Sucesso", vbOKOnly + vbInformation, Título)Range("F18:H24").Select    Sheets("Banco de Dados").Select    ActiveWindow.SmallScroll Down:=102    ActiveSheet.Shapes.Range(Array("Imagem 2")).Select    Selection.Copy    Sheets("Mapa Base").Select    Range("F18:H24").Select    ActiveSheet.Paste    Selection.ShapeRange.IncrementLeft 22.0588976378    Selection.ShapeRange.IncrementTop 23.8234645669   Unload MeElse    Título = "Processo Não Autorizado"CxDialog = MsgBox("Ação Cancelada Pelo usuario", vbCritical, Título)End IfElseMsgBox "SENHA INCORRETA LIGUE 3714", vbInformation, "LOGIN"TextBox1.Text = ""TextBox2.Text = ""TextBox1.SetFocusEnd IfEnd Sub
 
Desde já Obrigado.
E tem como escrever o código aqui? Eu queria aprender como faz!!  :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa! E aí @Roronoa Zero , tudo bem?

 

Eu posso te ajudar com o seu problema e vou apenas escrever, ok? Já que quer aprender, não farei nada além de lhe orientar e explicar o que estamos fazendo.

 

Como são dois problemas:

  • Banco de Dados de Usuários
  • Transportar a assinatura correta do usuário autorizado

Eu prefiro começar explicando o problema 2, razoavelmente mais simples e fácil do que o primeiro, ok? Vamos lá

 

COMO MANUSEAR A ASSINATURA CORRETA DO USUÁRIO AUTORIZADO?

 

Na planilha 'banco de dados', cada imagem inserida (independente da linha) possui um nome de objeto, ou seja, o Excel por padrão insere o nome a sua primeira imagem inserida como "Imagem 1", a segunda como "Imagem 2" e por aí vai. Para visualizar o nome do obejto ou até mesmo para renomeá-lo (que é o que vamos fazer para manipulá-lo na programação) é no campo demonstrado abaixo:

figura1.jpg

 

Desta forma, você terá o trabalho manual de clicar sobre cada imagem_assinatura e alterar o "Imagem XYZ" para o nome do colaborador. Aconselho a usar um padrão em que evite strings duplicadas. Ao invés de renomear a primeira assinatura para "João", por exemplo, use a primeira letra do primeiro nome em maiúscula e o último sobrenome dele minusculo. Então, se o cara que vai autorizar se chama João Roronoa, faça a imagem chamar "Jroronoa" (essa é minha sugestão, você pode fazer o que achar melhor nesse ponto!). Além disso, crie uma coluna a mais no seu banco de dados, após a imagem das assinaturas com o conteúdo em string do nome das imagens "Jroronoa", por exemplo.

 

Feito isso, vamos matar os dois problemas na programação agora!

 

PROGRAMANDO

 

Para varrer um banco de dados em busca de um valor, seja texto, número ou data, precisamos criar um laço. Eu prefiro trabalhar com o FOR, como segue o exemplo.

 

No início da sua programação do comando do botão, declare a variável 'contalinha', utilizaremos ela para saber o tamanho (em número de linhas) do seu banco de dados e limitar o nosso laço (FOR) nessa mesma quantidade e também declare a variável 'contador', a qual será responsável pelo gatilho do nosso laço. Não esqueça de declarar a variável que armazenará o nome do usuário, caso ele se logue. Desta forma, temos:

Dim contalinha as IntegerDim contador as IntegerDim nome as String

Então vamos programar o carregamento deste contalinha. Note que a cada linha de programação eu estou fazendo o comentário utilizando aspas simples, se tiver alguma duvida vamos nos falando:

Sheets("Banco de Dados").Select                                   'Estamos selecionando e visualizando a planinha "banco de dados"ActiveSheet.Range("A2").Select                                      'Estamos fazendo o cursor ficar selecionado no range A2, ou seja, a primeira linha de dado do seu banco, pois A1 é cabeçalho e isso não nos interessa.Selection.End(xlDown).Select                                         'Estamos selecionando com o cursor, a partir de A2, até a última célula da tabela com valor preenchido (é importante que o banco de dados não possua linhas em branco entre dados úteis, senão teremos um problema.Contalinha = ActiveCell.Offset(1, 0).Row - 1                 'Então carregamos a variável contalinha com o nº da linha que o cursor foi posicionado. Essa função nada mais é do que o retorno do =LIN(), subtraímos 1 para eliminar a contagem do cabeçalho.Range("A2").Select                                                            'Retorna a seleção do nosso cursor para a célula A2, primeira linha de dados útil.

Ótimo, agora antes de fazer o laço, vamos validar as informações que o usuário deverá inserir no formulário, os campos Matrícula e Senha. Temos o seguinte:

 

If TextBox1.TextLenght = 0 Then                                                                                                                                                      'Aqui verificamos se foi digitado algum conteúdo no campo matrículaMsgBox "Por favor, insira um número de matrícula válido.", vbExclamation + vbOKOnly, "Atenção"ElseIf TextBox2.TextLenght = 0 Then                                                                                                                           'A mesma coisa, mas agora no campo de senhaMsgBox "Por favor, insira uma senha válida.", vbExclamation + vbOKOnly, "Atenção"ElseGoTo FIMVALIDACAO                                                                                                                                'Envia o executor do programa para a linha com o título de FIMVALIDACAO (observe os dois próximos códigos)End IfEnd If

Note que o último Else da validação orienta a programação ir para a linha "FIMVALIDACAO", para que isso funcione você precisa inserir a linha abaixo

FIMVALIDACAO:

Entre as linhas da sua programação, como segue o exemplo:

......ElseFIMVALIDACAO:                                                                                                        'Com essa marcação, o Excel saberá que deverá pular direto pra essa linha quando ele cair naquele Else com o comando GOTO FIMVALIDACAOMsgBox "SENHA INCORRETA LIGUE 3714", vbInformation, "LOGIN"TextBox1.Text = ""TextBox2.Text = ""TextBox1.SetFocus 
Ok, partimos então agora para a ideia de que o usuário não clicou em "Logar" com os campos vazios, então agora há conteúdo para buscar no banco de dados. Fazemos então o laço (for) rodar com base no tamanho da nossa base de dados já carregada na variável, lembra? Então temos:
For contador = 0 to contalinha'ActiveCell.Value é a seleção da célula que está selecionada no momento. Antes do FOR inserimos lá em cima o comando Range("A2").Select, lembra? É a partir daí que ele já começa a fazer a leituraIf ActiveCell.Offset(contador,0) = TextBox1. Value Then'Então se ele achou a matrícula, procure duas colunas a frente na mesma linha da célula selecionada (comando Offset) se a senha bate com o conteúdo do TextBox2If ActiveCell.OffSet(contador,2).Value = TextBox2.Value Then'então carregamos o nome do usuário para exibir no MsgBox de login com suceso. Novamente usamos o Offset para pegar o conteúdo de 1 coluna a frente da seleção atual, ainda A2.nome = ActiveCell.Offset(contador,1).ValueMsgbox nome, vbExclamation, "SEJA BEM VINDO"GOTO AUTORIZARPROJETO                                              'Se tudo for verdadeiro e ele se logou com sucesso, então vá para as linhas em que ele tem que autorizar o projeto (veja explicação abaixo)ElseMsgBox "Senha incorreta. Tente novamente", vbExclamation + vbOKOnly, "Atenção"GOTO FIMVALIDACAOEnd IfElseMsgBox "Matrícula incorreta. Tente novamente", vbExclamation + vbOKOnly, "Atenção"Next contador

Para fazer a transação da assinatura, basta você usar a mesma lógica de programação que você fez, só que ao invés de trabalhar direto com o nome "Imagem 2", por exemplo, utilize uma varíavel para carregar (da mesma forma como fizemos com o nome do usuário) o nome da assinatura dele, pronto!

 

Qualquer dúvida, vamos nos falando!

 

Abraços e divirta-se ;)

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso ... vou começar a ler... com certeza vou me divertir muuuito  :D

 

Desde já muito obrigado pela explicação e pela paciencia de escrever isso tudo!!! você é 10!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso , poderia me esclarecer uma duvida?me perdi aqui...  :confused:  a parte da imagem eu peguei, quanto a código, ele é para ser acrescido no primeiro botão...pra explicar mehor, todo o codigo q você colocou eu enfio tudo la? porque o meu do textbox quando eu acrescentei ele deu erro, ai surguiu esta duvida. Abraços e obrigado novamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai depende do que você quer.

 

Quando o cara se logar, ele automaticamente já vai autorizar o projeto ou vai haver um segundo botão pós-login questionando a autorização do projeto? Se for esse segundo cenário, a parte de transportar a imagem é nesse segundo botão.

 

Compartilha o arquivo que você está usando, eu olho e escrevo o que estamos fazendo de errado ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Tarde @minoso

Desculpa a demora...to com tanto serviço que acho q  vou passar o carnaval aqui no trampo kkkkkkk

Segue o link solicitado

 

https://drive.google.com/file/d/0By4_xmfmX0mBQk1RbVZOZElsVnM/view?usp=sharing

 

Ele esta meio "bagunçado" porque estou fazendo umas modificações, quando abrir quero que o povo do compras tenha acesso a modificar tudo e os demais só possam autorizar  e um "registro de acesso", mas isso ai é outra parte.

Eu tava querendo o seguinte que quando ele clicasse no botão de autorizar que fosse aberto a tela de login e autorizasse direto.

Tipo...clicou no botão...comparou se esta no "setor certo" Compras = Compras / Diretoria = Diretoria  / Areas = Areas

se bater a matricula com a senha...ela traz a imagem da assinatura pro campo vazio abaixo "autorizando" o processo".

 

Desculpa se ficar confuso...Obrigado pela ajuda novamente e qualquer coisa me chama aqui...se tiver skype e quiser me chamar por la pode ficar a vontade.

Abraços e obrigado pelo tempo oferecido pra me ajudar  :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero

 

Zipa a planilha e anexa aqui no fórum mesmo, ele tem suporte pra isso.

 

Eu até consigo fazer download do seu arquivo, mas não consigo abrí-lo aqui.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

Excelente dúvida do nosso amigo Roronoa Zero e ainda excelente explicação ( com comentários nos códigos) do nosso amigo Minoso.

Me interessei  e lerei novamente para adquirir um pouquinho mais de conhecimento.

 

Abs...

 

B)

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso ... sorry....não sabia q dava pra zipar direto  :(  :eek:

 

Segue o Zip como pediu...

Abraços


Oooops....não to conseguindo anexar...acho q to fazendo algo errado  :confused:  :confused:  :confused:  :confused:  :confused:


@minoso ....coloquei o Zip no link que te mandei aquela vez...não sei porque não esta aceitando o arquivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero o fórum não permite anexo com a extensão de macro (xlsm). Você precisa zipar a planilha e então anexar a planilha ao post aqui no tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero

 

desculpe a demora, acabei vendo o arquivo só agora. Conseguiu algum progresso?

 

No mais, não entendi bem o que você fez com as linhas de comando que te passei em minha primeira resposta. Parece que você fragmentou o código em várias subs... Talvez eu não tenha explicado com mais clareza, mas todo aquele código que eu postei lá em cima é dentro de uma única sub.

 

Você prefere tentar fazer ai ou posso ajeitar todo o código e te enviar o arquivo pronto com explicações?

 

O que prefere?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso ...

Se puder me enviar e me explicar eu agradeço...sou meio cabeça dura...mas se eu fizer em uma sub só ele fica avisando...Sub sem If ai eu coloco o IF....ai começa de novo Sub sem End If e End Sub 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero

 

Desculpe a demora, consegui voltar pra cá só hoje.

 

Conseguiu algum progresso com a planilha? Precisa de ajuda com algo ainda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso

Esquenta não,ta corrido pra todo mundo....eu to usando o Else If nelas...to testando aqui pra ver se funciona....vai ser código pakas  :lol:

tem um que da erro...tem um que vai....essa planilha vai me deixar doido...kkkkkk  :tantan:


@minoso ...

Já q você apacerceu aqui, xo abusar dos seus conhecimentos :rolleyes: ..to com um probleminha no Else If...ele ta dando um erro dizendo " Erro de compilação: Declaração Duplicada no Escopo Atual.

O que é isso?


To usando a formula abaixo....so q (na minha cabeça) é pra fazer o seguinte....

TextBox1 = matricula

TextBox2 = Confirmação com o nome do usuario

TextBox3  = Senha

Se os 3 estiverem ok...ele puxa a "assinatura" (foto) e cola no local....fiz o o primeiro usuario e deu certo...mas coloquei mais um e ele apareceu isto...será que ele não deixa eu fazer isto varias vezes?

 
 
ElseIf TextBox1.Text = "1234" And TextBox2.Text = "456" And TextBox3.Text <> "" Then
Dim resultado As VbMsgBoxResult
resultado = MsgBox("Você deseja autorizar o mapa?", vbYesNo, "Autorização do Processo")
If resultado = vbYes Then
Sheets("Mapa Base").Unprotect Password:="123456"
Título = "Assinatura"
CxDialog = MsgBox("Autorização Realizada Com Sucesso", vbOKOnly + vbInformation, Título)
Range("F18").Select
    Sheets("Assinaturas").Select
    ActiveWindow.SmallScroll Down:=102
    ActiveSheet.Shapes.Range(Array("1234")).Select
    Selection.Copy
    Sheets("Mapa Base").Select
    Range("F18").Select
    ActiveSheet.Paste
    Selection.ShapeRange.IncrementLeft 22.0588976378
    Selection.ShapeRange.IncrementTop 23.8234645669
   Unload Me
Range("F20").Select
Sheets("Mapa Base").Protect Password:="123456"

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero

 

Caramba! Agora você me pegou...

 

Eu nunca usei ElseIf, não faço ideia de como trabalhar com isso. Sempre que precisei encadear um IF, uso assim:

If (isso for igual a aquilo) then   (faça isso)   else      if isso for igual aquilo) then         exit sub         else             msgbox "OK"      end ifend if

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso

É porque to tendo  um problema....tenho uma foto....lembra q você falou pra renomear ela....

ai to no seguinte dilema...to querendo criar um macro que apague as figuras...

ai fui atras daquele q tudo sabe (Google) ai ele me deu um codigo que apaga todas as figuras...mas eu não quero que apague todas....so a que esta na coluna F ....

 

ai tem o codigo ActiveSheet.Shapes.Range(Array("123")).Select

esse ai é perfect....maaas é só pra quando é pra uma figura especifica....ele procura acha ela na coluna e apaga....mas são varias....ai tenho q fazer.... ActiveSheet.Shapes.Range(Array("123")).Select ActiveSheet.Shapes.Range(Array("5462")).Select

ActiveSheet.Shapes.Range(Array("145")).Select

por exemplo.... 

só que se eu coloco a imagem 5462 ele diz que não localizou a 123....

to aqui   :muro:  :muro:  :muro:  :muro:  :muro:  se souber como q faço isto ou se na sua formula de cima eu conseguiria casar....

porque o objetivo final é deletar.... então dps de cada activesheet na linha de baixo ta o Selection.Delete.

Abraços....e  :help:  :help:  :help:  :help:  :help:  kkkkk valeu pela força ate agora

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Roronoa Zero

 

Entendi o que você quer, só não entendi o momento em que isso acontece.

 

Qual é a execução da macro para chegar ao ponto de deletar a imagem? Por quê uma assinatura seria apagada? Não entendi... A ideia não era copiar e colar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso ...

a ideia é copiar e colar mesmo....esta parte eu consegui resolver....

mas to querendo deixar uma opção pro usuario poder "Desfazer" a assinatura....

ai ele teria que apagar a imagem (que é a assinatura) a parte copiar e colar é diferente da de deletar

:eek:

Ficou confuso a explicação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, eu entendi.

 

Para fazer o delete da imagem sem ter que especificar o nome você terá que criar uma Public Function exclusiva para capturar o nome da imagem durante o processo de copia e cola.

 

Aí para deletar a imagem, você chama essa função pública (com o nome já carregado) e manda ele deletar.

 

Tranquilo fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso .... 

o macro de copiar e colar é um....

o de excluir seria outro....

Tipo....se o cara autorizou (colou a imagem) ai depois quer desfazer esta autorização (ai queria deletar a imagem)

agora eu me perdi com o q você falou ali....kkkkkkkkkkkkkkk  :confused:  :confused:  :confused:  :confused:  :confused:

Vai com calma porque demoro um pouco pra entnder....

. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu sei que são duas macros diferentes, por isso eu falei pra você criar uma função pública, pois uma função pública pode ser usada e forma pública (duuuhhhh), ou seja, qualquer Private Sub pode chamá-la.

 

Seria algo mais ou menos assim

 

  • A public function seria acionada no momento que o cara fizesse login
  • A public function nada mais faria do que armazenar o login do cara (que é o mesmo nome da imagem do cara) em uma variável nesse momento do login
  • Quando for deletar, você chama essa public function pra receber dela o nome da imagem (o login) e pronto!

 

Uma única macro de poucas linhas para deletar a imagem do cara que está logado ;)

 

Ah, um outro detalhe que notei no seu arquivo e você precisa arrumá-lo urgentemente hehehe existem trocentos módulos de macros nele, você não precisa daquilo tudo, apenas um é o suficiente, aí centraliza todas as suas macros, independentemente do que elas executam, numa mesma folha. Fica mais fácil pra navegar e dar manutenção. (uma dica, opinião minha :P )

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@minoso .... 

Entendi mas não entendi.... a parte do que você quer acho q entendi...mas como fazer não consigo "ver"....tipo...é um botão que exclui e um botão que acrescenta...como eu coloco a mesma função junta? porque tipo...ele pode deletar ou não...a função deletar seria opcional...caso ele tenha autorizado e se arrependeu...mas isto não é pra ser frequente (pelo menos eu espero)

E não to conseguindo fazer com outra formula sem ser o ElseIf... por isto que tem taaaaaaantas macros assim...realmente a parte da manutenção vai ser phoda...mas ai não sei como centralizar isto  :muro:

Obrigado pela ajuda ate agora....sou meio cabeça dura mesmo pra entender  :tantan:  :help:  :D

Você tem Skype? porque fica mais fácil de se comunicar por la

Compartilhar este post


Link para o post
Compartilhar em outros sites

Skype eu até tenho, mas tratar o assunto por lá é ruim, pois se outro tiver a necessidade de algo semelhante à você, não vai encontrar a resposta aqui no fórum :( Concorda?

 

Com relação ao que precisamos fazer, vamos seguir esses passos:

  1. Concentre TODAS as macros (cada Private Sub) em um único módulo
  2. Após essa organização, vamos fazer a Public Function que captura o nome do cara na hora do login para identificar a imagem
  3. Depois disso vamos estruturar a sua macro de "logar" e "apagar" de forma a trabalhar com essa função pública.

Vamos nos falando e pára de bater a cabeça na parede, já já vai parecer um zumbi!  :D

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa parte de "Concentrar" tudo... .seria colocar todas juntas? tipo...tirar o que é macro e fazer todas direto no vba em um unico modulo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×