Ir ao conteúdo
  • Cadastre-se

VBA - Exibição de abas


Posts recomendados

Olá pessoal. Eu montei uma planilha de gestão para a empresa e estão usando normalmente, no momento ela se encontra com dados disponíveis a todos que tem acesso a pasta. Enfim, foi solicitado que de algum jeito os usuários só pudessem visualizar o seu próprio conteúdo e assim eu criei um sistema de Login e Senha o qual está funcionando mas com um problema: A planilha não está exibindo a planilha correta de acordo com o usuário:

 

Dados:

 

A planilha fica com 3 abas em exibição para quaisquer usuários (Pendências, Verificar e Responsáveis)

O meu login com todas as abas é Diego e senha DIEGOCM

O Usuário Sandra com senha Sandra deveria exibir somente a aba PAM_Manutenção, mas está mostrando a da Qualidade

PAM_Inspeção_interna_2017_v6login.7z

 

Poderiam me ajudar a verificar o porquê disso acontecer?

Se alguém tiver mais alguma dica de otimização da planilha também serpa muito bem vinda.

Link para o comentário
Compartilhar em outros sites

E aí, @diego_janjao , bom dia guri!

 

Dá uma olhada no seguinte laço, o problema parece estar nele:

For lContador = 2 To lTotal
   Sheets(Sheets("Senha").Range("C" & lContador).Value).Visible = True
Next lContador

lContador começa em 2, então vai buscar o conteúdo da célula C2, que não é a Sandra, pois C2 corresponde a linha em que está Diego, trazendo então "PAM_Qualidade". A Sandra começa na linha 10, mesmo após filtrar (os números de linha permanecem os mesmos ao aplicar filtro, o Excel apenas oculta as linhas que não atendem).

 

Vê se é por aí o problema... Se não for, manda um olá que poderemos avaliar melhor (só que aí só à noite, ok?)

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Amigo @diego_janjao, mudei  só 1 pouco seu código, testa aí prá ver se consegue aproveitar:

Private Sub CommandButton1_Click()
  Dim rgNomePlans As Range, cél As Range
  With Sheets("Senha")
     .AutoFilterMode = False
     .Range("$A$1:$C$50000").AutoFilter Field:=1, Criteria1:="=" & txtUsuario.Text
     .Range("$A$1:$C$50000").AutoFilter Field:=2, Criteria1:="=" & txtsENHA.Text
     Set rgNomePlans = .AutoFilter.Range.Columns(3)
  End With
  If rgNomePlans.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
    Set rgNomePlans = rgNomePlans.Offset(1, 0).Resize(rgNomePlans.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
    ActiveWorkbook.Unprotect Password:="123"
      For Each cél In rgNomePlans
        Sheets(cél.Value).Visible = True
      Next cél
    ActiveWorkbook.Protect Password:="123", Structure:=True, Windows:=False
  Else
    MsgBox "Usuário e/ou Nome Incorreto!" 'O auto-filtro resultou vazio
  End If
  Unload frmLogin
End Sub

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@diego_janjao E qual o resultado que deve ocorrer quando o login for em branco? Considerar como Usuário/Nome Incorreto ou simplesmente sair do código? Realmente daria Subscrito fora do intervalo já que essa situação não está prevista na planilha senha ou no código...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

agora, Edson Luiz Branco disse:

@diego_janjao E qual o resultado que deve ocorrer quando o login for em branco? Considerar como Usuário/Nome Incorreto ou simplesmente sair do código? Realmente daria Subscrito fora do intervalo já que essa situação não está prevista na planilha senha ou no código...

No código anterior ele dava como usuário incorreto e ficavam apenas as abas liberadas à exibição.

Link para o comentário
Compartilhar em outros sites

@diego_janjao , vê agora, maninho:

Private Sub CommandButton1_Click()
  Dim rgNomePlans As Range, cél As Range
  With Sheets("Senha")
     .AutoFilterMode = False
     .Range("$A$1").CurrentRegion.AutoFilter Field:=1, Criteria1:="=" & txtUsuario.Text
     .Range("$A$1").CurrentRegion.AutoFilter Field:=2, Criteria1:="=" & txtsENHA.Text
     Set rgNomePlans = .AutoFilter.Range.Columns(3)
  End With
  If rgNomePlans.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
    Set rgNomePlans = rgNomePlans.Offset(1, 0).Resize(rgNomePlans.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
    ActiveWorkbook.Unprotect Password:="123"
      For Each cél In rgNomePlans
        Sheets(cél.Value).Visible = True
      Next cél
    ActiveWorkbook.Protect Password:="123", Structure:=True, Windows:=False
  Else
    MsgBox "Usuário e/ou Nome Incorreto!" 'O auto-filtro resultou vazio
  End If
  Unload frmLogin
End Sub

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@diego_janjao, bem, eu me concentrei apenas na sua primeira queixa inicial, pois estava tornando visível a planilha errada conforme o usuário.

 

Em 24/02/2017 às 04:05, diego_janjao disse:

...eu criei um sistema de Login e Senha o qual está funcionando mas com um problema: A planilha não está exibindo a planilha correta de acordo com o usuário...

...O Usuário Sandra com senha Sandra deveria exibir somente a aba PAM_Manutenção, mas está mostrando a da Qualidade...

Poderiam me ajudar a verificar o porquê disso acontecer?

 

Na verdade acabei não me preocupando em ver a funcionalidade do sistema como um todo, e sim somente essa disfunção localizada mesmo.

Voltemos então à bancada.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 28/02/2017 às 00:14, diego_janjao disse:

Mas ainda ficam as abas do último usuário abertas.

 

@diego_janjao  foi falha minha mesmo. Deletei sem querer a chamada ao procedimento lsDesabilitar que você estava usando no início do seu código do botão de comando. Foi mal.

Então, se quiser testar agora:

Private Sub CommandButton1_Click()
  Dim rgNomePlans As Range, cél As Range
  If Me.txtUsuario.Text = "" And _
       Me.txtsENHA.Text = "" Then
     lsDesabilitar
     Unload frmLogin
     Exit Sub
  End If
  With Sheets("Senha")
     .AutoFilterMode = False
     .Range("$A$1").CurrentRegion.AutoFilter Field:=1, Criteria1:="=" & txtUsuario.Text
     .Range("$A$1").CurrentRegion.AutoFilter Field:=2, Criteria1:="=" & txtsENHA.Text
     Set rgNomePlans = .AutoFilter.Range.Columns(3)
  End With
  If rgNomePlans.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
    Set rgNomePlans = rgNomePlans.Offset(1, 0).Resize(rgNomePlans.Rows.Count - 1, 1).SpecialCells(xlCellTypeVisible)
    ActiveWorkbook.Unprotect Password:="123"
      For Each cél In rgNomePlans
        Sheets(cél.Value).Visible = True
      Next cél
    ActiveWorkbook.Protect Password:="123", Structure:=True, Windows:=False
  Else
    MsgBox "Usuário e/ou Nome Incorreto!" 'O auto-filtro resultou vazio
    lsDesabilitar
  End If
  Unload frmLogin
End Sub

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

 

1 hora atrás, diego_janjao disse:

Poderia me explicar o que você mudou?

 

@diego_janjao ,do último código postado só inseri no início uma verificação que, se caso ambas as textboxes Usuário e Senha estivessem vazias ocultaria as planilhas deixando só as globais, descarrega o form e encerraria a rotina.

  If Me.txtUsuario.Text = "" And _
       Me.txtsENHA.Text = "" Then
     lsDesabilitar
     Unload frmLogin
     Exit Sub
  End If

 

E já que você mencionou que

 

Em 27/02/2017 às 03:31, diego_janjao disse:

quando login em branco (geralmente faço isso pra fazer "logoff")

 

imaginei que esse método serviria.

 

Também chamei a rotina lsdesabilitar após a exibição da msgbox de usuário/senha errados. O restante está como no post anterior.

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...