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