Wie füge ich mit VBA eine benutzerdefinierte Multifunktionsleistenregisterkarte hinzu?

98

Ich suche nach einer Möglichkeit, eine benutzerdefinierte Registerkarte in der Excel-Multifunktionsleiste hinzuzufügen, die einige Schaltflächen enthält. Ich habe zufällig einige Ressourcen gefunden, die sich über Google damit befassen, aber alle sehen zwielichtig und unglaublich kompliziert aus.

Was ist ein schneller und einfacher Weg, um das zu tun? Ich möchte, dass die neue Registerkarte geladen wird, wenn mein VBA in Excel geladen wird.

UPDATE : Ich habe dieses Beispiel von hier aus ausprobiert , erhalte jedoch bei der letzten Anweisung den Fehler "Objekt erforderlich":

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
Summen
quelle
Bitte bestätigen Sie, welche Excel-Version Sie verwenden.
Siddharth Rout
Das ist für Projekt.
Nathan_Sav

Antworten:

146

AFAIK Sie können VBA Excel nicht verwenden, um eine benutzerdefinierte Registerkarte in der Excel-Multifunktionsleiste zu erstellen. Sie können jedoch eine Multifunktionsleisten-Komponente mit VBA ausblenden / sichtbar machen. Darüber hinaus ist der oben erwähnte Link für MS Project und nicht für MS Excel.

Ich erstelle Registerkarten für meine Excel-Anwendungen / Add-Ins mit diesem kostenlosen Dienstprogramm namens Custom UI Editor .


Bearbeiten: Um neue Anforderungen von OP zu berücksichtigen

Lernprogramm

Hier ist ein kurzes Tutorial wie versprochen:

  1. Nachdem Sie den benutzerdefinierten UI-Editor (CUIE) installiert haben, öffnen Sie ihn und klicken Sie auf Datei | Öffnen Sie die entsprechende Excel-Datei und wählen Sie sie aus. Stellen Sie sicher, dass die Excel-Datei geschlossen ist, bevor Sie sie über CUIE öffnen. Ich verwende ein brandneues Arbeitsblatt als Beispiel.

    Geben Sie hier die Bildbeschreibung ein

  2. Klicken Sie mit der rechten Maustaste wie in der Abbildung unten gezeigt und klicken Sie auf "Benutzerdefinierte Office 2007-Benutzeroberfläche". Es wird die "customUI.xml" eingefügt.

    Geben Sie hier die Bildbeschreibung ein

  3. Weiter Klicken Sie auf das Menü Einfügen | Beispiel XML | Benutzerdefinierte Registerkarte. Sie werden feststellen, dass der Basiscode automatisch generiert wird. Jetzt können Sie es gemäß Ihren Anforderungen bearbeiten.

    Geben Sie hier die Bildbeschreibung ein

  4. Lassen Sie uns den Code überprüfen

    Geben Sie hier die Bildbeschreibung ein

    label="Custom Tab": Ersetzen Sie "Benutzerdefinierte Registerkarte" durch den Namen, den Sie Ihrer Registerkarte geben möchten. Nennen wir es vorerst "Hieronymus".

    Der folgende Teil fügt eine benutzerdefinierte Schaltfläche hinzu.

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

    imageMso: Dies ist das Bild, das auf der Schaltfläche angezeigt wird. "HappyFace" sehen Sie im Moment. Sie können hier weitere Bild-IDs herunterladen .

    onAction="Callback": "Rückruf" ist der Name der Prozedur, die ausgeführt wird, wenn Sie auf die Schaltfläche klicken.

Demo

Erstellen wir damit 2 Schaltflächen und nennen sie "JG Button 1" und "JG Button 2". Lassen Sie uns ein glückliches Gesicht als Bild des ersten behalten und die "Sonne" für das zweite behalten. Der geänderte Code sieht nun folgendermaßen aus:

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

Löschen Sie den gesamten Code, der in CUIE generiert wurde, und fügen Sie stattdessen den obigen Code ein. Speichern und schließen Sie CUIE. Wenn Sie nun die Excel-Datei öffnen, sieht sie folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Nun der Codeteil. Öffnen Sie den VBA-Editor, fügen Sie ein Modul ein und fügen Sie diesen Code ein:

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

Speichern Sie die Excel-Datei als makrofähige Datei. Wenn Sie nun auf den Smiley oder die Sonne klicken, wird das entsprechende Meldungsfeld angezeigt:

Geben Sie hier die Bildbeschreibung ein

Hoffe das hilft!

Siddharth Rout
quelle
6
Ja :) Ron hat viele Beispiele auf seiner Website. rondebruin.nl/ribbon.htm
Siddharth Rout
1
Möchten Sie einen neuen Tab erstellen? Wenn ja, dann geben Sie weitere Details an und ich werde Ihnen den XML-Code geben :)
Siddharth Rout
1
Gib mir 20 Minuten. Aktualisierung des obigen Beitrags mit relevantem Code und Schnappschüssen :)
Siddharth Rout
6
@SiddharthRout +1 - Ich finde heraus, dass ich keine Excel-Bücher benötige. Folgen Sie einfach Ihren Posts, um zu erfahren, was ich an einem Tag lernen muss (und heute Abend ist es das Ribbon XML!) :)
Unser Mann in Bananen
1
Ich würde empfehlen, eine neue Frage mit Ihrem grundlegenden XML-Code und dem VBA-Code zu erstellen, und dann können wir sie dort annehmen? @ YasserKhalil
Siddharth Rout
30

Dies konnte ich mit VBA in Excel 2013 erreichen. Es sind keine speziellen Editoren erforderlich. Sie benötigen lediglich den Visual Basic-Code-Editor, auf den Sie auf der Registerkarte Entwickler zugreifen können. Die Registerkarte Entwickler ist standardmäßig nicht sichtbar und muss daher unter Datei> Optionen> Multifunktionsleiste anpassen aktiviert werden. Klicken Sie auf der Registerkarte Entwickler auf die Schaltfläche Visual Basic. Der Code-Editor wird gestartet. Klicken Sie mit der rechten Maustaste in den Projekt-Explorer auf der linken Seite. Klicken Sie auf das Einfügemenü und wählen Sie das Modul. Fügen Sie dem neuen Modul beide unten stehenden Subs hinzu.

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

Rufen Sie das LoadCustRibbon-Sub im Wookbook auf, und öffnen Sie das ClearCustRibbon-Sub im Before_Close-Ereignis der ThisWorkbook-Codedatei.

Roi-Kyi Bryant
quelle
Dies funktionierte für mich, aber mit nur ein paar kleinen Problemen, auf die ich gestoßen bin. 1) Wenn ich das Before_Close-Ereignis beibehalten habe, wurde das neue Menüband nicht geladen. 2) Als es mir gelang, das Menüband durch Entfernen des Before_Close-Ereignisses zum Laufen zu bringen, musste ich Excel neu laden, bevor es angezeigt wurde. Wenn Sie raten könnten, warum dies geschieht, wäre das großartig!
Petay87
Ist der Code genau der gleiche? Kannst du es posten? Die Idee ist, dass Excel die Standard-Multifunktionsleisten-Datei ändern sollte, bevor die Multifunktionsleiste geladen wird, und sie zurücksetzen sollte, bevor die Arbeitsmappe geschlossen wird. Das Zurücksetzen des Menübands ist erforderlich, damit es nicht in anderen Arbeitsmappen angezeigt wird.
Roi-Kyi Bryant
3
Dieser Code überschreibt alle aktuellen Bandanpassungen, die der Benutzer möglicherweise bereits vorgenommen hat.
WizzleWuzzle
@WizzleWuzzle Das muss nicht sein. Das Menüband konnte importiert und in ein Objekt analysiert werden, das durchlaufen werden konnte. Dem Objekt können dann neue Elemente hinzugefügt werden. Das Ergebnis könnte in einer Datei gespeichert werden. Die Frage war, wie ein benutzerdefiniertes Menüband erstellt werden kann. nicht, wie man ein vorhandenes ändert.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant Die Frage war, ein benutzerdefiniertes Menübandelement hinzuzufügen und nicht das gesamte aktuelle benutzerdefinierte Farbband zu überschreiben. Dieser Code überschreibt das aktuelle Menüband.
WizzleWuzzle
24

Ich kämpfte wie verrückt, aber das ist eigentlich die richtige Antwort. Was es wert ist, was ich vermisst habe, war Folgendes:

  1. Wie andere sagen, kann man das customUI Band mit VBA nicht erstellen, jedoch brauchen Sie nicht zu!
  2. Die Idee ist, dass Sie Ihren XML-Multifunktionsleistencode mit Excel-Datei> Optionen> Multifunktionsleiste anpassen erstellen und dann die Multifunktionsleiste in eine .customUI-Datei exportieren (es ist nur eine txt-Datei mit XML).
  3. Jetzt kommt der Trick : Sie können umfassen die .customUI Code in Ihre XLSM Datei mit dem MS - Tool sie hier finden, durch Kopieren Sie den Code aus dem .customUI Datei
  4. Sobald es in der XLSM-Datei enthalten ist, ist jedes Mal, wenn Sie es öffnen, das von Ihnen definierte Menüband des Benutzers hinzugefügt. Verwenden Sie jedoch <ribbon startFromScratch = "false">, oder Sie verlieren den Rest des Menübands. Beim Beenden der Arbeitsmappe wird das Menüband entfernt.
  5. Von hier an ist es ganz einfach: Erstellen Sie Ihr Menüband, kopieren Sie den für Ihr Menüband spezifischen XML-Code aus der .customUI-Datei und platzieren Sie ihn wie oben gezeigt in einem Wrapper (... <tabets> Ihre XML </ tabs ..). .)

Übrigens ist die Seite, die es auf Rons Website erklärt, jetzt bei http://www.rondebruin.nl/win/s2/win002.htm

Und hier ist sein Beispiel, wie Sie Schaltflächen auf der Multifunktionsleiste aktivieren / deaktivieren http://www.rondebruin.nl/win/s2/win013.htm

Weitere XML-Beispiele für Bänder finden Sie auch unter http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

Jan Wijninckx
quelle
2
Immer noch (5 Jahre später) die beste Antwort meiner Meinung nach und vielleicht möchte OP @BuZz den ursprünglichen Beitrag aktualisieren und zumindest auf diese Antwort verweisen (?). Ich fand es kaum, da es am Ende einer ziemlich langen Liste von Antworten lag.
Chri.s
18

Die Antworten hier beziehen sich speziell auf die Verwendung des benutzerdefinierten UI-Editors. Ich habe einige Zeit damit verbracht, die Benutzeroberfläche ohne dieses wunderbare Programm zu erstellen. Deshalb dokumentiere ich hier die Lösung, um anderen zu helfen, zu entscheiden, ob sie diesen benutzerdefinierten UI-Editor benötigen oder nicht.

Ich bin auf die folgende Microsoft-Hilfe-Webseite gestoßen: https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Dies zeigt, wie die Schnittstelle manuell eingerichtet wird, aber ich hatte einige Probleme, als ich auf meinen benutzerdefinierten Add-In-Code zeigte.

Damit die Schaltflächen mit Ihren benutzerdefinierten Makros funktionieren, richten Sie das Makro in Ihren .xlam-Subs so ein, dass es wie in dieser SO-Antwort beschrieben aufgerufen wird - Aufrufen eines Excel-Makros über die Multifunktionsleiste . Grundsätzlich müssen Sie diesen Parameter "control As IRibbonControl" zu jedem Modul hinzufügen, auf das in Ihrer Multifunktionsleisten-XML verwiesen wird. Außerdem sollte Ihre Multifunktionsleisten-XML die Syntax onAction = "myaddin! Mymodule.mysub" haben, um alle vom Add-In geladenen Module ordnungsgemäß aufzurufen.

Mit diesen Anweisungen konnte ich ein Excel-Add-In (.xlam-Datei) erstellen, auf dem eine benutzerdefinierte Registerkarte geladen ist, wenn mein VBA zusammen mit dem Add-In in Excel geladen wird. Die Schaltflächen führen Code aus dem Add-In aus und die benutzerdefinierte Registerkarte wird deinstalliert, wenn Ich entferne das Add-In.

Jomtung
quelle
1
Dies funktioniert für diejenigen von uns, die nicht über alle Entwicklungswerkzeuge verfügen. Vielen Dank für die "einfache" Lösung
Evan
2
Ich habe meinen Programmierschülern im zweiten Jahr diese Methode beigebracht, aber schließlich festgestellt, dass die Verwendung des CustomUI-Tools einfach weniger kompliziert ist, wenn Sie darauf zugreifen können.
Rick Henderson
8

Zusätzlich zur Antwort von Roi-Kyi Bryant funktioniert dieser Code vollständig in Excel 2010. Drücken Sie ALT + F11, und der VBA-Editor wird angezeigt. Doppelklicken Sie auf ThisWorkbookder linken Seite und fügen Sie diesen Code ein:

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

Vergessen Sie nicht, die Arbeitsmappe zu speichern und erneut zu öffnen. Hoffe das hilft!

Erikas
quelle
Wie würden Sie damit argumentieren? Ich habe dies verwendet, kann aber keinen Weg finden, Argumente zu übergeben.
jDave1984
Mit meiner Antwort würden Sie jeder Unterroutine eine Argumentliste hinzufügen. So etwas wie LoadCustomRibbon (tabName als String, groupName als String, btnName als String). Rufen Sie dann diese Unterprogramme an der entsprechenden Stelle auf, wie @Erikas hervorhob.
Roi-Kyi Bryant
6

Ich hatte Probleme mit der Lösung von Roi-Kyi Bryant, als mehrere Add-Ins versuchten, das Menüband zu ändern. Ich habe auch keinen Administratorzugriff auf meinem Arbeitscomputer, was die Installation von ausgeschlossen hat Custom UI Editor. Wenn Sie sich also im selben Boot wie ich befinden, finden Sie hier ein alternatives Beispiel zum Anpassen des Menübands nur mit Excel. Beachten Sie, dass meine Lösung aus dem Microsoft-Handbuch abgeleitet ist .


  1. Erstellen Sie Excel-Dateien, deren Bänder Sie anpassen möchten. In meinem Fall habe ich zwei .xlamDateien erstellt Chart Tools.xlamund Priveleged UDFs.xlam, um zu demonstrieren, wie mehrere Add-Ins mit der Multifunktionsleiste interagieren können.
  2. Erstellen Sie für jede gerade erstellte Datei einen Ordner mit einem beliebigen Ordnernamen .
  3. Fügen Sie in jedem der von Ihnen erstellten Ordner einen customUIund einen _relsOrdner hinzu.
  4. customUIErstellen Sie in jedem Ordner eine customUI.xmlDatei. Die customUI.xmlDatei beschreibt, wie Excel-Dateien mit dem Menüband interagieren. Teil 2 des Microsoft-Handbuchs behandelt die Elemente in der customUI.xmlDatei.

Meine customUI.xmlDatei für Chart Tools.xlamsieht so aus

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

Meine customUI.xmlDatei für Priveleged UDFs.xlamsieht so aus

<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. Fügen Sie für jede Datei, die Sie in Schritt 1 erstellt haben, ein Suffix a .zipan den Dateinamen an. In meinem Fall, ich umbenannt Chart Tools.xlamzu Chart Tools.xlam.zip, und Privelged UDFs.xlamzu Priveleged UDFs.xlam.zip.
  2. Öffnen Sie jede .zipDatei und navigieren Sie zum _relsOrdner. Kopieren Sie die .relsDatei in den _relsOrdner, den Sie in Schritt 3 erstellt haben. Bearbeiten Sie jede .rels Datei mit einem Texteditor. Aus dem Microsoft-Handbuch

Fügen Sie zwischen dem letzten <Relationship>Element und dem schließenden <Relationships>Element eine Zeile hinzu, die eine Beziehung zwischen der Dokumentdatei und der Anpassungsdatei herstellt. Stellen Sie sicher, dass Sie die Ordner- und Dateinamen korrekt angeben.

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

Meine .relsDatei für Chart Tools.xlamsieht so aus

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

Meine .relsDatei für Priveleged UDFssieht so aus.

<?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. Ersetzen Sie die .relsDateien in jeder .zipDatei durch die .relsDatei / Dateien, die Sie im vorherigen Schritt geändert haben.
  2. Kopieren .customUISie den von Ihnen erstellten Ordner und fügen Sie ihn in das Ausgangsverzeichnis der .zipDatei / Dateien ein.
  3. Entfernen Sie die .zipDateierweiterung aus den von Ihnen erstellten Excel-Dateien .
  4. Wenn Sie .xlamDateien erstellt haben , fügen Sie sie wieder in Excel zu Ihren Excel-Add-Ins hinzu.
  5. Erstellen Sie gegebenenfalls Rückrufe in jedem Ihrer Add-Ins. In Schritt 4 befinden sich onActionSchlüsselwörter in meinen Schaltflächen. Das onActionSchlüsselwort gibt an, dass die Excel-Anwendung beim Auslösen des enthaltenen Elements die in Anführungszeichen eingeschlossene Unterroutine direkt nach dem onActionSchlüsselwort auslöst . Dies wird als Rückruf bezeichnet . In meinen .xlamDateien habe ich ein Modul namens, CallBacksin das ich meine Rückruf-Subroutinen aufgenommen habe.

CallBacks-Modul

Mein CallBacksModul für Chart Tools.xlamsieht aus wie

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

Mein CallBacksModul fürPriveleged UDFs.xlamsieht aus wie

Option Explizit

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

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

Verschiedene Elemente haben eine unterschiedliche Signatur der Rückruf-Subroutine. Für Schaltflächen ist der erforderliche Subroutinenparameter ByRef control As IRibbonControl. Wenn Sie nicht der erforderlichen Rückrufsignatur entsprechen, wird beim Kompilieren Ihres VBA-Projekts / Ihrer VBA-Projekte eine Fehlermeldung angezeigt. Teil 3 des Microsoft-Handbuchs definiert alle Rückrufsignaturen.


So sieht mein fertiges Beispiel aus

Fertiges Produkt


Einige abschließende Tipps

  1. Wenn Sie möchten, dass Add-Ins Multifunktionsleistenelemente gemeinsam nutzen, verwenden Sie das Schlüsselwort idQund xlmns:. In meinem Beispiel haben die Chart Tools.xlamund Priveleged UDFs.xlambeide Zugriff auf die Elemente mit idQ's gleich x:chartToolsTabund x:privelgedUDFsTab. Damit dies funktioniert, x:ist das erforderlich, und ich habe seinen Namespace in der ersten Zeile meiner customUI.xmlDatei definiert <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">. Der Abschnitt Zwei Möglichkeiten zum Anpassen der fließenden Benutzeroberfläche im Microsoft-HandbuchWeitere Informationen finden Sie .
  2. Verwenden Sie das isMSOSchlüsselwort, wenn Add-Ins auf mit Excel gelieferte Multifunktionsleistenelemente zugreifen sollen . Weitere Informationen finden Sie im Abschnitt Zwei Möglichkeiten zum Anpassen der fließenden Benutzeroberfläche im Microsoft-Handbuch .
Joshua Daly
quelle
0

Ein anderer Ansatz wäre das Herunterladen des kostenlosen Open XML-Klassenmoduls von Jan Karel Pieterse von dieser Seite: Bearbeiten von Elementen in einer OpenXML-Datei mit VBA

Mit diesem Zusatz zu Ihrem VBA-Projekt können Sie die Excel-Datei entpacken, das XML mit VBA ändern und dann die Klasse mit der Klasse erneut entpacken.

John Korchok
quelle