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 Martim



Neste 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.

Robert Martim

Robert Martim - Formado e Pós-Graduado em Finanças pela Universidade de Londres, Reino Unido. Diretor de TI da Faircourt Capital Limited (Reino Unido). Fornece suporte pro bono em TI à entidade de caridade Nigeriana NIDOE (Nigerians in Diaspora Organisation Europe) desde 2001. Colaborador ativo do fórum Excel Avançado do site www.juliobattisti.com.br, onde divide seu conhecimento e experiência com outros membros do espaço.
Autor do livro Excel e VBA na Modelagem Financeira: Uma abordagem prática.