É tarefa de todo desenvolvedor levar aos usuários maneiras fáceis de selecionar recursos e comandos em qualquer aplicativo. Não importa se você levou meses escrevendo linhas e mais linhas de códigos para para desenvolver uma aplicação. Depois de escrever todos os procedimentos VBA, você deve dedicar o tempo que for necessário adicionando recursos que facilitem o trabalho dos usuários. Fazendo isso, seu aplicativo será rápido e fácil de usar.
A melhor forma de criar uma Interface de Usuário (UI) agradável no Excel é através da personalização da Ribbon, onde é possível criar e manipular as Guias (Tabs), Grupos (Groups), e diversos tipos de controles diferentes que podem ser aplicados dependendo da operação que se necessita realizar.
O objetivo desse post é ensinar você como programar a Ribbon do Excel à partir da manipulação da estrutura XML que a forma. Além disso, iremos utilizar o VBA para executar tarefas ao interagir com os controles criados dentro da Ribbon de forma programática.
Capítulos
Visão Geral da Interface Ribbon do Excel
A Ribbon é formada pela Faixa de Opções, onde também está presente a barra de título, a Barra de Ferramentas de acesso rápido e as Guias (Tabs). As Guias por sua vez, são formadas por um ou mais Grupos, e cada grupo consiste em um ou mais controles.
Dentro dos grupos da Ribbon de uma pasta de trabalho comum do Excel é possível notar a presença de muitos controles diferentes, cada um desses controles nos fornece acesso a uma tarefa específica, mas sempre visando o mesmo objetivo, tornar a navegação do usuário a mais fácil possível.
Toda essa variedade de Guias, grupos e controles, possibilita aos usuários criarem uma infinidade de operações, cálculos matemáticos, gráficos, enfim, projetos de praticamente todos os tipos. Porém, em muitos casos, após desenvolver uma aplicação para uma finalidades especifica, torna-se necessário o uso somente dos comandos desejáveis para aplicação criada. Um exemplo, seria a criação de um sistema de caixa. Nesse caso, deixar o usuário com acesso a todos os comandos nativos do Excel pode acabar sendo um problema maior. É aí que entra a necessidade de customização da Ribbon, em outras palavras, é necessário criar os próprios recursos e controles para essa finalidade. E é justamente isso que iremos discutir nesse post.
Programando a Ribbon do Excel com XML e VBA
Fazendo uso somente do VBA não é possível customizar a Ribbon do Excel, isso porque o VBA opera internamente. Para modificar a estrutura XML responsável pela organização da Ribbon é preciso acessar o arquivo externamente. Isso pode ser feito usando qualquer ferramenta de edição de XML, como por exemplo o próprio Bloco de notas. Porém, o aconselhável é fazer isso usando uma ferramenta destinada exclusivamente para esse tipo de opção, pois somente assim poderemos validar o arquivo e saber exatamente se as alterações que estamos fazendo estão corretas. Para essas alterações iremos utilizar uma ferramenta chamada CustomUIEditor. Para saber como instalar e utilizar corretamente assista ao vídeo.
Guias (Tabs)
A estrutura CustomUI XML abaixo pode ser usada para criar uma nova Guia dentro de uma pasta de trabalho do Excel, com o nome “Página Inicial”. É possível adicionar várias Guias, a estrutura se repete, com exceção do elemento “id” que sempre terá que receber um nome específico para cada Guia. A mesma ideia se repete para todos os outros elementos, a exemplo os grupos e controles.
Na grande maioria dos casos, o uso de apenas algumas dessas propriedades já é suficiente para determinar as funções desejadas, isso vale para todos os controles da Ribbon. Note que no exemplo acima, usamos apenas as propriedades “id“, “label” e “visible“, e isso já foi o bastante para a criação da Guia desejada sem afetar ou comprometer nada do nosso arquivo. Eu poderia ainda apagar a propriedade “visible“, ao fazer isso, o arquivo iria continuar exibindo a Guia Página inicial criada, isso porque quando não especificamos essa propriedade, o padrão é o “true“, ou seja, verdadeiro. Agora se eu quisesse que a Tab “Página inicial” ficasse oculta, nesse caso eu precisaria obrigatoriamente especificar a propriedade “visible” do elemento Tab como sendo “false“.
Propriedades
Dentre todos as propriedades do elemento Guia (tab), que podem ser usados, estão:
- id
- idMso
- idQ
- keytip
- label
- tag
- commentText
- visible
CustomUI XML
Callback VBA
Public Sub Tab1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control tab
End Sub
Public Sub Tab1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control tab
End Sub
Public Sub Tab1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control tab
End Sub
Resultado
Mudando a posição da Guia criada
Existem duas maneiras de mudar a posição de uma Guia, usando o elemento “insertBeforeMso“, que traduzindo seria “Inserir antes”, ou usando o elemento “insertAfterMso“, que significa “Inserir após”. Nesse caso, se quisermos inserir qualquer Guia criada antes da Tab “Pagina Inicial” nativa do Excel, basta escrevermos insertBeforeMso=”TabHome”, conforme especificado no exemplo abaixo.
CustomUI XML
Resultado
Ocultando as Todas as Guias nativas do Excel
Para ocultar todas as Tabs nativas do Excel, você pode estar fazendo uso de duas formas distintas, a primeira é você definir a propriedade “visible=false” individualmente para cada Tab do Excel, já na segunda, basta inserir o atributo “startFromScratch=”false”” na frente do elemento ribbon. Ao definir esse atributo como sendo Falso, você força o Excel a ocultar todas as tabs sempre que essa pasta de trabalho for iniciada.
CustomUI XML
Resultado
Grupos
Propriedades
- autoScale
- centerVertically
- id
- idMso
- idQ
- image
- imageMso
- keytip
- label
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Group1_getImage(control as IRibbonControl, ByRef returnedVal)
' Code for getImage callback. Ribbon control group
End Sub
Public Sub Group1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control group
End Sub
Public Sub Group1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control group
End Sub
Public Sub Group1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control group
End Sub
Criando Controles
Label (Rótulo)
Propriedades
- enabled
- id
- idMso
- idQ
- label
- screentip
- showlLbel
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Label1_getLabel(control As IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control labelControl
returnedVal = "Hello World!"
'returnedVal = "Bem vindo: " & Application.UserName
End Sub
Public Sub Label1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control labelControl
End Sub
Public Sub Label1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control labelControl
End Sub
Public Sub Label1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control labelControl
End Sub
Public Sub Label1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control labelControl
End Sub
Public Sub Label1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control labelControl
End Sub
Resultado
EditBox (Caixa de edição)
Propriedades
- enabled
- id
- idMso
- image
- imageMso
- keytip
- label
- maxLength
- screentip
- showImage
- showLabel
- sizeString
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub EditBox1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getImage(control as IRibbonControl, ByRef returnedVal)
' Code for getImage callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getShowImage(control as IRibbonControl, ByRef returnedVal)
' Code for getShowImage callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control editBox
End Sub
Public Sub EditBox1_getText(control As IRibbonControl, ByRef returnedVal)
' Code for getText callback. Ribbon control editBox
returnedVal = Date
End Sub
Public Sub EditBox1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control editBox
End Sub
Public Sub EditBox1_onChange(control as IRibbonControl, Text as String)
' Code for onChange callback. Ribbon control editBox
End Sub
Resultado
Button (Botão)
Propriedades
- description
- enabled
- id
- idMso
- idQ
- image
- imageMso
- keytip
- label
- onAction
- screentip
- showImage
- shwoLabel
- size
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Button1_getDescription(control as IRibbonControl, ByRef returnedVal)
' Code for getDescription callback. Ribbon control button
End Sub
Public Sub Button1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control button
End Sub
Public Sub Button1_getImage(control as IRibbonControl, ByRef returnedVal)
' Code for getImage callback. Ribbon control button
End Sub
Public Sub Button1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control button
End Sub
Public Sub Button1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control button
End Sub
Public Sub Button1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control button
End Sub
Public Sub Button1_getShowImage(control as IRibbonControl, ByRef returnedVal)
' Code for getShowImage callback. Ribbon control button
End Sub
Public Sub Button1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control button
End Sub
Public Sub Button1_getSize(control as IRibbonControl, ByRef returnedVal)
' Code for getSize callback. Ribbon control button
End Sub
Public Sub Button1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control button
End Sub
Public Sub Button1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control button
End Sub
Public Sub Button1_onAction(control As IRibbonControl)
' Code for onAction callback. Ribbon control button
UserForm1.Show
End Sub
Resultado
Uma propriedade adicional do controle Button que ajuda bastante é “size“, que nos possibilita mudar o tamanho do controle. Por exemplo, se modificarmos a propriedade de size=”normal” para size=”large” dentro CustomXML, notaremos o seguinte resultado.
Uma propriedade adicional do controle Button que ajuda bastante é “size“, que nos possibilita mudar o tamanho do controle. Por exemplo, se modificarmos a propriedade de size=”normal” para size=”large” dentro CustomUI XML, notaremos o seguinte resultado.
Button Group (Grupo de botões)
Propriedades
- id
- idQ
- CommentText
- Visible
CustomUI XML
Resultado
Check Box
Propriedades
- description
- enabled
- id
- idMso
- idQ
- label
- screentip
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Checkbox1_getDescription(control as IRibbonControl, ByRef returnedVal)
' Code for getDescription callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getPressed(control as IRibbonControl, ByRef returnedVal)
' Code for getPressed callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control checkBox
End Sub
Public Sub Checkbox1_onAction(control As IRibbonControl, pressed As Boolean)
' Code for onAction callback. Ribbon control checkBox
If pressed = True Then
ActiveWindow.DisplayGridlines = True
pressed = False
Else
ActiveWindow.DisplayGridlines = False
pressed = True
End If
End Sub
Public Sub Checkbox2_onAction(control As IRibbonControl, pressed As Boolean)
' Code for onAction callback. Ribbon control checkBox
If pressed = True Then
Application.DisplayFormulaBar = True
pressed = False
Else
Application.DisplayFormulaBar = False
pressed = True
End If
End Sub
Public Sub Checkbox3_onAction(control As IRibbonControl, pressed As Boolean)
' Code for onAction callback. Ribbon control checkBox
If pressed = True Then
Application.DisplayStatusBar = True
pressed = False
Else
Application.DisplayStatusBar = False
pressed = True
End If
End Sub
Resultado
ComboBox (Caixa de combinação)
- enabled
- id
- idMso
- idQ
- image
- imageMso
- keytip
- label
- maxLength
- screetip
- showImage
- showItemAttribut
- showItemImage
- showLabel
- sizeString
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Combobox1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getImage(control as IRibbonControl, ByRef returnedVal)
' Code for getImage callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemCount(control as IRibbonControl, ByRef returnedVal)
' Code for getItemCount callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemID(control as IRibbonControl, index as Integer, ByRef id)
' Code for getItemID callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemImage(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemImage callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemLabel(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemLabel callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemScreentip(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemScreentip callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getItemSupertip(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemSupertip callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getShowImage(control as IRibbonControl, ByRef returnedVal)
' Code for getShowImage callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getText(control as IRibbonControl, ByRef returnedVal)
' Code for getText callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control comboBox
End Sub
Public Sub Combobox1_onChange(control as IRibbonControl, Text as String)
' Code for onChange callback. Ribbon control comboBox
End Sub
Resultado
DropdownBox
Propriedades
- enabled
- id
- idMso
- idQ
- image
- imageMso
- keytip
- label
- maxLength
- screetip
- showImage
- showItemAttribut
- showItemImage
- showLabel
- sizeString
- supertip
- tag
- CommentText
- visible
CustomUI XML
Callback VBA
Public Sub Dropdown1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getImage(control as IRibbonControl, ByRef returnedVal)
' Code for getImage callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemCount(control as IRibbonControl, ByRef returnedVal)
' Code for getItemCount callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemID(control as IRibbonControl, index as Integer, ByRef id)
' Code for getItemID callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemImage(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemImage callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemLabel(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemLabel callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemScreentip(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemScreentip callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getItemSupertip(control as IRibbonControl, index as Integer, ByRef returnedVal)
' Code for getItemSupertip callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getLabel callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getScreentip(control as IRibbonControl, ByRef returnedVal)
' Code for getScreentip callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getSelectedItemID(control as IRibbonControl, ByRef index)
' Code for getSelectedItemID callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getSelectedItemIndex(control as IRibbonControl, ByRef returnedVal)
' Code for getSelectedItemIndex callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getShowImage(control as IRibbonControl, ByRef returnedVal)
' Code for getShowImage callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getSupertip(control as IRibbonControl, ByRef returnedVal)
' Code for getSupertip callback. Ribbon control dropDown
End Sub
Public Sub Dropdown1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control dropDown
End Sub
Resultado
SplitButton
O controle SlipButton é um dos mais utilizados dentro da Ribbon, isso porque ele permite criar uma hierarquia de menus com mais de um tipo de controle.
Propriedades
- enabled
- id
- idMso
- idQ
- keytip
- showLabel
- size
- tag
- CommentTxt
- visible
CustomUI XML
Callback VBA
'CALLBACKS POSSÍVEIS DENTRO DO VBA PRA O SLIPBUTTON
Public Sub Splitbutton1_getEnabled(control as IRibbonControl, ByRef returnedVal)
' Code for getEnabled callback. Ribbon control splitButton
End Sub
Public Sub Splitbutton1_getKeytip(control as IRibbonControl, ByRef returnedVal)
' Code for getKeytip callback. Ribbon control splitButton
End Sub
Public Sub Splitbutton1_getShowLabel(control as IRibbonControl, ByRef returnedVal)
' Code for getShowLabel callback. Ribbon control splitButton
End Sub
Public Sub Splitbutton1_getVisible(control as IRibbonControl, ByRef returnedVal)
' Code for getVisible callback. Ribbon control splitButton
End Sub
'-----------------------
'CALLBACKS PARA OS BOTÕES DENTRO DO SLIPBUTTON
'Callback for Button6 onAction
Sub VerInvestimentos(control As IRibbonControl)
End Sub
'Callback for Button7 onAction
Sub VerMarkenting(control As IRibbonControl)
End Sub
'Callback for Button9 onAction
Sub VerValores(control As IRibbonControl)
End Sub
'Callback for Button10 onAction
Sub VerProdutos(control As IRibbonControl)
End Sub
'Callback for Button11 onAction
Sub VerPesquisa(control As IRibbonControl)
End Sub
'Callback for Button12 onAction
Sub VerEcomerce(control As IRibbonControl)
End Sub
Resultado
Backstage
Dentro do Backstage o Excel é possível encontrar várias Tabs e Botões. Temos por exemplo as Guias “Informações”, Salvar”, Salvar como”, “Imprimir”, “Compartilhar”, “Exportar”, etc. Como botões, temos o “Novo”, “Abrir”, “Página Inicial”. Porém, se seu objetivo é criar um sistema com limitações para os usuários, torna-se interessante ocultar todos esses controles e Tabs para evitar problemas maiores.
Seguindo os método abaixo, você conseguirá não apenas ocultar essas Guias e controles, com também inserir as suas próprias.
CustomUI XML
Mestre, como desabilitar o Botão da Ribbon com base em critério. Ex: Na célula A2 da Planilha tem o número 1 e 2 Botões devem ser desabilitados quando o número for 1 e habilitado quando for 2.
Isso já é um pouco mais complexo, tanto que eu tenho um Curso inteiro só para tratar disso, se quiseres dá uma olhadinha, aqui o link: https://vetorialtreinamentos.com.br/curso-controle-de-permissoes-no-excel/
Excelente site. Este editor é compatível com office 2013?
Sim Marcio, tem uma versão mais recente, eu coloquei um link na descrição do vídeo
No evento backstage quando aplico o código e tento validar, o programa diz que o elemento é inválido. Como contornar esse erro?
Com as novas versões, ficaram os botões do Publicar>Publicar no Power BI e Obter Suplementos. Tem como tirar?