AS EMPRESAS ESTÃO "DESESPERADAS" POR ESTE TIPO DE PROFISSIONAL... - VOCÊ É UM DELES?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI - O Conhecimento que Vira Dinheiro - CLIQUE AQUI

Você está em: PrincipalArtigosSérie "Como Fazer": Menus no Access › Lições : 13
Quer receber novidades e e-books gratuitos?
« Anterior Δ Página principal ¤ Índice Próxima »
Criando menus, barras de comando e botões personalizados no Access usando VBA
Autor: Robert Friedrick Martim
Lição 012 - Listando os menus e sub-menus do Access

Um aspecto importante do processo de criação de menus personalizados no Office é conhecer os próprios menus do Office. Porém, como são centenas de menus é missão impossível saber todos de cor.

Contudo, existe uma forma simples de se listar os menus e sub-menus. Na primeira parte deste tópico mostrarei como listar os menus em um arquivo texto externo. O código será simples e listará as barras de comando/ferramenta.

Na segunda parte, o problema é modificado ligeiramente. Aqui, listaremos as barras de comando/ferramenta em uma tabelo do Access e os sub-menus em outra tabela. Porém, antes de iniciarmos o código iremos relacionar as tabelas para que os sub-menus.

Listando somente as barras de comando/ferramentas em um arquivo texto

Para escrever informações em um arquivo texto é bem simples. O primeiro passo requer a abertura do documento como um apêndice. No segundo passo escrevemos os dados e no terceiro fechamos o arquivo texto.

Neste exemplo, acrescento um pequeno aviso para que o usuário saiba que o processo de listagem dos menus foi terminado. Se o usuário deseja visualizar o arquivo basta clicar Sim. Caso ele decida por não ver o arquivo a rotina é terminada.

Sub listaMenusAccess()

       

    Dim cmdbar      As CommandBar

    Dim appWord     As Object

   

    On Error Resume Next

    Kill "C:\cmdBarsAccess.txt"

   

'   Abre/Crie o arquivo texto para armazenar a lista

'   de menus do MS Access

    Open "C:\cmdBarsAccess.txt" For Append As #1

 

'   Para cada barra de comando no aplicativo Access

    For Each cmdbar In Application.CommandBars

'       Listar o índice e nome de cada barra de comando

        Print #1, cmdbar.Index & vbTab & cmdbar.Name

    Next

 

'   Fecha o arquivo texto

    Close #1

   

'   Avisa o usuário que o processo foi terminado

    resposta = MsgBox("Os menus foram listados, você deseja " _

      & "ver o arquivo?", vbQuestion + vbYesNo)

   

'   Se o usuário não desejar visualizar o arquivo, sair da rotina

    If Not resposta = vbYes Then Exit Sub

 

'   Se o usuário deseja visualizar o arquivo, criar uma instancia do Word

    Set appWord = CreateObject("Word.Application")

 

'   Abrir o documento texto contendo os dados

    appWord.Documents.Open "C:\cmdBarsAccess.txt"

 

'   Mostrar o aplicativo Word

    appWord.Visible = True

       

End Sub

Ao rodar o código, no momento que a lista é terminada o usuário é avisado:


Figura 12-1

A figura abaixo mostra parte da lista contendo as barras de comando/ferramenta do Access.


Figura 12-2

Listando as barras de comando/ferramentas e sub-menus no Access

Diferentemente do exemplo anterior, o próximo exemplo é bem mais elaborado. Um problema que talvez não seja óbvio, mas que certamente pode ser resolvido é a questão do que vai com o que. Em outras palavras, você sabe que uma barra de comando/ferramenta possui vários controles. Alguns destes controles são botões onde não há mais nada abaixo deles. Por outro lado, se o controle for do tipo msoControlPopup teremos outros controles subordinados a ele. A figura abaixo mostra tal cenário:


Figura 12-3

Como o leitor já sabe, quando trabalhamos com banco de dados podemos e devemos relacionar dados sempre que possível. Imagine, então, a situação onde temos uma tabela chamada Barras, uma outra chamada Menus e outra chamada Popups. Na primeira tabela nós listamos todas as barras de comando/ferramenta. Na tabela de menus nós listamos todos os menus. Se a tabela Barras e tabela Menus possuem um campo em comum, digamos IDBarra, então, podemos relacionar os dados das duas tabelas. Por analogia, o mesmo será válido para as tabelas Menu e Popups.

O resultado final destes relacionamentos é, na verdade, uma “cascata” como a apresentado na figura acima. Observe a figura:


Figura 12-4

Ao expandirmos as tabelas relacionadas iniciando pela hierarquia mais alta, estamos expandindo as tabelas da mesma forma que expandimos os menus. Obviamente, que ainda existem mais níveis, como pode ser visto na figura. O controle Obter dados externos ainda pode ser expandido, mas isso eu deixarei como exercício para o leitor.

Para se criar relacionamento é bem simples. Contudo, estarei criando o relacionamento diretamente no código, assim como todas as tabelas e campo.

O motivo para a criação das tabelas, campos e relacionamentos no código é que o código para listar as informações poderá ser rodado sempre em tabelas limpas, sem dado algum.

Como o volume de dados sendo listado é relativamente grande, se o seu computador não possui uma boa capacidade de processamento o processo pode ser relativamente lento.

Para completar este exercício, você precisará:

  • 1 Formulário
  • 1 Módulo

Utilizaremos três tabelas onde os dados serão armazenados, contudo, as tabelas e relacionamento serão criados via código.

Crie o seu formulário e defina-o como o formulário de abertura inicial. Abra o formulário onde o seguinte código deve ser entrado:

Private Sub Form_Load()

'   Chama a rotina de inicialização

    Call iniciar

 

'   Fecha o formulário

    DoCmd.Close acForm, "frmIniciar"

End Sub

O rotina acima será executada no momento que o banco de dados é aberto e ira chamar a rotina iniciar. Portanto, o nosso próximo passo requer a construção desta rotina. Esta rotina pode ser considerada uma firula, pois seu único objetivo é interagir com o usuário:

Sub iniciar()

    resposta = MsgBox("Você iniciou o processo de listagem dos menus. " _

            & "Você deseja continuar?", vbQuestion + vbYesNo, _

            "Listar menus...")

   

    If Not resposta = vbYes Then Exit Sub

   

    Call inserirtbls

    Call menus

End Sub

Ao ser executada, a rotina avisa o usuário que o processo está sendo iniciado. Se o usuário realmente deseja continuar, então, as rotinas para inserção das tabelas e menus são chamadas. Caso contrário, a rotina é terminada.

Feito isso, estamos prontos para criar a rotina que inserirá as tabelas e relacionamentos.

Antes de continuar, assegure-se que os objetos DAO estão referenciados no seu projeto caso contrário você não conseguirá dimensionar alguns dos objetos do código. Para referenciar os objetos DAO, ainda no VBE, vá até Ferramentas à Referências e instale a referência Microsoft DAO x.x Object Library.

Com todas as referências no lugar, podemos partir para o nosso código. Instruções e comentários acompanham o código para melhor compreensão:

Sub inserirtbls()

 

    Dim bd        As Database

    Dim tbl1      As TableDef

    Dim tbl2      As TableDef

    Dim tbl3      As TableDef

    Dim índice    As Index

    Dim relac     As Relation

    Dim relac2    As Relation

 

'   Define o objeto bd como sendo o banco de dados atual

    Set bd = CurrentDb

 

'   Em caso de erro, continuar a execução

    On Error Resume Next

 

'   Remover os relacionamento presentes

    bd.Relations.Delete ("RelacMenus")

    bd.Relations.Delete ("RelacPopups")

 

'   Remover as tabelas presentes

    For Each tbl1 In bd.TableDefs

        DoCmd.DeleteObject acTable, tbl1.Name

    Next

 

'   Teste para saber se tabelas foram removidas

'   Remova o comentário para visualizar a atualização

'   Application.RefreshDatabaseWindow

       

'   Instancia a primeira tabela no bd

    Set tbl1 = bd.CreateTableDef("Barras")

   

'       Com a tabela Barras

        With tbl1

'           Cria os campos IDBarra e nomeBarra

            .Fields.Append .CreateField("IDBarra", dbLong)

            .Fields.Append .CreateField("nomeBarra", dbText)

 

'           Cria e anexa o índice numérico ao IDBarra

            Set índice = .CreateIndex("númBarra")

            índice.Fields.Append índice.CreateField("IDBarra")

            índice.Unique = True

            .Indexes.Append índice

       End With

 

'   Anexa a tabela Barras ao bd

    bd.TableDefs.Append tbl1

 

'   Veja comentários para a tabela Barras

    Set tbl2 = bd.CreateTableDef("Menus")

        With tbl2

            .Fields.Append .CreateField("IDMenu", dbLong)

            .Fields.Append .CreateField("IDBarra", dbLong)

            .Fields.Append .CreateField("nomeMenu", dbText)

           

            Set índice = .CreateIndex("númMenu")

            índice.Fields.Append índice.CreateField("IDMenu")

            índice.Unique = True

            .Indexes.Append índice

       End With

       

'   Anexa a tabela Menus ao bd

    bd.TableDefs.Append tbl2

   

'   Veja comentários para a tabela Barras

    Set tbl3 = bd.CreateTableDef("Popups")

        With tbl3

            .Fields.Append .CreateField("IDPopup", dbLong)

            .Fields.Append .CreateField("IDMenu", dbLong)

            .Fields.Append .CreateField("nomePopup", dbText)

           

            Set índice = .CreateIndex("númPopup")

            índice.Fields.Append índice.CreateField("IDPopup")

            índice.Unique = True

            .Indexes.Append índice

       End With

   

'   Anexa a tabela Popups ao bd

    bd.TableDefs.Append tbl3

 

'   Cria o relacionamento entre as tabelas Barras e Menus

    Set relac = bd.CreateRelation("RelacMenus", tbl1.Name, _

      tbl2.Name, dbRelationUpdateCascade)

 

'   Cria o relacionamento entre as tabelas Menus e Popups

    Set relac2 = bd.CreateRelation("RelacPopups", tbl2.Name, _

      tbl3.Name, dbRelationUpdateCascade)

 

'   Anexa os campos do relacionamento

    relac.Fields.Append relac.CreateField("IDBarra")

    relac.Fields!IDBarra.ForeignName = "IDBarra"

   

'   Anexa os campos do relacionamento

    relac2.Fields.Append relac2.CreateField("IDMenu")

    relac2.Fields!IDMenu.ForeignName = "IDMenu"

   

'   Anexa os relacionamentos ao bd

    With bd

        .Relations.Append relac

        .Relations.Append relac2

    End With

   

 

'   Limpa os objetos da memória

    Set bd = Nothing

    Set tbl1 = Nothing

    Set tbl2 = Nothing

    Set tbl3 = Nothing

    Set índice = Nothing

    Set relac = Nothing

    Set relac2 = Nothing

 

'   Atualiza as janelas do banco de dados

    Application.RefreshDatabaseWindow

   

End Sub

Finalmente, estamos prontos para o código que listará as barras, menus e sub-menus.

Sub menus()

'   Dimensão dos objetos

    Dim cmdBar    As CommandBar

    Dim ctl2      As CommandBarControl

    Dim ctl       As CommandBarControl

    Dim cn        As Object

    Dim rs        As Object

    Dim rs2       As Object

    Dim rs3       As Object

 

'   Define o objeto cn como sendo a conexão atual

    Set cn = Application.CurrentProject.Connection

 

'   Cria os objetos Recordset

    Set rs = CreateObject("ADODB.Recordset")

    Set rs2 = CreateObject("ADODB.Recordset")

    Set rs3 = CreateObject("ADODB.Recordset")

 

'   Define as string das tabelas

    tbl1 = "[Barras]"

    tbl2 = "[Menus]"

    tbl3 = "[Popups]"

   

'   Abre os recordsets

    rs.Open tbl1, cn, adOpenKeyset, adLockOptimistic, adCmdTable

    rs2.Open tbl2, cn, adOpenKeyset, adLockOptimistic, adCmdTable

    rs3.Open tbl3, cn, adOpenKeyset, adLockOptimistic, adCmdTable

 

'   Em caso de erro, continuar a execução

    On Error Resume Next

 

'   Para todas as barras de comando/ferramenta

    For j = 1 To CommandBars.Count

       

'       Instanciar cada objeto durante o loop

        Set cmdBar = Application.CommandBars(j)

       

'       Com o recordset 1...

        With rs

'           ...adicionar registro...

            .AddNew

'           ... inserir o índice da barra no campo IDBarra...

            .Fields("IDBarra") = cmdBar.Index

'           ... inserir o nome da barra no campo nomeBarra...

            .Fields("nomeBarra") = cmdBar.Name

'           ... atualizar registro.

            .Update

        End With

       

'       Ver comentários para loop anterior

'       Este loop registra os menus contidos na

'       Barra de Comando/Ferramenta

        For i = 1 To cmdBar.Controls.Count

            Set ctl = cmdBar.Controls(i)

            With rs2

                .AddNew

                .Fields("IDMenu") = ctl.Id

                .Fields("IDBarra") = cmdBar.Index

                .Fields("nomeMenu") = ctl.Caption

                .Update

             End With

            

'       Ver comentários para loop anterior

'       Este loop registra os sub-menus contidos

'       nos menus

                    For k = 1 To ctl.Controls.Count

                        Set ctl2 = ctl.Controls.Item(k)

                        With rs3

                            .AddNew

                            .Fields("IDPopup") = ctl2.Id

                            .Fields("IDMenu") = ctl.Id

                            .Fields("nomePopup") = ctl2.Caption

                            .Update

                        End With

                    Next

        Next

    Next

 

'   Fecha a conexão e recordsets

    cn.Close

    rs.Close

    rs2.Close

    rs3.Close

 

'   Limpa a conexão e recordsets da memória

    Set cn = Nothing

    Set rs = Nothing

    Set rs2 = Nothing

    Set rs3 = Nothing

 

'   Avisa o usuário que a lista foi feita

    MsgBox "Menus foram listados com sucesso!", vbInformation + vbOKOnly, _

            "Processo finalizado..."

 End Sub

A conclusão final deste tópico é que o processo pode parecer relativamente longo, contudo é importante observar a importância de ter tal lista. Se você deseja desenvolver um projeto completamente personalizado não há motivos para reinventar a roda. Portanto, ao saber a identificação de cada item contido nas barras de comando do Access você poderá utilizar estes itens em seu projeto colocando-os eu seu próprio menu de forma seletiva.

« Anterior Δ Página principal ¤ Índice Próxima »

você conhece a universidade do access?

Universidade do Access - Curso Completo de Access
com tudo para você dominar o Access - do Básico ao
Avançado - até a Criação de Sistemas Profissionais
Completos - Passo a Passo - Tela a Tela

Capa da Universidade do Access

Aplica-se ao Access 2019, 2016, 2013 e 2010!

13 Cursos - 574 Vídeo-Aulas - 63:32 horas

Para todos os detalhes, acesse:

https://juliobattisti.com.br/universidade-do-access.asp

Quer receber novidades e e-books gratuitos?

MEGA FORMAÇÃO EM INFRAESTRUTURA DE TI

(Online, Vitalício, Prático e Atualizado)!

  • Chega de ser Ignorado pelo Mercado!

  • A vida não vai Melhorar Sozinha!

  • Quem domina infraestrutura, domina o Mercado.

  • Com esta Formação você vai Dominar o Conhecimento e torne-se o Profissional que as Empresas estão Buscando, "desesperadamente", mas não estão encontrando.

NÃO PROCURE VAGAS, SEJA PROCURADO!

 

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

Para Todos os Detalhes, Acesse:

Curso Completo de Excel - Curso Online com Certificado - 925 Vídeo Aulas - 22 Cursos - 120:42 horas

 

https://juliobattisti.com.br/curso-infra-ti.asp

 

Contato: Telefone: (51) 3717-3796 | E-mail: webmaster@juliobattisti.com.br | Whatsapp: (51) 99627-3434

Júlio Battisti Livros e Cursos Ltda | CNPJ: 08.916.484/0001-25 | Rua Vereador Ivo Cláudio Weigel, 537 - Universitário, Santa Cruz do Sul/RS, CEP: 96816-208

Todos os direitos reservados, Júlio Battisti 2001-2026 ®

LIVRO: MACROS E PROGRAMAÇÃO VBA NO EXCEL 2016 - CURSO COMPLETO E PRÁTICO

DOMINE A PROGRAMAÇÃO VBA NO EXCEL - 878 PÁGINAS - CLIQUE AQUI