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 .
- 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.
- Cree una carpeta, con cualquier nombre de carpeta, para cada archivo que acaba de crear.
- Dentro de cada una de las carpetas que ha creado, agregue una carpeta
customUIy _rels.
- 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>
- 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.
- 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>
- Reemplace los
.relsarchivos en cada .ziparchivo con el .relsarchivo / archivos que modificó en el paso anterior.
- Copie y pegue la
.customUIcarpeta que creó en el directorio de inicio del .ziparchivo / archivos.
- Elimine la
.zipextensión de archivo de los archivos de Excel que creó .
- Si ha creado
.xlamarchivos, vuelva a Excel y agréguelos a sus complementos de Excel.
- 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.

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

Algunos consejos de cierre
- 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.
- 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.