Como adicionar uma guia personalizada da faixa de opções usando o VBA?

98

Estou procurando uma maneira de adicionar uma guia personalizada na faixa de opções do Excel que carregue alguns botões. Por acaso, alguns recursos abordaram o assunto através do Google, mas todos parecem duvidosos e absurdamente complicados.

Qual é a maneira rápida e simples de fazer isso? Gostaria que a nova guia fosse carregada quando meu VBA fosse carregado no Excel.

ATUALIZAÇÃO : tentei este exemplo a partir daqui, mas recebo um erro "objeto obrigatório" na última instrução:

Public Sub AddHighlightRibbon()
Dim ribbonXml As String

ribbonXml = "<mso:customUI xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">"
ribbonXml = ribbonXml + "  <mso:ribbon>"
ribbonXml = ribbonXml + "    <mso:qat/>"
ribbonXml = ribbonXml + "    <mso:tabs>"
ribbonXml = ribbonXml + "      <mso:tab id=""highlightTab"" label=""Highlight"" insertBeforeQ=""mso:TabFormat"">"
ribbonXml = ribbonXml + "        <mso:group id=""testGroup"" label=""Test"" autoScale=""true"">"
ribbonXml = ribbonXml + "          <mso:button id=""highlightManualTasks"" label=""Toggle Manual Task Color"" "
ribbonXml = ribbonXml + "imageMso=""DiagramTargetInsertClassic"" onAction=""ToggleManualTasksColor""/>"
ribbonXml = ribbonXml + "        </mso:group>"
ribbonXml = ribbonXml + "      </mso:tab>"
ribbonXml = ribbonXml + "    </mso:tabs>"
ribbonXml = ribbonXml + "  </mso:ribbon>"
ribbonXml = ribbonXml + "</mso:customUI>"

ActiveProject.SetCustomUI (ribbonXml)
End Sub
Zumbido
fonte
Por favor, confirme qual versão do Excel você está usando?
Siddharth Rout
Isso é para o Project.
Nathan_Sav

Respostas:

146

AFAIK, você não pode usar o VBA Excel para criar uma guia personalizada na faixa de opções do Excel. No entanto, você pode ocultar / tornar visível um componente da faixa de opções usando o VBA. Além disso, o link que você mencionou acima é para o MS Project e não para o MS Excel.

Eu crio guias para meus aplicativos / suplementos do Excel usando este utilitário gratuito chamado Editor de IU personalizado .


Editar: Para acomodar novo pedido de OP

Tutorial

Aqui está um breve tutorial, conforme prometido:

  1. Depois de instalar o Custom UI Editor (CUIE), abra-o e clique em Arquivo | Abra e selecione o arquivo Excel relevante. Certifique-se de que o arquivo do Excel esteja fechado antes de abri-lo via CUIE. Estou usando uma nova planilha como exemplo.

    insira a descrição da imagem aqui

  2. Clique com o botão direito conforme mostrado na imagem abaixo e clique em "Office 2007 Custom UI Part". Irá inserir o "customUI.xml"

    insira a descrição da imagem aqui

  3. Próximo Clique no menu Inserir | XML de amostra | Guia personalizada. Você notará que o código básico é gerado automaticamente. Agora você está pronto para editá-lo de acordo com seus requisitos.

    insira a descrição da imagem aqui

  4. Vamos inspecionar o código

    insira a descrição da imagem aqui

    label="Custom Tab": Substitua "Guia personalizada" pelo nome que deseja dar à sua guia. Por enquanto, vamos chamá-lo de "Jerome".

    A parte abaixo adiciona um botão personalizado.

    <button id="customButton" label="Custom Button" imageMso="HappyFace" size="large" onAction="Callback" />

    imageMso: Esta é a imagem que será exibida no botão. "HappyFace" é o que você verá no momento. Você pode baixar mais IDs de imagens aqui .

    onAction="Callback": "Callback" é o nome do procedimento que é executado ao clicar no botão.

Demo

Com isso, vamos criar 2 botões e chamá-los de "Botão JG 1" e "Botão JG 2". Vamos manter o rosto feliz como a imagem do primeiro e vamos ficar com o "Sol" para o segundo. O código alterado agora se parece com isto:

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon startFromScratch="false">
<tabs>
<tab id="MyCustomTab" label="Jerome" insertAfterMso="TabView">
<group id="customGroup1" label="First Tab">
<button id="customButton1" label="JG Button 1" imageMso="HappyFace" size="large" onAction="Callback1" />
<button id="customButton2" label="JG Button 2" imageMso="PictureBrightnessGallery" size="large" onAction="Callback2" />
</group>
</tab>
</tabs>
</ribbon>
</customUI>

Exclua todo o código que foi gerado no CUIE e, em seguida, cole o código acima no lugar dele. Salve e feche o CUIE. Agora, quando você abrir o arquivo do Excel, ele terá a seguinte aparência:

insira a descrição da imagem aqui

Agora a parte do código. Abra o Editor VBA, insira um módulo e cole este código:

Public Sub Callback1(control As IRibbonControl)

    MsgBox "You pressed Happy Face"

End Sub

Public Sub Callback2(control As IRibbonControl)

    MsgBox "You pressed the Sun"

End Sub

Salve o arquivo do Excel como um arquivo habilitado para macro. Agora, ao clicar no Smiley ou no Sol, você verá a caixa de mensagem relevante:

insira a descrição da imagem aqui

Espero que isto ajude!

Siddharth Rout
fonte
6
Sim :) Ron tem muitos exemplos em seu site. rondebruin.nl/ribbon.htm
Siddharth Rout
1
Você quer criar uma nova guia? Se sim, forneça mais detalhes e eu darei o código XML :)
Siddharth Rout
1
Dê-me 20 minutos. Atualizando o post acima com o código e instantâneos relevantes :)
Siddharth Rout
6
@SiddharthRout +1 - Estou descobrindo que não preciso de nenhum livro do Excel, apenas siga suas postagens para saber o que preciso aprender em um dia de trabalho (e esta noite, é o Ribbon XML!) :)
Nosso Homem em Bananas,
1
Eu recomendaria criar um novo quesiton com seu código xml básico e o código VBA e então podemos levá-lo para lá? @YasserKhalil
Siddharth Rout
30

Consegui fazer isso com o VBA no Excel 2013. Não são necessários editores especiais. Tudo que você precisa é o editor de código Visual Basic, que pode ser acessado na guia Desenvolvedor. A guia Desenvolvedor não está visível por padrão, portanto, precisa ser ativada em Arquivo> Opções> Personalizar Faixa de Opções. Na guia Desenvolvedor, clique no botão Visual Basic. O editor de código será iniciado. Clique com o botão direito no painel Project Explorer à esquerda. Clique no menu inserir e escolha o módulo. Adicione os dois subs abaixo ao novo módulo.

Sub LoadCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI      xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='Reports' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='PTO' "   & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='GenReport'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Sub ClearCustRibbon()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Chame o sub LoadCustRibbon no Wookbook aberto e chame o sub ClearCustRibbon no evento Before_Close do arquivo de código ThisWorkbook.

Roi-Kyi Bryant
fonte
Isso funcionou para mim, mas com apenas alguns pequenos problemas que encontrei. 1) Se eu mantive o evento Before_Close ativado, a nova fita não carregou. 2) Quando consegui fazer a faixa de opções funcionar removendo o evento Before_Close, tive que recarregar o Excel antes que ele aparecesse. Se você pudesse informar por que isso está acontecendo, seria ótimo!
Petay87 de
O código é exatamente o mesmo? Você pode postar? A ideia é que o Excel deve modificar o arquivo padrão da faixa de opções antes que a faixa de opções seja carregada e reiniciá-lo antes que a pasta de trabalho seja fechada. A redefinição da faixa de opções é necessária para que ela não seja exibida em outras pastas de trabalho.
Roi-Kyi Bryant de
3
Este código substitui todas as personalizações atuais da faixa de opções que o usuário já pode ter feito.
WizzleWuzzle
@WizzleWuzzle Não é necessário. A faixa de opções pode ser importada e analisada em um objeto que pode ser atravessado. Novos elementos podem então ser adicionados ao objeto. O resultado pode ser salvo em um arquivo. A questão era como criar uma faixa de opções personalizada; não como modificar um existente.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant A questão era adicionar um item de fita personalizada, não substituir toda a fita personalizada atual. Este código substitui a faixa de opções atual.
WizzleWuzzle de
24

Lutei como um louco, mas esta é realmente a resposta certa. Para valer a pena, o que eu perdi foi isso:

  1. Como outros dizem, não se pode criar a faixa de opções CustomUI com VBA, entretanto , você não precisa!
  2. A ideia é criar seu código xml da faixa de opções usando Arquivo do Excel> Opções> Personalizar faixa de opções e, em seguida, exportar a faixa de opções para um arquivo .customUI (é apenas um arquivo txt, com xml)
  3. Agora vem o truque : você pode incluir o código .customUI em seu arquivo .xlsm usando a ferramenta MS à qual se referem aqui, copiando o código do arquivo .customUI
  4. Depois de incluído no arquivo .xlsm, toda vez que você o abre, a faixa de opções que você definiu é adicionada faixa de opções à faixa de opções do usuário - mas use <ribbon startFromScratch = "false"> ou você perderá o restante da faixa. Ao sair da pasta de trabalho, a faixa de opções é removida.
  5. A partir daqui é simples, crie sua faixa de opções, copie o código xml que é específico para sua faixa de opções do arquivo .customUI e coloque-o em um invólucro como mostrado acima (... <tabs> seu xml </ tabs .. .)

Aliás, a página que explica isso no site do Ron agora está em http://www.rondebruin.nl/win/s2/win002.htm

E aqui está seu exemplo de como ativar / desativar botões na Faixa de Opções http://www.rondebruin.nl/win/s2/win013.htm

Para outros exemplos de xml de fitas, consulte também http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

Jan Wijninckx
fonte
2
Ainda (5 anos depois) a melhor resposta na minha opinião e talvez OP @BuZz gostaria de atualizar o post original, pelo menos apontando para esta resposta (?). Eu mal o encontrei, pois estava no final de uma lista bastante longa de respostas.
Chri.s
18

As respostas aqui são específicas para o uso do Editor de IU personalizado. Passei algum tempo criando a interface sem aquele programa maravilhoso, então estou documentando a solução aqui para ajudar qualquer pessoa a decidir se precisa ou não desse editor de IU personalizado.

Encontrei a seguinte página da Web de ajuda da microsoft - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Isso mostra como configurar a interface manualmente, mas tive alguns problemas ao apontar para meu código de suplemento personalizado.

Para fazer com que os botões funcionem com suas macros personalizadas, configure a macro em seus subs .xlam para ser chamada conforme descrito nesta resposta do SO - Chamando uma macro do Excel da faixa de opções . Basicamente, você precisará adicionar o parâmetro "control As IRibbonControl" a qualquer módulo apontado pelo xml da faixa de opções. Além disso, seu xml da faixa de opções deve ter a sintaxe onAction = "myaddin! Mymodule.mysub" para chamar corretamente quaisquer módulos carregados pelo suplemento.

Usando essas instruções, consegui criar um suplemento do Excel (arquivo .xlam) que tem uma guia personalizada carregada quando meu VBA é carregado no Excel junto com o suplemento. Os botões executam o código do suplemento e a guia personalizada é desinstalada quando Eu removo o suplemento.

Jomtung
fonte
1
Isso funciona para aqueles de nós que não possuem todas as ferramentas de desenvolvimento. Obrigado pela solução "simples"
Evan
2
Eu costumava ensinar esse método aos meus alunos de programação do segundo ano, mas acabei descobrindo que usar a ferramenta CustomUI é simplesmente menos complicado se você puder acessá-la.
Rick Henderson
8

Além da resposta de Roi-Kyi Bryant, este código funciona totalmente no Excel 2010. Pressione ALT + F11 e o editor VBA aparecerá. Clique duas vezes em ThisWorkbookno lado esquerdo e cole este código:

Private Sub Workbook_Activate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI      xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>" & vbNewLine
ribbonXML = ribbonXML + "  <mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:qat/>" & vbNewLine
ribbonXML = ribbonXML + "    <mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "      <mso:tab id='reportTab' label='My Actions' insertBeforeQ='mso:TabFormat'>" & vbNewLine
ribbonXML = ribbonXML + "        <mso:group id='reportGroup' label='Reports' autoScale='true'>" & vbNewLine
ribbonXML = ribbonXML + "          <mso:button id='runReport' label='Trim' " & vbNewLine
ribbonXML = ribbonXML + "imageMso='AppointmentColor3'      onAction='TrimSelection'/>" & vbNewLine
ribbonXML = ribbonXML + "        </mso:group>" & vbNewLine
ribbonXML = ribbonXML + "      </mso:tab>" & vbNewLine
ribbonXML = ribbonXML + "    </mso:tabs>" & vbNewLine
ribbonXML = ribbonXML + "  </mso:ribbon>" & vbNewLine
ribbonXML = ribbonXML + "</mso:customUI>"

ribbonXML = Replace(ribbonXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Private Sub Workbook_Deactivate()

Dim hFile As Long
Dim path As String, fileName As String, ribbonXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribbonXML = "<mso:customUI           xmlns:mso=""http://schemas.microsoft.com/office/2009/07/customui"">" & _
"<mso:ribbon></mso:ribbon></mso:customUI>"

Open path & fileName For Output Access Write As hFile
Print #hFile, ribbonXML
Close hFile

End Sub

Não se esqueça de salvar e reabrir a pasta de trabalho. Espero que isto ajude!

Erikas
fonte
Como você passaria argumentos com isso? Tenho usado isso, mas não consigo encontrar uma maneira de passar argumentos.
jDave1984
Usando minha resposta, você adicionaria uma lista de argumentos a cada sub-rotina, algo como LoadCustomRibbon (tabName as String, groupName as String, btnName as String). Em seguida, chame essas sub-rotinas no local apropriado, conforme @Erikas apontou.
Roi-Kyi Bryant
6

Encontrei dificuldades com a solução de Roi-Kyi Bryant quando vários add-ins tentaram modificar a faixa de opções. Eu também não tenho acesso de administrador em meu computador de trabalho, o que descartou a instalação do Custom UI Editor. Portanto, se você estiver no mesmo barco que eu, aqui está um exemplo alternativo para personalizar a faixa de opções usando apenas o Excel. Observe, minha solução deriva do guia da Microsoft .


  1. Crie arquivo / arquivos do Excel cujas fitas você deseja personalizar. No meu caso, criei dois .xlamarquivos Chart Tools.xlame Priveleged UDFs.xlam, para demonstrar como vários suplementos podem interagir com a Faixa de Opções.
  2. Crie uma pasta, com qualquer nome de pasta, para cada arquivo que você acabou de criar.
  3. Dentro de cada uma das pastas que você criou, adicione uma pasta customUIe _rels.
  4. Dentro de cada customUIpasta, crie um customUI.xmlarquivo. O customUI.xmlarquivo detalha como os arquivos do Excel interagem com a faixa de opções. A Parte 2 do guia da Microsoft cobre os elementos do customUI.xmlarquivo.

Meu customUI.xmlarquivo se Chart Tools.xlamparece com este

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:chartToolsTab" label="Chart Tools">
        <group id="relativeChartMovementGroup" label="Relative Chart Movement" >
            <button id="moveChartWithRelativeLinksButton" label="Copy and Move" imageMso="ResultsPaneStartFindAndReplace" onAction="MoveChartWithRelativeLinksCallBack" visible="true" size="normal"/>
            <button id="moveChartToManySheetsWithRelativeLinksButton" label="Copy and Distribute" imageMso="OutlineDemoteToBodyText" onAction="MoveChartToManySheetsWithRelativeLinksCallBack" visible="true" size="normal"/>
        </group >
        <group id="chartDeletionGroup" label="Chart Deletion">
            <button id="deleteAllChartsInWorkbookSharingAnAddressButton" label="Delete Charts" imageMso="CancelRequest" onAction="DeleteAllChartsInWorkbookSharingAnAddressCallBack" visible="true" size="normal"/>
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

Meu customUI.xmlarquivo se Priveleged UDFs.xlamparece com este

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">
  <ribbon>
    <tabs>
      <tab idQ="x:privelgedUDFsTab" label="Privelged UDFs">
        <group id="privelgedUDFsGroup" label="Toggle" >
            <button id="initialisePrivelegedUDFsButton" label="Activate" imageMso="TagMarkComplete" onAction="InitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
            <button id="deInitialisePrivelegedUDFsButton" label="De-Activate" imageMso="CancelRequest" onAction="DeInitialisePrivelegedUDFsCallBack" visible="true" size="normal"/>
        </group >
      </tab>
    </tabs>
  </ribbon>
</customUI>
  1. Para cada arquivo criado na Etapa 1, coloque o sufixo a .zipno nome do arquivo. No meu caso, mudei o nome Chart Tools.xlampara Chart Tools.xlam.zipe Privelged UDFs.xlampara Priveleged UDFs.xlam.zip.
  2. Abra cada .ziparquivo e navegue até a _relspasta. Copie o .relsarquivo para a _relspasta criada na Etapa 3. Edite cada .rels arquivo com um editor de texto. Do guia da Microsoft

Entre o <Relationship>elemento final e o <Relationships>elemento de fechamento , adicione uma linha que crie um relacionamento entre o arquivo de documento e o arquivo de personalização. Certifique-se de especificar os nomes da pasta e do arquivo corretamente.

<Relationship Type="http://schemas.microsoft.com/office/2006/
  relationships/ui/extensibility" Target="/customUI/customUI.xml" 
  Id="customUIRelID" />

Meu .relsarquivo se Chart Tools.xlamparece com este

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="chartToolsCustomUIRel" />
    </Relationships>

Meu .relsarquivo se Priveleged UDFsparece com este.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
        <Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/>
        <Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml"/>
        <Relationship Type="http://schemas.microsoft.com/office/2006/relationships/ui/extensibility" Target="/customUI/customUI.xml" Id="privelegedUDFsCustomUIRel" />
    </Relationships>
  1. Substitua os .relsarquivos em cada .ziparquivo pelo (s) .relsarquivo (s) que você modificou na etapa anterior.
  2. Copie e cole a .customUIpasta que você criou no diretório inicial dos .ziparquivos / arquivos.
  3. Remova a .zipextensão do arquivo dos arquivos do Excel que você criou .
  4. Se você criou .xlamarquivos, de volta ao Excel, adicione-os aos suplementos do Excel.
  5. Se aplicável, crie retornos de chamada em cada um de seus add-ins. Na Etapa 4, existem onActionpalavras-chave em meus botões. A onActionpalavra-chave indica que, quando o elemento que o contém é disparado, o aplicativo Excel irá disparar a sub-rotina entre aspas diretamente após a onActionpalavra - chave. Isso é conhecido como retorno de chamada . Em meus .xlamarquivos, tenho um módulo chamado, CallBacksonde incluí minhas sub-rotinas de retorno de chamada.

Módulo CallBacks

Meu CallBacksmódulo para Chart Tools.xlamparece

Option Explicit

Public Sub MoveChartWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartWithRelativeLinks
End Sub

Public Sub MoveChartToManySheetsWithRelativeLinksCallBack(ByRef control As IRibbonControl)
  MoveChartToManySheetsWithRelativeLinks
End Sub

Public Sub DeleteAllChartsInWorkbookSharingAnAddressCallBack(ByRef control As IRibbonControl)
  DeleteAllChartsInWorkbookSharingAnAddress
End Sub

Meu CallBacksmódulo para Priveleged UDFs.xlamparece

Opção Explícita

Public Sub InitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.InitialisePrivelegedUDFs
End Sub

Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
  ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub

Elementos diferentes têm uma assinatura de sub-rotina de retorno de chamada diferente. Para botões, o parâmetro de sub-rotina necessário é ByRef control As IRibbonControl. Se você não estiver em conformidade com a assinatura de retorno de chamada exigida, receberá um erro ao compilar seu projeto / projetos VBA. A Parte 3 do guia da Microsoft define todas as assinaturas de retorno de chamada.


Aqui está a aparência do meu exemplo acabado

Produto final


Algumas dicas de fechamento

  1. Se você deseja que os suplementos compartilhem elementos da Faixa de Opções, use a palavra idQ- xlmns:chave e . No meu exemplo, o Chart Tools.xlame Priveleged UDFs.xlamambos têm acesso aos elementos com idQ's igual a x:chartToolsTabe x:privelgedUDFsTab. Para que isso funcione, x:é necessário, e, defini seu namespace na primeira linha do meu customUI.xmlarquivo <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">,. A seção Duas maneiras de personalizar a IU do Fluent no guia da Microsoft fornece mais detalhes.
  2. Se você deseja que os suplementos acessem os elementos da Faixa de Opções fornecidos com o Excel, use a isMSOpalavra - chave. A seção Duas maneiras de personalizar a IU do Fluent no guia da Microsoft fornece mais detalhes.
Joshua Daly
fonte
0

Outra abordagem para isso seria baixar o módulo de classe Open XML gratuito de Jan Karel Pieterse nesta página: Editando elementos em um arquivo OpenXML usando VBA

Com isso adicionado ao seu projeto VBA, você pode descompactar o arquivo Excel, usar o VBA para modificar o XML e, em seguida, usar a classe para compactar novamente os arquivos.

John Korchok
fonte