Vamos desenvolver, hoje, um arquivo onde as planilhas serão exibidas dinamicamente de acordo com a escolha feita pelo usuário. Todas as demais planilhas deste arquivo ficarão ocultas. Um exemplo, você tem um arquivo com três planilhas de setores diferentes. Teremos uma planilha principal, a qual definiremos como “Menu Principal”, onde posicionaremos um controle combobox, que conterá, a lista de todos os setores, definidos pelas outras 3 planilhas criadas. O usuário, ao selecionar um setor nessa caixa de listagem, será direcionado para a planilha respectiva.
Mãos a obra então.
Abra um novo arquivo do excel.
Adicione mais uma planilha. Renomeie- as da seguinte maneira: “Menu Principal”, “Setor A”, “Setor B” e “Setor C”. Adicione uma combobox da caixa de ferramentas de controle e dê o nome “cboSetores”.
Pressione ALT+F11 e abra o ambiente VBA.
Na janela do projeto, clique duas vezes no objeto Workbook (EstaPasta_de_trabalho) para exibir a janela de código referente a esta Pasta de Trabalho. Digite assim:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ActiveWorkbook.Unprotect "setores" 'Desprotege a pasta de trabalho
Call RedefinirPlanilhas("Finalizar") 'Chama a rotina para ocultar as planilhas
'e carregar a combobox
ActiveWorkbook.Protect Structure:=True, Windows:=False, Password:="setores" 'Protege a pasta
'de trabalho, novamente
ActiveWorkbook.Save
End Sub
Private Sub Workbook_Open()
'Carregar ComboBox dos Setores
ActiveWorkbook.Unprotect "setores" 'Desprotege a pasta de trabalho
Call RedefinirPlanilhas("Iniciar") 'Chama a rotina para ocultar as planilhas
'e carregar a combobox
ActiveWorkbook.Protect Structure:=True, Windows:=False, Password:="setores" 'Protege a pasta
'de trabalho, novamente
End Sub
Agora, abra uma janela de código para a planilha “Menu Principal”, também com um duplo clique no objeto referente a essa planilha no VBAProject. Aberta a janela, escreva:
Private Sub cboSetores_Change()
Dim PlanEscolhida As String
PlanEscolhida = cboSetores.Text
ActiveWorkbook.Unprotect "setores" 'Desprotege a pasta de trabalho
Call RedefinirPlanilhas("Selecionar") 'Chama a rotina para ocultar as planilhas
'e carregar a combobox
Sheets(PlanEscolhida).Visible = True 'Reexibe a planilha escolhida
Sheets(PlanEscolhida).Select 'Torna a planilha ativa
ActiveWorkbook.Protect Structure:=True, Windows:=False, Password:="setores" 'Protege a pasta
'de trabalho, novamente
End Sub
Podemos, nesse momento, criar um módulo. Menu Inserir > Módulo. E escreva o código abaixo.
Sub RedefinirPlanilhas(ByVal Opção As String)
'Percorre todas as planilhas
For Each plan In ThisWorkbook.Worksheets
'Exclui a planilha "menu principal" das ações executadas
If Not plan.Name Like "Menu Principal" Then
If Opção = "Iniciar" Then
'Adiciona como item da combobox
Sheets("Menu Principal").cboSetores.AddItem plan.Name
End If
'oculta a planilha
plan.Visible = False
End If
Next
End Sub
Salve o arquivo e feche-o. Abra novamente e teste os resultados.
Um abraço a todos.
Termos aprendidos neste artigo:
For Each…Next |
Repete um grupo de instruções para cada elemento em uma matriz ou coleção. Sintaxe For Each element In group Next [element] A sintaxe da instrução For…Each…Next possui as seguintes partes:
|
||||||
Visible | Determina se o objeto será visível. Variant de leitura/gravação.
expressão.Visible expressão necessária. Uma expressão que retorna um dos objetos acima. |
||||||
Workbook.Protect | Protege uma pasta de trabalho contra modificação.
expressão.Protect(Password, Structure, Windows) Password Variant opcional. Uma seqüência de caracteres que especifica uma senha, que faz distinção entre maiúsculas e minúsculas, para a planilha ou pasta de trabalho. Se este argumento for omitido, você poderá desproteger a planilha ou pasta de trabalho sem usar uma senha. Caso contrário, será necessário especificar a senha para desproteger a planilha ou pasta de trabalho. Se você esquecer a senha, não poderá desproteger a planilha ou a pasta de trabalho. É uma boa idéia guardar uma lista de suas senhas e dos nomes de seus respectivos documentos em um lugar seguro. |
||||||
Workbook.Unprotect | Método UnprotectRemove a proteção de uma planilha ou pasta de trabalho. Este método não tem efeito se a planilha ou pasta de trabalho não estiver protegida.
expressão.Unprotect(Password) expressão necessária. Uma expressão que retorna um objeto Chart, Workbook ou Worksheet. |
||||||
Change |
Ocorre quando a propriedade Value é alterada. Sintaxe Private Sub objeto_Change( ) A sintaxe do evento Change possui as partes a seguir:
|
||||||
Workbook_Open | Evento OpenO Evento Open ocorre quando a pasta de trabalho é aberta.
Private Sub Workbook_Open() |
||||||
Workbook_BeforeClose | O Evento BeforeClose ocorre antes da pasta de trabalho ser fechada. Se a pasta de trabalho tiver sido alterada, esse evento ocorrerá antes do usuário ser solicitado a salvar alterações.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Cancel False quando o evento ocorre. Quando o procedimento de evento define esse argumento como True, a operação de fechamento pára e a pasta de trabalho é deixada aberta. |
qdo abro novamente dá a seguinte mesangem de erro:erro em tempo de execução’438′:
este objeto não aceita a propriedade ou metodo
Você editou alguma parte do código? Em que linha ocorre a depuração do script?
Somente com essas informações posso saber o que realmente ocorreu.
Abraço
Ocorreu o mesmo comigo…
Abaixo o códito editado e onde ocorre o erro…
-Na pasta – Esta_pasta_de_trabalho
Private Sub cboSetores_Change()
Dim PlanEscolhida As String
PlanEscolhida = cboAcesso.Text
ActiveWorkbook.Unprotect “Geral”
Call RedefinirPlanilhas(“Selecionar”)
Sheets(PlanEscolhida).Visible = True
Sheets(PlanEscolhida).Select
ActiveWorkbook.Protect Structure:=True, Windows:=False, Password:=”Geral”
End Sub
– Na pasta da Planilha
Private Sub cboSetores_Change()
Dim PlanEscolhida As String
PlanEscolhida = cboAcesso.Text
ActiveWorkbook.Unprotect “Geral”
Call RedefinirPlanilhas(“Selecionar”)
Sheets(PlanEscolhida).Visible = True
Sheets(PlanEscolhida).Select
ActiveWorkbook.Protect Structure:=True, Windows:=False, Password:=”Geral”
End Sub
– Módulo 1
Sub RedefinirPlanilhas(ByVal Opção As String)
For Each plan In ThisWorkbook.Worksheets
If Not plan.Name Like “Geral” Then
If Opção = “Iniciar” Then
Sheets(“Geral”).cboAcesso.AddItem plan.Name ‘é justamente aqui que ocorre o erro…
End If
plan.Visible = False
End If
Next
End Sub
Por favor… o que fiz de errado? qual o motivo de não ter dado certo?
Roberto,
Pelo que você postou no seu comentário, você escreveu duas vezes o código correspondente a planilha.
O código de EstaPastaDeTrabalho deve ser para os eventos: Workbook_Open e Workbook_BeforeClose.
Por favor, reescreva o código do Módulo EstaPastaDeTrabalho, ok!
Vai dar certo.
Abraço
Parabéns pela as dicas no site, muito bom!
Será que poderia postar Alguma coisa de formulário de cadastro, pesquisa e edição buscando em mais de uma região na própria planilha.
Romeu
Ok Romeu.
Vou postar algo neste sentido.
Abraço
Como faço? (Veja o exemplo abaixo)
Estou querendo adicionar mais um combobox, sendo que o primeiro combobox MOSTRA na GUIA “SETOR A, SETOR B e SETOR C. E no segundo combobox ficasse o SETOR D, SETOR E e SETOR F.
Tem como?
Grato