web 2.0


Office 2010 Personalizando o Ribbon via XML (autoScale)

Todos sabemos como era difícil customizar (ou personalizar, se preferir) o Office 2007. Isso mudou bastante no Office 2010 e ficou tudo bem mais simples. Uma grande novidade nesta personalização da Faixa de Opções (também conhecida como Ribbon ou RibbonX) esta ligada a escala dos grupos.

Anteriormente, somente os grupos padrões da Faixa de Opções podiam colapsar, agora, foi introduzido o atributo autoScale o qual é utilizado para determinar se um grupo personalizado deve ou não colapsar quando reduzimos o tamanho da Faixa de Opções.

Aproveite para fazer o nosso curso de programação VBA.



Figura 1: Grupo da Faixa de Opções expandido

O grupo "Minhas Ferramentas", no momento, está expandido normalmente. Mas supondo que a configuração da tela ou do monitor seja modificada, nós obteríamos o seguinte resultado com o autoScale="true":
 


Figura 2: Grupo da Faixa de Opções colapsado

Se continuarmos reduzindo a Faixa de Opções, o grupo continua o processo, colapsando ainda mais os elementos de nosso grupo:


Figura 3: Botões colapsados para um splitButton

Para implementar esta customização / personalização da Faixa de Opções (Ribbon) basta adicionar o atributo autoScale e determinar o seu valor como sendo "true".

Note que este atributo deve ser determinado para cada grupo separadamente, ele não tem efeito global sobre os outros grupos em seu Ribbon. 

Tags: , , ,

Microsoft Office

Ocultar Ribbon sem Editar XML

A dica é simples, fácil, porém pouco conhecida...

 

veja como ocultar o faixa de opções do excel sem editar diretamente as declaraçoes XML do CustomUI.xml

 

False para Ocultar

True para restaurar

Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Ribbon"",false)"

 

teste na janela imediata

 

Tags: , , , ,

Microsoft 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. Este artigo é um excerto do material de treinamento sobre programação do RibbonX o qual pode ser adquirido na loja do site em: http://loja.msofficegurus.com 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="idGrp"
     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.

Tags: , , , ,

Microsoft Office | VBA

Customizando a Ribbon no Office 2010

lá pessoal, neste primeiro artigo vou demostrar pra você um dos novos recursos que a versão 14 do Office nos oferece.

É sábido para muitos de nós que desenvolvemos para Office 2007, que para manipular os componentes da faixa de opções devemos ter conhecimentos no formato de XML para tal tarefa, ja que toda a definição dos elementos é feita diretamente no arquivo XML.

Pois bem, vejam que a Microsoft atendeu aos nossos pedidos e incorporou no Office 2010 um editor de personalização da Ribbon.

O que na versão anteriro só era possível modificar somente a barra de acesso rápido, agora podemos incluir/remover guias e grupos interativamente. E mais, é possível ainda renomear as guias padrões do Office.

Vamos lá !

 

         

 

  • Clique em Options
  • No dialogo de opções do Excel, localize e clique na categoria Customize Ribbon

  • Nessa tela temos a mesma visão que na versão 2007, porem agora temos mais cinco novos botões.
  • Para criar uma nova Guia, clique em New Tab
  • Será criada uma guia na lista logo após a guia que esta selecionada
  • Para criar um novo grupo, selecione uma guia na lista e e clique em New Group
  • Para renomar uma guia ou um grupo, selecione o item na lista e clique no botão Rename
  • Após as modificações, clique no botão OK para sair

 

       

 

A nova guia criada !

 

Conclusão

Se considerarmos o nivel de personalização que tinhamos no Office 2007, podemos dizer que ja tivemos um avanço nesse quesito pois assim podemo criar nossas proprias guias e grupo.

Mas ainda não chegou ao estagio de personalização completo como tinhamos  (e ainda temos) na versão 2003, pois, por enquanto, só é possível realizar modificações nas guias e grupos a nivel de aplicativo, ou seja, para todo o Excel. Não é possível criar botões personalizados e nem guias e grupos a nivel de documento.

Um grande abraço e até o proximo artigo.

 

[]s

 

Tags: , , , ,

Microsoft Office

Criando um Ribbon Dinâmico

Neste artigo tratarei da criação dinâmica de ribbons utilizando-se de dados disponíveis na planilha ativa.
Isto é útil em casos em que haja a necessidade dos controles serem alterados, sem necessidade de alterações no código xml.
Estes controles também permitem que sejam passados paramêtros para qualquer rotina.

Primeiro é necessário editar o arquivo xml, do arquivo, para isto abra o arquivo no Office no Office 2007 Custom UI Editor

Neste arquivo xml, criei 2 grupos, cada um deles contendo um combobox

 

 

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">

  <ribbon startFromScratch="true">

 

    <tabs>

 

      <tab id="MeuRibbon" label=" Meu Ribbon Dinâmico" insertBeforeMso="TabHome">

 

        <group id="Grupo1" label="Grupo 1">

          <comboBox id="Cb1"

          label="Selecione a Opção:"

          onChange="MyCombo1_Click"

          getItemCount="CountGrupo1"

          getItemLabel ="LabelGrupo1"

          sizeString="123456789012345678901234567890"

>

          </comboBox>

        </group>

 

        <group id="Grupo2" label="Grupo 2">

          <comboBox id="Cb2"

          label="Selecione a Opção:"

          onChange="MyCombo2_Click"

          getItemCount="CountGrupo2"

          getItemLabel = "LabelGrupo2"

          sizeString="123456789012345678901234567890"

>

          </comboBox>

        </group>

 

      </tab>

 

    </tabs>

  </ribbon>

</customUI>


 

 

As definições xml do combobox são as seguintes:

 

 

comboBox id="Cb2" - definindo o ID do controle

label="Selecione a Opção:"  - definindo o label que será apresentado ao usuário

onChange="MyCombo2_Click" - definindo qual será a ação executada na alteração do controle pelo usuário

getItemCount="CountGrupo2" - retorna a quantidade de itens que serão exibidos no combo

getItemLabel = "LabelGrupo2" - preenche o combobox com os valores 

sizeString="123456789012345678901234567890" - definindo o tamanho do combobox

 

 

 

Pronto o nosso arquivo xml já está pronto para receber os dados em tempo de execução, para que o código funcione , é necessário a criação das rotinas no nosso arquivo xlsm.

 

O código necessário par ao arquivo .xlsm é o seguinte:

 

 

'Intervalo para o Combo1

Dim cb1rg As Range

'Intervalo para o Combo2

Dim cb2rg As Range

 

'Rotinas para o grupo1

Sub MyCombo1_Click(control As IRibbonControl, text As String)

    Call Minharotina("Grupo 1", text)

End Sub

 

Sub CountGrupo1(control As IRibbonControl, ByRef returnedVal)

    Set cb1rg = Plan1.Range("A2:A" & Plan1.Range("A2").End(xlDown).Row)

    returnedVal = cb1rg.Rows.Count

End Sub

 

Sub LabelGrupo1(control As IRibbonControl, index As Integer, ByRef returnedVal)

    returnedVal = cb1rg.Cells(index + 1).Value

End Sub

 

'Rotinas para o Grupo 2

Sub MyCombo2_Click(control As IRibbonControl, text As String)

    Call Minharotina("Grupo 1", text)

End Sub

 

Sub CountGrupo2(control As IRibbonControl, ByRef returnedVal)

    Set cb2rg = Plan1.Range("B2:B" & Plan1.Range("B2").End(xlDown).Row)

    returnedVal = cb2rg.Rows.Count

End Sub

 

Sub LabelGrupo2(control As IRibbonControl, index As Integer, ByRef returnedVal)

    returnedVal = cb2rg.Cells(index + 1).Value

End Sub

 

 

Sub MinhaRotina(Plan As String, Item As String)

    MsgBox "Você selecionou o item " & Item & " de " & Plan

End Sub



Pronto , para testar feche e abra o arquivo novamente, os dados constantes na coluna A serão exibidos no grupo 1, os dados constantes na coluna B serão exibidos no Grupo 2.


 

 

 

Como este é meu primeiro Post por aqui, dúvidas e sugestões são bem vindas. Caso tenha algum problema com formatação corrigirei assim que possível.

baixe aqui o arquivo de exemplo -> Exemplo RibbonDinamico.xlsm (17,50 kb)



Bruno Leite
Office Developer

 

 

Tags: , , , , ,

Microsoft Office | VBA

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. 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=""HappyFace"" label=""Smile"" onAction=""callbackDin"" />" & _

      "<button id=""btn2"" imageMso=""FormatPainter"" label=""Paint"" onAction=""callbackDin"" />" & _

      "<button id=""btn3"" imageMso=""AutoFilter"" label=""Filter"" 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.

Conheça alguns dos e-books do autor sobre Excel e Access:

 

Tags: , , , ,

Microsoft Office | VBA