ฉันพบปัญหากับโซลูชันของ 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.xlam
Priveleged 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
ทั้งสองมีการเข้าถึงองค์ประกอบที่มีidQ
s' เท่ากับและ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ให้รายละเอียดเพิ่มเติม