Desenvolvimento - Office
RibbonX – Adicionando conteúdo dinâmico
Neste breve artigo discutirei a criação de um menu dinâmico na nova interface de usuário do Excel 2007.
por Robert MartimNeste breve artigo discutirei a criação de um menu dinâmico na nova interface de usuário do Excel 2007. Este artigo é um excerto do material de treinamento sobre programação do RibbonX o qual pode ser adquirido na loja do site em: http://shop.linhadecodigo.com.br/treinamento.asp?id=2778. No Treinamento, o leitor aprenderá todo o processo de programação e implementação das soluções desenvolvidas.
Para aqueles que se acostumaram com o antigo método de personalização das barras de ferramentas o novo método pode parecer horrível. Não obstante a nova complexidade introduzida no RibbonX, a flexibilidade e novas possibilidades de personalização vão muito além do que é possível fazer no antigo sistema. Por exemplo:
-
Você
alguma vez precisou desabilitar um comando no Excel (digamos, o comando
“Imprimir”)? Se sim, o leitor recordará das implicações disso. Na nova
interface, podemos fazê-lo globalmente evitando brechas na impressão;
-
Precisou
remover o menu principal pelo seu? Lembra da implicação disso para outras
sessões do Excel?
- Alguma vez precisou adicionar imagens em grupos? Agora, podemos fazê-lo rapidamente como mostra a figura:
Figura 1:
Criando galerias de imagens
Ao passo que é verdadeiro que requererá um pouco mais de tempo nosso no XML, é muito mais verdadeiro que as possibilidades mais do que compensam tal trabalho. Além do que para os que desenvolvem em VS.NET o trabalho é facilitado pelos “schemas” XML que adicionam “Intellisense” durante a criação.
Portanto, vamos supor o seguinte cenário: existe uma determinada interface que deve somente ser mostrada quando algo é clicado (como as guias sensíveis ao contexto). Em situações como estas, nós queremos criar o conteúdo dinâmicamente para que o mesmo seja mostrado somente nas situações determinadas.
Obtemos tal resultado utilizando o atributo getContent. O valor do atributo é, na verdade, um callback (um procedimento VBA) que deve ser executado para determinar o conteúdo.
Vejamos um exemplo simples de como isso pode ser feito. A figura abaixo mostra a nossa guia com um menu sem conteúdo:
Figura 2:
Menu de conteúdo dinâmmico
O conteúdo do menu deve ser mostrado quando a célula A1 da primeira planilha for diferente de vazio. Aqui, teremos dois trabalhos distintos envolvendo XML (os quais podem ser feitos no CustomUI Editor ou outro editor de XML qualquer):
· Criar o XML para definir a guia conforme mostrado acima;
· Criar o XML para ser inserido dinamicamente no VBA o qual será retornado pelo callback especificado no atributo getContent.
Vamos iniciar pelo XML que criará a guia, grupo e botão conforme a figura anterior:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="setRib">
<ribbon startFromScratch="false">
<tabs>
<tab
id="idGuia"
insertBeforeMso="TabHome"
label="Minha Guia">
<group
id="ifGrp"
label="Meu Grupo">
<dynamicMenu id="idDMnu"
getContent="conteudoDin"
imageMso="Spelling"
label="Meu Menu Dinâmico"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Note o atributo getContent do menu dinâmico no XML acima. É este callback que será utilizado para escrever o conteúdo dinamicamente.
Note também o atributo onLoad. Aqui, utilizamos tal atributo para podermos invalidar a Faixa de Opções e forçar a chamada do callback conteudoDin.
O próximo passo requer a criação do conteúdo dinâmico. Neste caso, o ideal é criar um novo arquivo Excel e criar toda a interface e testá-la. Uma vez que tal interface esteja pronta, nós precisamos transformá-la em uma string que será utilizado no VBA.
Este processo requererá um pouco de paciência e cuidado. Lembre-se que usamos as aspas (“”) para abrir e fechar uma string. Não obstante, o código XML já conterá aspas que envelopam os valores dos atributos (por exemplo, getContent="conteudoDin").
Neste caso, precisamos duplicar as aspas para que não haja erro na string durante o callback.
Vejamos então uma string contendo o código XML:
xml = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & _
"<button id=""btn1"" imageMso=""FileOpen"" label=""Abrir doc"" onAction=""callbackDin"" />" & _
"<button id=""btn2"" imageMso=""ChartTypeAllInsertDialog"" label=""Criar gráfico"" onAction=""callbackDin"" />" & _
"<button id=""btn3"" imageMso=""XmlDataRefresh"" label=""Atualizar Dados XML"" onAction=""callbackDin"" />" & _
"</menu>"
Finalmente, precisamos gerar os callbacks e exportá-los para o VBA onde escreveremos o miolo. Iniciaremos pelo VBE da pasta de trabalho onde inseriremos o código a seguir:
Option Explicit
Private Sub Workbook_Open()
" Ao abrir, determina se a célula A1 possui
" algo escrito
If Sheet1.Range("A1") <> "" Then
" Variável global declarada no módulo
" como sendo pública
blnConteudo = True
End If
End Sub
Agora, inseriremos o código no VBE da planilha 1 (sheet1) para checar se o valor em A1 é diferente de vazio. A checagem ocorrerá sempre que algo for modificado na planilha:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
" O valor booleano para determinar se o conteúdo
" é ou nao mostrado é definido de início como "False" (falso)
blnConteudo = False
" Checar para saber se há algo na célula A1
If Sheet1.Range("A1") <> "" Then
" Se sim, modificar o valor booleano para "True"
blnConteudo = True
End If
" Chamar a rotina que invalida o RibbonX
Call invalidarRib
End Sub
Finalmente, adicione um módulo onde inseriremos os callbacks como segue:
Option Explicit
"Variável booleana pública para determinar
"Se o conteúdo é ou nao mostrado
Public blnConteudo As Boolean
"Variável global representando o nosso RibbonX
Dim mRib As IRibbonUI
"Rotina a ser chamada para invalidar o RibbonX
Sub invalidarRib()
mRib.Invalidate
End Sub
"Callback executado quando o ribbon é carregado
"(refere-se ao atributo onLoad)
Sub setRib(ribbon As IRibbonUI)
" Instancia a variável global como sendo o ribbon
Set mRib = ribbon
" Invalida o Ribbon forçando a reexecução dos callbacks
mRib.Invalidate
End Sub
"Callback para gerar o conteúdo dinâmica
Sub conteudoDin(control As IRibbonControl, ByRef returnedVal)
" Variável do tipo string para armazenar o código xml
Dim xml As String
" Código xml do conteúdo dinâmico. Note que podemos definir
" callbacks dentro deste conteúdo xml. Porém, não esqueça de
" adicionar tais callbacks ao seu conteúdo VBA.
xml = "<menu xmlns=""http://schemas.microsoft.com/office/2006/01/customui"">" & _
"<button id=""btn1"" imageMso=""FileOpen"" label=""Abrir doc"" onAction=""callbackDin"" />" & _
"<button id=""btn2"" imageMso=""ChartTypeAllInsertDialog"" label=""Criar gráfico"" onAction=""callbackDin"" />" & _
"<button id=""btn3"" imageMso=""XmlDataRefresh"" label=""Atualizar Dados XML"" onAction=""callbackDin"" />" & _
"</menu>"
" Checar o valor booleano e determinar o que deve ser mostrado
If blnConteudo = True Then
" Se verdadeiro, mostrar conteúdo dinâmico
returnedVal = xml
Else:
" Caso contrário, mostrar nada.
returnedVal = False
End If
End Sub
Sub callbackDin(control As IRibbonControl)
MsgBox "Você clicou no botão de id: " & control.ID, vbInformation
End Sub
Salve, feche o arquivo e abra-o novamente. A interface dinâmica está pronta para uso, bastando apenas modificar o valor contido na célula A1 da planilha 1:
Figura 3:
Resultado do conteúdo criado dinamicamente
Conclusão
Neste curto artigo mostro como modificar a nova interface de usuário do Excel utilizando conteúdo dinâmico.
Este artigo é excerto do material de Treinamento encontrado em http://shop.linhadecodigo.com.br/treinamento.asp?id=2778 o qual trata exclusivamente da programação e personalização da interface do RibbonX. No Treinamento, o leitor aprenderá todo o processo de programação e implementação das soluções desenvolvidas.
O material é desenvolvido sobre o Excel 2007 português e não é compatível com a versão Beta 2 do Excel. Os interessados podem obter um cópia do Office 2007 Trial em http://us1.trymicrosoftoffice.com/ para acompanhar o Treinamento.
Robert Friedrick Martim, Expert da Comunidade Excel
Robert Martim é Economista, Formado e Pós-Graduado em Finanças pela
Universidade de Londres, Microsoft MVP Excel.
- Data Bars para MS-AccessAccess
- Funcionalidades do Office usando Visual Studio for Office – Parte 3C#
- Funcionalidades do Office usando Visual Studio for Office - Parte 2C#
- Estenda as funcionalidades do Office com o Visual Studio for OfficeC#
- Como evitar processos pendurados na automação do ExcelOffice