Jak dodać niestandardową kartę wstążki za pomocą VBA?

98

Szukam sposobu na dodanie niestandardowej karty na wstążce programu Excel, która zawierałaby kilka przycisków. Zdarzyło mi się, że niektóre zasoby zajmują się tym za pośrednictwem Google, ale wszystkie wyglądają podejrzanie i oburzająco skomplikowane.

Jaki jest szybki i prosty sposób, aby to zrobić? Chciałbym, aby nowa karta została załadowana, gdy mój VBA zostanie załadowany do programu Excel.

AKTUALIZACJA : Próbowałem tego przykładu stąd, ale w ostatniej instrukcji otrzymałem błąd „wymagany obiekt”:

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
Brzęczeć
źródło
Potwierdź, której wersji programu Excel używasz?
Siddharth Rout
To jest dla Project.
Nathan_Sav

Odpowiedzi:

146

AFAIK nie można używać VBA Excel do tworzenia niestandardowej karty na wstążce programu Excel. Możesz jednak ukryć / uczynić widocznym komponent wstążki za pomocą VBA. Ponadto łącze, o którym wspomniałeś powyżej, dotyczy programu MS Project, a nie programu MS Excel.

Tworzę zakładki dla moich aplikacji / dodatków programu Excel za pomocą tego bezpłatnego narzędzia o nazwie Custom UI Editor .


Edycja: aby uwzględnić nową prośbę OP

Instruktaż

Oto krótki samouczek zgodnie z obietnicą:

  1. Po zainstalowaniu niestandardowego edytora interfejsu użytkownika (CUIE) otwórz go, a następnie kliknij Plik | Otwórz i wybierz odpowiedni plik Excel. Upewnij się, że plik Excel jest zamknięty, zanim otworzysz go przez CUIE. Jako przykładu używam zupełnie nowego arkusza.

    wprowadź opis obrazu tutaj

  2. Kliknij prawym przyciskiem myszy, jak pokazano na poniższym obrazku, i kliknij „Część niestandardowego interfejsu użytkownika pakietu Office 2007”. Wstawi on „customUI.xml”

    wprowadź opis obrazu tutaj

  3. Dalej Kliknij menu Wstaw | Przykładowy XML | Karta niestandardowa. Zauważysz, że podstawowy kod jest generowany automatycznie. Teraz możesz edytować go zgodnie ze swoimi wymaganiami.

    wprowadź opis obrazu tutaj

  4. Sprawdźmy kod

    wprowadź opis obrazu tutaj

    label="Custom Tab": Zastąp „Karta niestandardowa” nazwą, którą chcesz nadać swojej karcie. Na razie nazwijmy to „Jerome”.

    Poniższa część dodaje niestandardowy przycisk.

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

    imageMso: To jest obraz, który będzie wyświetlany na przycisku. W tej chwili zobaczysz „HappyFace”. Możesz pobrać więcej identyfikatorów obrazu tutaj .

    onAction="Callback": „Callback” to nazwa procedury uruchamianej po kliknięciu przycisku.

Próbny

W tym celu utwórzmy 2 przyciski i nazwijmy je „JG Button 1” i „JG Button 2”. Zachowajmy radosną buźkę jako obraz pierwszego, a na drugie „Słońce”. Zmieniony kod wygląda teraz następująco:

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

Usuń cały kod, który został wygenerowany w CUIE, a następnie wklej zamiast niego powyższy kod. Zapisz i zamknij CUIE. Teraz po otwarciu pliku Excel będzie wyglądał tak:

wprowadź opis obrazu tutaj

Teraz część kodu. Otwórz edytor VBA, wstaw moduł i wklej ten kod:

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

Zapisz plik Excela jako plik z obsługą makr. Teraz po kliknięciu buźki lub słońca zobaczysz odpowiednie okno komunikatu:

wprowadź opis obrazu tutaj

Mam nadzieję że to pomoże!

Siddharth Rout
źródło
6
Tak :) Ron ma wiele przykładów na swojej stronie internetowej. rondebruin.nl/ribbon.htm
Siddharth Rout
1
Czy chcesz utworzyć nową kartę? Jeśli tak, podaj więcej szczegółów, a ja dam ci kod XML :)
Siddharth Rout
1
Daj mi 20 minut. Aktualizacja powyższego postu o odpowiedni kod i migawki :)
Siddharth Rout
6
@SiddharthRout +1 - dowiaduję się, że nie potrzebuję żadnych książek Excela, po prostu śledź swoje posty, aby dowiedzieć się, czego muszę się nauczyć w ciągu dnia pracy (a dziś wieczorem jest to wstążka XML!) :)
Nasz człowiek w Banany
1
Poleciłbym stworzyć nowy quesiton z podstawowym kodem xml i kodem VBA i wtedy możemy go tam przybrać? @YasserKhalil
Siddharth Rout
30

Udało mi się to osiągnąć za pomocą VBA w programie Excel 2013. Żadne specjalne edytory nie są potrzebne. Wszystko, czego potrzebujesz, to edytor kodu Visual Basic, do którego można uzyskać dostęp na karcie Deweloper. Karta Deweloper nie jest domyślnie widoczna, dlatego należy ją włączyć w menu Plik> Opcje> Dostosuj Wstążkę. Na karcie Deweloper kliknij przycisk Visual Basic. Uruchomi się edytor kodu. Kliknij prawym przyciskiem myszy w panelu Eksplorator projektów po lewej stronie. Kliknij menu wstawiania i wybierz moduł. Dodaj obie subskrypcje poniżej do nowego modułu.

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

Wywołaj subwoofer LoadCustRibbon w otwartej książce Wookbook i wywołaj subwoofer ClearCustRibbon w zdarzeniu Before_Close w pliku kodu ThisWorkbook.

Roi-Kyi Bryant
źródło
To zadziałało dla mnie, ale z kilkoma drobnymi problemami, na które wpadłem. 1) Jeśli zachowałem zdarzenie Before_Close w, nowa wstążka nie została załadowana. 2) Kiedy udało mi się uruchomić wstążkę, usuwając zdarzenie Before_Close, musiałem ponownie załadować program Excel, zanim się pojawił. Gdybyś mógł doradzić, dlaczego tak się dzieje, byłoby wspaniale!
Petay87
Czy kod jest dokładnie taki sam? Czy możesz to opublikować? Pomysł polega na tym, że program Excel powinien zmodyfikować standardowy plik wstążki przed załadowaniem wstążki i zresetować go przed zamknięciem skoroszytu. Zresetowanie wstążki jest konieczne, aby nie była wyświetlana w innych skoroszytach.
Roi-Kyi Bryant
3
Ten kod zastępuje wszystkie bieżące dostosowania wstążki, które użytkownik mógł już wprowadzić.
WizzleWuzzle
@WizzleWuzzle To nie musi. Wstążkę można zaimportować i przetworzyć na obiekt, po którym można by przemierzać. Następnie do obiektu można dodać nowe elementy. Wynik można zapisać do pliku. Pytanie brzmiało, jak stworzyć niestandardową wstążkę; nie jak zmodyfikować istniejący.
Roi-Kyi Bryant
1
@ Roi-Kyi-Bryant Pytanie dotyczyło dodania niestandardowego elementu wstążki, a nie nadpisania całej bieżącej niestandardowej wstążki. Ten kod zastępuje bieżącą wstążkę.
WizzleWuzzle
24

Walczyłem jak szalony, ale to właściwie jest właściwa odpowiedź. Za to, co jest warte, przegapiłem to:

  1. Jak mówią inni, nie można utworzyć wstążki CustomUI za pomocą VBA, jednak nie musisz!
  2. Chodzi o to, aby utworzyć kod wstążki XML za pomocą pliku Excel> Opcje> Dostosuj wstążkę, a następnie wyeksportować Wstążkę do pliku .customUI (to tylko plik txt, zawierający xml)
  3. Teraz jest sztuczka : możesz dołączyć kod .customUI do pliku .xlsm za pomocą narzędzia MS, do którego się tu odnoszą, kopiując kod z pliku .customUI
  4. Po umieszczeniu go w pliku .xlsm, za każdym razem, gdy go otwierasz, zdefiniowana wstążka jest dodawana do wstążki użytkownika - ale użyj elementu <ribbon startFromScratch = "false"> lub stracisz resztę wstążki. Po wyjściu ze skoroszytu wstążka jest usuwana.
  5. Od tego momentu jest to proste, utwórz wstążkę, skopiuj kod xml, który jest specyficzny dla wstążki z pliku .customUI, i umieść go w opakowaniu, jak pokazano powyżej (... <tabs> twój xml </ tabs .. .)

Nawiasem mówiąc, strona wyjaśniająca to w witrynie Rona jest teraz pod adresem http://www.rondebruin.nl/win/s2/win002.htm

A oto jego przykład, jak włączać / wyłączać przyciski na Wstążce http://www.rondebruin.nl/win/s2/win013.htm

Aby zapoznać się z innymi przykładami wstążek XML, zobacz również http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx

Jan Wijninckx
źródło
2
Wciąż (5 lat później) najlepsza odpowiedź moim zdaniem i może OP @BuZz chciałby odświeżyć oryginalny post, przynajmniej wskazując na tę odpowiedź (?). Ledwo go znalazłem, ponieważ leżał na dole dość długiej listy odpowiedzi.
Chri.s
18

Odpowiedzi tutaj dotyczą używania niestandardowego edytora interfejsu użytkownika. Spędziłem trochę czasu na tworzeniu interfejsu bez tego wspaniałego programu, więc dokumentuję tutaj rozwiązanie, aby pomóc wszystkim innym zdecydować, czy potrzebują tego niestandardowego edytora interfejsu użytkownika, czy nie.

Natknąłem się na następującą stronę pomocy Microsoft - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Pokazuje, jak ręcznie skonfigurować interfejs, ale miałem problemy ze wskazaniem mojego niestandardowego kodu dodatku.

Aby przyciski działały z niestandardowymi makrami, skonfiguruj makro w podrzędnych plikach .xlam tak, aby były wywoływane zgodnie z opisem w tej odpowiedzi SO - Wywołanie makra programu Excel ze wstążki . Zasadniczo musisz dodać parametr „control As IRibbonControl” do dowolnego modułu wskazanego w pliku XML wstążki. Ponadto plik XML wstążki powinien mieć składnię onAction = "myaddin! Mymodule.mysub", aby poprawnie wywoływać moduły załadowane przez dodatek.

Korzystając z tych instrukcji, udało mi się utworzyć dodatek programu Excel (plik .xlam), który ma załadowaną niestandardową kartę, gdy mój VBA jest ładowany do programu Excel wraz z dodatkiem. Przyciski wykonują kod z dodatku, a karta niestandardowa odinstalowuje się, gdy Usuwam dodatek.

Jomtung
źródło
1
To działa dla tych z nas, którzy nie mają wszystkich narzędzi programistycznych. Dzięki za „proste” rozwiązanie
Evan,
2
Uczyłem tej metody moich studentów drugiego roku programowania, ale w końcu odkryłem, że korzystanie z narzędzia CustomUI jest po prostu mniej skomplikowane, jeśli masz do niego dostęp.
Rick Henderson
8

Oprócz odpowiedzi Roi-Kyi Bryant, ten kod w pełni działa w programie Excel 2010. Naciśnij klawisze ALT + F11, a pojawi się edytor VBA. Kliknij dwukrotnie po ThisWorkbooklewej stronie, a następnie wklej ten kod:

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

Nie zapomnij zapisać i ponownie otworzyć skoroszytu. Mam nadzieję że to pomoże!

Erikas
źródło
Jak byś przekazał argumenty z tym? Używałem tego, ale nie mogę znaleźć sposobu na przekazywanie argumentów.
jDave1984
Korzystając z mojej odpowiedzi, dodałbyś listę argumentów do każdej procedury podrzędnej Coś w rodzaju LoadCustomRibbon (tabName jako String, groupName jako String, btnName jako String). Następnie wywołaj te podprogramy w odpowiednim miejscu, jak wskazał @Erikas.
Roi-Kyi Bryant
6

Napotkałem trudności z rozwiązaniem Roi-Kyi Bryanta, gdy wiele dodatków próbowało zmodyfikować wstążkę. Nie mam też dostępu administratora na moim komputerze roboczym, co wykluczało zainstalowanie Custom UI Editor. Jeśli więc jesteś na tej samej łodzi co ja, oto alternatywny przykład dostosowywania wstążki za pomocą tylko programu Excel. Uwaga, moje rozwiązanie pochodzi z przewodnika Microsoft .


  1. Utwórz plik / pliki Excela, których wstążki chcesz dostosować. W moim przypadku utworzyłem dwa .xlampliki Chart Tools.xlami Priveleged UDFs.xlam, aby zademonstrować, jak wiele dodatków może współdziałać ze Wstążką.
  2. Utwórz folder o dowolnej nazwie dla każdego właśnie utworzonego pliku.
  3. W każdym utworzonym folderze dodaj folder customUIi _rels.
  4. W każdym customUIfolderze utwórz customUI.xmlplik. W customUI.xmlpliku jak pliki Excel interakcji z wstążką. Część 2 przewodnika Microsoft obejmuje elementy w customUI.xmlpliku.

Mój customUI.xmlplik dla Chart Tools.xlamwygląda tak

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

Mój customUI.xmlplik dla Priveleged UDFs.xlamwygląda tak

<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. Dla każdego pliku utworzonego w kroku 1 dodaj przyrostek a .zipdo jego nazwy. W moim przypadku zmieniłem nazwę Chart Tools.xlamna Chart Tools.xlam.zipi Privelged UDFs.xlamna Priveleged UDFs.xlam.zip.
  2. Otwórz każdy .zipplik i przejdź do _relsfolderu. Skopiuj .relsplik do _relsfolderu utworzonego w kroku 3. Edytuj każdy .rels plik za pomocą edytora tekstu. Z przewodnika Microsoft

Pomiędzy ostatnim <Relationship>elementem a elementem zamykającym <Relationships>dodaj linię, która tworzy relację między plikiem dokumentu a plikiem dostosowywania. Upewnij się, że poprawnie określisz nazwy folderów i plików.

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

Mój .relsplik dla Chart Tools.xlamwygląda tak

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

Mój .relsplik dla Priveleged UDFswygląda tak.

<?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. Zastąp .relspliki w każdym .zippliku .relsplikiem / plikami zmodyfikowanymi w poprzednim kroku.
  2. Skopiuj i wklej utworzony .customUIfolder do katalogu domowego .zippliku / plików.
  3. Usuń .ziprozszerzenie pliku z utworzonych plików programu Excel .
  4. Jeśli utworzyłeś .xlampliki, z powrotem w programie Excel, dodaj je do dodatków programu Excel.
  5. Jeśli ma to zastosowanie, utwórz wywołania zwrotne w każdym z dodatków. W kroku 4 onActionmoje przyciski zawierają słowa kluczowe. Słowo onActionkluczowe wskazuje, że po uruchomieniu elementu zawierającego aplikacja Excel wyzwoli podprogram w cudzysłowie bezpośrednio po onActionsłowie kluczowym. Nazywa się to oddzwonieniem . W moich .xlamplikach mam moduł o nazwie, w CallBacksktórym zawarłem podprogramy wywołania zwrotnego.

Moduł CallBacks

Wygląda CallBacksna to mój modułChart Tools.xlam

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

Wygląda CallBacksna to mój modułPriveleged UDFs.xlam

Opcja jawna

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

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

Różne elementy mają różne sygnatury podprogramu wywołania zwrotnego. W przypadku przycisków wymagany parametr procedury podrzędnej to ByRef control As IRibbonControl. Jeśli nie spełnisz wymaganej sygnatury wywołania zwrotnego, podczas kompilowania projektu / projektów VBA pojawi się błąd. Część 3 przewodnika Microsoft definiuje wszystkie podpisy wywołań zwrotnych.


Oto jak wygląda mój gotowy przykład

Ukończony produkt


Kilka wskazówek na zakończenie

  1. Jeśli chcesz, aby dodatki współdzieliły elementy wstążki, użyj słowa kluczowego idQi xlmns:. W moim przykładzie oba Chart Tools.xlami Priveleged UDFs.xlammają dostęp do elementów z idQrównymi x:chartToolsTabi x:privelgedUDFsTab. W tym celu do pracy, x:wymagane jest, a ja jej nazw zdefiniowane w pierwszej linii mojego customUI.xmlpliku <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">. Sekcja Dwa sposoby dostosowywania Fluent UI w przewodniku Microsoft zawiera więcej szczegółów.
  2. Jeśli chcesz, aby dodatki miały dostęp do elementów wstążki dostarczanych z programem Excel, użyj isMSOsłowa kluczowego. Sekcja Dwa sposoby dostosowywania Fluent UI w przewodniku Microsoft zawiera więcej szczegółów.
Joshua Daly
źródło
0

Innym podejściem byłoby pobranie bezpłatnego modułu klasy Open XML Jana Karela Pieterse'a z tej strony: Edycja elementów w pliku OpenXML przy użyciu VBA

Po dodaniu tego do projektu VBA możesz rozpakować plik Excel, użyć VBA do zmodyfikowania XML, a następnie użyć klasy, aby ponownie rozpakować pliki.

John Korchok
źródło