ฉันพบปัญหากับโซลูชันของ Roi-Kyi Bryant เมื่อAdd-in หลายตัวพยายามแก้ไข Ribbon ฉันไม่มีสิทธิ์เข้าถึงระดับผู้ดูแลระบบบนคอมพิวเตอร์ที่ทำงานซึ่งตัดไม่ให้ติดตั้งไฟล์Custom UI Editor. ดังนั้นหากคุณอยู่ในเรือลำเดียวกับฉันนี่คือตัวอย่างทางเลือกในการปรับแต่ง Ribbon โดยใช้ Excel เท่านั้น หมายเหตุวิธีการแก้ปัญหาของฉันมาจากคู่มือไมโครซอฟท์
- สร้างไฟล์ Excel / ไฟล์ที่มีริบบอนที่คุณต้องการปรับแต่ง ในกรณีของฉันฉันได้สร้าง
.xlamไฟล์สองไฟล์Chart Tools.xlamและPriveleged UDFs.xlamเพื่อแสดงให้เห็นว่าส่วนเสริมหลายตัวสามารถโต้ตอบกับ Ribbon ได้อย่างไร
- สร้างโฟลเดอร์พร้อมชื่อโฟลเดอร์สำหรับแต่ละโฟลเดอร์ไฟล์ที่คุณเพิ่งสร้าง
- ภายในแต่ละโฟลเดอร์ที่คุณสร้างขึ้นให้เพิ่ม
customUIและ_relsโฟลเดอร์
customUIสร้างcustomUI.xmlไฟล์ภายในแต่ละโฟลเดอร์ customUI.xmlรายละเอียดไฟล์ว่าไฟล์ Excel โต้ตอบกับริบบิ้น ส่วนที่ 2 ของคู่มือ Microsoftครอบคลุมองค์ประกอบต่างๆในcustomUI.xmlไฟล์
customUI.xmlไฟล์ของฉันChart Tools.xlamมีลักษณะเช่นนี้
<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>
customUI.xmlไฟล์ของฉันPriveleged UDFs.xlamมีลักษณะเช่นนี้
<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 ให้ต่อท้าย
.zipชื่อไฟล์ ในกรณีของฉันฉันเปลี่ยนChart Tools.xlamไปChart Tools.xlam.zipและจะPrivelged UDFs.xlamPriveleged UDFs.xlam.zip
- เปิดแต่ละ
.zipไฟล์และไปที่_relsโฟลเดอร์ คัดลอก.relsไฟล์ไปยัง_relsโฟลเดอร์ที่คุณสร้างในขั้นตอนที่ 3 แก้ไขแต่ละ .relsไฟล์ด้วยโปรแกรมแก้ไขข้อความ จากคู่มือของ Microsoft
ระหว่าง<Relationship>องค์ประกอบสุดท้ายและองค์ประกอบปิด
<Relationships>ให้เพิ่มบรรทัดที่สร้างความสัมพันธ์ระหว่างไฟล์เอกสารและไฟล์กำหนดเอง ตรวจสอบให้แน่ใจว่าคุณระบุชื่อโฟลเดอร์และไฟล์อย่างถูกต้อง
<Relationship Type="http://schemas.microsoft.com/office/2006/
relationships/ui/extensibility" Target="/customUI/customUI.xml"
Id="customUIRelID" />
.relsไฟล์ของฉันChart Tools.xlamมีลักษณะเช่นนี้
<?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>
.relsไฟล์ของฉันPriveleged UDFsมีลักษณะเช่นนี้
<?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>
- แทนที่
.relsไฟล์ในแต่ละ.zipไฟล์ด้วยนามสกุล.relsไฟล์ / ไฟล์ที่คุณแก้ไขในขั้นตอนก่อนหน้า
- คัดลอกและวาง
.customUIโฟลเดอร์ที่คุณสร้างลงในโฮมไดเร็กทอรีของ.zipไฟล์ / ไฟล์
- ลบ
.zipนามสกุลไฟล์ออกจากไฟล์ Excel ที่คุณสร้างขึ้นที่คุณสร้างขึ้น
- หากคุณเคยสร้าง
.xlamไฟล์กลับมาใน Excel แล้วเพิ่มลงในโปรแกรมเสริม Excel ของคุณ
- หากทำได้ให้สร้างการโทรกลับในแต่ละส่วนเสริมของคุณ ในขั้นตอนที่ 4 มี
onActionคีย์เวิร์ดในปุ่มของฉัน onActionคำหลักที่แสดงให้เห็นว่าเมื่อมีองค์ประกอบที่จะถูกเรียกโปรแกรม Excel จะเรียกย่อยประจำห่อหุ้มในเครื่องหมายคำพูดโดยตรงหลังจากที่onActionคำหลัก นี้เป็นที่รู้จักกันโทรกลับ ใน.xlamไฟล์ของฉันฉันมีโมดูลที่เรียกว่าCallBacksซึ่งฉันได้รวมรูทีนย่อยการโทรกลับไว้

CallBacksโมดูลของฉันสำหรับ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
CallBacksโมดูลของฉันสำหรับPriveleged UDFs.xlamดูเหมือนว่า
ตัวเลือกที่ชัดเจน
Public Sub InitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
ThisWorkbook.InitialisePrivelegedUDFs
End Sub
Public Sub DeInitialisePrivelegedUDFsCallBack(ByRef control As IRibbonControl)
ThisWorkbook.DeInitialisePrivelegedUDFs
End Sub
องค์ประกอบที่แตกต่างกันมีลายเซ็นประจำย่อยการเรียกกลับที่แตกต่างกัน ByRef control As IRibbonControlสำหรับปุ่มพารามิเตอร์ย่อยประจำต้องมี หากคุณไม่ปฏิบัติตามลายเซ็นการติดต่อกลับที่ต้องการคุณจะได้รับข้อผิดพลาดขณะรวบรวมโครงการ VBA / โครงการของคุณ ส่วนที่ 3 ของคู่มือ Microsoftกำหนดลายเซ็นการติดต่อกลับทั้งหมด
นี่คือลักษณะของตัวอย่างที่เสร็จแล้วของฉัน

เคล็ดลับการปิดบัญชี
- หากคุณต้องการให้ Add-in แชร์องค์ประกอบ Ribbon ให้ใช้คีย์เวิร์ด
idQและ xlmns:ในตัวอย่างของฉันChart Tools.xlamและPriveleged UDFs.xlamทั้งสองมีการเข้าถึงองค์ประกอบที่มีidQs' เท่ากับและx:chartToolsTab x:privelgedUDFsTabเพื่อให้ใช้งานx:ได้จำเป็นต้องมีและฉันได้กำหนดเนมสเปซในบรรทัดแรกของcustomUI.xmlไฟล์ของฉัน<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">แล้ว ส่วนสองวิธีในการปรับแต่ง Fluent UIในคู่มือ Microsoftให้รายละเอียดเพิ่มเติม
- ถ้าคุณต้องการให้ Add-in เข้าถึงองค์ประกอบ Ribbon ที่มาพร้อมกับ Excel ให้ใช้
isMSOคำสำคัญ ส่วนสองวิธีในการปรับแต่ง Fluent UIในคู่มือ Microsoftให้รายละเอียดเพิ่มเติม