¿Cómo agregar una pestaña de cinta personalizada usando VBA?

98

Estoy buscando una forma de agregar una pestaña personalizada en la cinta de Excel que llevaría algunos botones. Me encontré con algunos recursos que lo abordan a través de Google, pero todos parecen dudosos y escandalosamente complicados.

¿Cuál es una forma rápida y sencilla de hacerlo? Me gustaría que la nueva pestaña se cargue cuando mi VBA se cargue en Excel.

ACTUALIZACIÓN : Probé este ejemplo desde aquí pero obtengo un error de "objeto requerido" en la última instrucción:

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
fuente
Confirme qué versión de Excel está utilizando.
Siddharth Rout
Eso es para Project.
Nathan_Sav

Respuestas:

146

AFAIK, no puede usar VBA Excel para crear una pestaña personalizada en la cinta de Excel. Sin embargo, puede ocultar / hacer visible un componente de cinta usando VBA. Además, el enlace que mencionó anteriormente es para MS Project y no para MS Excel.

Creo pestañas para mis aplicaciones / complementos de Excel usando esta utilidad gratuita llamada Custom UI Editor .


Editar: para dar cabida a una nueva solicitud de OP

Tutorial

Aquí hay un breve tutorial como se prometió:

  1. Después de haber instalado el editor de IU personalizado (CUIE), ábralo y luego haga clic en Archivo | Abra y seleccione el archivo de Excel correspondiente. Asegúrese de que el archivo de Excel esté cerrado antes de abrirlo a través de CUIE. Estoy usando una hoja de trabajo nueva como ejemplo.

    ingrese la descripción de la imagen aquí

  2. Haga clic derecho como se muestra en la imagen siguiente y haga clic en "Parte de la interfaz de usuario personalizada de Office 2007". Insertará el "customUI.xml"

    ingrese la descripción de la imagen aquí

  3. Siguiente Haga clic en el menú Insertar | XML de muestra | Pestaña personalizada. Notarás que el código básico se genera automáticamente. Ahora ya está todo listo para editarlo según sus requisitos.

    ingrese la descripción de la imagen aquí

  4. Inspeccionemos el código

    ingrese la descripción de la imagen aquí

    label="Custom Tab": Reemplace "Pestaña personalizada" con el nombre que desea darle a su pestaña. Por el momento llamémoslo "Jerome".

    La parte de abajo agrega un botón personalizado.

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

    imageMso: Esta es la imagen que se mostrará en el botón. "HappyFace" es lo que verá en este momento. Puede descargar más ID de imagen aquí .

    onAction="Callback": "Devolución de llamada" es el nombre del procedimiento que se ejecuta cuando hace clic en el botón.

Manifestación

Con eso, creemos 2 botones y llamémoslos "Botón JG 1" y "Botón JG 2". Mantengamos la cara feliz como la imagen del primero y mantengamos el "Sol" para el segundo. El código modificado ahora se ve así:

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

Elimine todo el código que se generó en CUIE y luego pegue el código anterior en lugar de eso. Guarde y cierre CUIE. Ahora, cuando abra el archivo de Excel, se verá así:

ingrese la descripción de la imagen aquí

Ahora la parte del código. Abra VBA Editor, inserte un módulo y pegue 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

Guarde el archivo de Excel como un archivo habilitado para macros. Ahora, cuando haga clic en Smiley o Sun, verá el cuadro de mensaje correspondiente:

ingrese la descripción de la imagen aquí

¡Espero que esto ayude!

Huida de Siddharth
fuente
6
Sí :) Ron tiene muchos ejemplos en su sitio web. rondebruin.nl/ribbon.htm
Siddharth Rout
1
¿Quieres crear una nueva pestaña? Si es así, proporcione más detalles y le daré el código XML :)
Siddharth Rout
1
Dame 20 minutos. Actualizando la publicación anterior con el código relevante y las instantáneas :)
Siddharth Rout
6
@SiddharthRout +1 - Me estoy dando cuenta de que no necesito ningún libro de Excel, solo siga sus publicaciones para saber lo que necesito aprender en un día de trabajo (y esta noche, ¡es el Ribbon XML!) :)
Our Man in Bananas
1
Recomendaría crear una nueva pregunta con su código xml básico y el código VBA y luego lo podemos tomar allí. @YasserKhalil
Siddharth Rout
30

Pude lograr esto con VBA en Excel 2013. No se necesitan editores especiales. Todo lo que necesita es el editor de código de Visual Basic al que se puede acceder en la pestaña Desarrollador. La pestaña Desarrollador no está visible de forma predeterminada, por lo que debe habilitarse en Archivo> Opciones> Personalizar cinta. En la pestaña Desarrollador, haga clic en el botón Visual Basic. Se iniciará el editor de código. Haga clic con el botón derecho en el panel Explorador de proyectos a la izquierda. Haga clic en el menú Insertar y elija módulo. Agregue ambos subs a continuación al nuevo 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

Llame al sub de LoadCustRibbon en el Wookbook abierto incluso y llame al sub de ClearCustRibbon en el evento Before_Close del archivo de código de ThisWorkbook.

Roi-Kyi Bryant
fuente
Esto funcionó para mí, pero con solo un par de problemas menores con los que me encontré. 1) Si mantuve el evento Before_Close adentro, la nueva cinta no se cargó. 2) Cuando logré que la cinta funcionara eliminando el evento Before_Close, tuve que volver a cargar Excel antes de que apareciera. Si pudiera aconsejarme por qué sucede esto, ¡sería genial!
Petay87
¿El código es exactamente el mismo? ¿Puedes publicarlo? La idea es que Excel debería modificar el archivo de cinta estándar antes de que se cargue la cinta y restablecerlo antes de que se cierre el libro. Es necesario restablecer la cinta para que no se muestre en otros libros de trabajo.
Roi-Kyi Bryant
3
Este código sobrescribe todas las personalizaciones de cinta actuales que el usuario ya haya realizado.
WizzleWuzzle
@WizzleWuzzle No es necesario. La cinta se puede importar y analizar en un objeto que se puede atravesar. Luego, se podrían agregar nuevos elementos al objeto. El resultado se puede guardar en un archivo. La pregunta era cómo crear una cinta personalizada; no cómo modificar uno existente.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant La pregunta era agregar un elemento de cinta personalizado, no sobrescribir toda la cinta personalizada actual. Este código sobrescribe la cinta actual.
WizzleWuzzle
24

Luché como un loco, pero esta es en realidad la respuesta correcta. Por lo que vale, lo que me perdí fue esto:

  1. Como dicen otros, no se puede crear la cinta CustomUI con VBA, sin embargo , ¡no es necesario!
  2. La idea es que cree su código de cinta xml usando Archivo> Opciones> Personalizar cinta de Excel, y luego exporte la cinta a un archivo .customUI (es solo un archivo txt, con xml en él)
  3. Ahora viene el truco : puede incluir el código .customUI en su archivo .xlsm utilizando la herramienta de MS a la que se refieren aquí, copiando el código del archivo .customUI
  4. Una vez que se incluye en el archivo .xlsm, cada vez que lo abre, la cinta que definió se agrega a la cinta del usuario, pero use <ribbon startFromScratch = "false"> o perderá el resto de la cinta. Al salir del libro de trabajo, se quita la cinta.
  5. A partir de aquí es simple, cree su cinta, copie el código xml que es específico de su cinta desde el archivo .customUI y colóquelo en un contenedor como se muestra arriba (... <tabs> su xml </ tabs .. .)

Por cierto, la página que lo explica en el sitio de Ron ahora está en http://www.rondebruin.nl/win/s2/win002.htm

Y aquí está su ejemplo sobre cómo habilitar / deshabilitar botones en la cinta http://www.rondebruin.nl/win/s2/win013.htm

Para ver otros ejemplos xml de cintas, consulte también http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

Jan Wijninckx
fuente
2
Aún así (5 años después) la mejor respuesta en mi opinión y tal vez a OP @BuZz le gustaría actualizar la publicación original, al menos apuntando a esta respuesta (?). Apenas lo encontré, ya que estaba al final de una lista bastante larga de respuestas.
Chri.s
18

Las respuestas aquí son específicas para usar el editor de IU personalizado. Pasé un tiempo creando la interfaz sin ese maravilloso programa, así que estoy documentando la solución aquí para ayudar a cualquier otra persona a decidir si necesita ese editor de interfaz de usuario personalizado o no.

Encontré la siguiente página web de ayuda de Microsoft: https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Esto muestra cómo configurar la interfaz manualmente, pero tuve algunos problemas al señalar mi código de complemento personalizado.

Para que los botones funcionen con sus macros personalizadas, configure la macro en sus subs .xlam para que se llame como se describe en esta respuesta SO - Llamar a una macro de Excel desde la cinta . Básicamente, necesitará agregar ese parámetro "control As IRibbonControl" a cualquier módulo apuntado desde su cinta xml. Además, su cinta xml debe tener la sintaxis onAction = "myaddin! Mymodule.mysub" para llamar correctamente a cualquier módulo cargado por el complemento.

Usando esas instrucciones, pude crear un complemento de Excel (archivo .xlam) que tiene una pestaña personalizada cargada cuando mi VBA se carga en Excel junto con el complemento. Los botones ejecutan el código del complemento y la pestaña personalizada se desinstala cuando Elimino el complemento.

Jomtung
fuente
1
Esto funciona para aquellos de nosotros que no tenemos todas las herramientas de desarrollo. Gracias por la solución "simple"
Evan
2
Solía ​​enseñar este método a mis estudiantes de programación de segundo año, pero finalmente descubrí que usar la herramienta CustomUI es simplemente menos complicado si puedes acceder a ella.
Rick Henderson
8

Además de la respuesta de Roi-Kyi Bryant, este código funciona completamente en Excel 2010. Presione ALT + F11 y aparecerá el editor de VBA. Haga doble clic en ThisWorkbooken el lado izquierdo, luego pegue 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

No olvide guardar y volver a abrir el libro de trabajo. ¡Espero que esto ayude!

Erikas
fuente
¿Cómo pasarías argumentos con esto? He estado usando esto, pero no puedo encontrar una manera de pasar argumentos.
jDave1984
Usando mi respuesta, agregaría una lista de argumentos a cada subrutina Algo como LoadCustomRibbon (tabName como String, groupName como String, btnName como String). Luego llame a esas subrutinas en el lugar apropiado como señaló @Erikas.
Roi-Kyi Bryant
6

Encontré dificultades con la solución de Roi-Kyi Bryant cuando varios complementos intentaron modificar la cinta. Tampoco tengo acceso de administrador en mi computadora de trabajo, lo que descartó instalar el Custom UI Editor. Entonces, si está en el mismo barco que yo, aquí hay un ejemplo alternativo para personalizar la cinta usando solo Excel. Tenga en cuenta que mi solución se deriva de la guía de Microsoft .


  1. Cree archivos de Excel cuyas cintas desee personalizar. En mi caso, he creado dos .xlamarchivos Chart Tools.xlamy Priveleged UDFs.xlam, para demostrar cómo varios complementos pueden interactuar con la cinta.
  2. Cree una carpeta, con cualquier nombre de carpeta, para cada archivo que acaba de crear.
  3. Dentro de cada una de las carpetas que ha creado, agregue una carpeta customUIy _rels.
  4. Dentro de cada customUIcarpeta, cree un customUI.xmlarchivo. El customUI.xmlarchivo detalla cómo interactúan los archivos de Excel con la cinta. La parte 2 de la guía de Microsoft cubre los elementos del customUI.xmlarchivo.

Mi customUI.xmlarchivo se Chart Tools.xlamparece a esto

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

Mi customUI.xmlarchivo se Priveleged UDFs.xlamparece a esto

<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 archivo que creó en el Paso 1, agregue el sufijo a .zipa su nombre de archivo. En mi caso, cambié el nombre Chart Tools.xlama Chart Tools.xlam.zipy Privelged UDFs.xlama Priveleged UDFs.xlam.zip.
  2. Abra cada .ziparchivo y navegue hasta la _relscarpeta. Copie el .relsarchivo a la _relscarpeta que creó en el Paso 3. Edite cada .rels archivo con un editor de texto. De la guía de Microsoft

Entre el <Relationship>elemento final y el <Relationships>elemento de cierre , agregue una línea que cree una relación entre el archivo del documento y el archivo de personalización. Asegúrese de especificar correctamente los nombres de carpeta y archivo.

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

Mi .relsarchivo se Chart Tools.xlamparece a esto

<?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>

Mi .relsarchivo de Priveleged UDFstiene este aspecto.

<?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. Reemplace los .relsarchivos en cada .ziparchivo con el .relsarchivo / archivos que modificó en el paso anterior.
  2. Copie y pegue la .customUIcarpeta que creó en el directorio de inicio del .ziparchivo / archivos.
  3. Elimine la .zipextensión de archivo de los archivos de Excel que creó .
  4. Si ha creado .xlamarchivos, vuelva a Excel y agréguelos a sus complementos de Excel.
  5. Si corresponde, cree devoluciones de llamada en cada uno de sus complementos. En el paso 4, hay onActionpalabras clave en mis botones. La onActionpalabra clave indica que, cuando se activa el elemento contenedor, la aplicación de Excel activará la subrutina entre comillas directamente después de la onActionpalabra clave. Esto se conoce como devolución de llamada . En mis .xlamarchivos, tengo un módulo llamado CallBacksdonde he incluido mis subrutinas de devolución de llamada.

Módulo CallBacks

Mi CallBacksmódulo se Chart Tools.xlamparece a

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

Mi CallBacksmódulo se Priveleged UDFs.xlamparece a

Opción explícita

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

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

Los diferentes elementos tienen una firma de subrutina de devolución de llamada diferente. Para los botones, el parámetro de subrutina requerido es ByRef control As IRibbonControl. Si no cumple con la firma de devolución de llamada requerida, recibirá un error al compilar su proyecto / proyectos de VBA. La parte 3 de la guía de Microsoft define todas las firmas de devolución de llamada.


Así es como se ve mi ejemplo terminado

Producto terminado


Algunos consejos de cierre

  1. Si desea que los complementos compartan elementos de la cinta, use la palabra clave idQy xlmns:. En mi ejemplo, Chart Tools.xlamy Priveleged UDFs.xlamambos tienen acceso a los elementos con idQ's igual a x:chartToolsTaby x:privelgedUDFsTab. Para que esto funcione, el x:que se requiere, y, he definido su espacio de nombres en la primera línea de mi customUI.xmlarchivo, <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">. La sección Dos formas de personalizar la interfaz de usuario fluida en la guía de Microsoft ofrece más detalles.
  2. Si desea que los complementos accedan a los elementos de la cinta enviados con Excel, use la isMSOpalabra clave. La sección Dos formas de personalizar la interfaz de usuario fluida en la guía de Microsoft ofrece más detalles.
Joshua Daly
fuente
0

Otro enfoque para esto sería descargar el módulo de clase Open XML gratuito de Jan Karel Pieterse desde esta página: Editar elementos en un archivo OpenXML usando VBA

Con esto agregado a su proyecto VBA, puede descomprimir el archivo de Excel, usar VBA para modificar el XML y luego usar la clase para volver a comprimir los archivos.

John Korchok
fuente