วิธีเพิ่มแท็บ Ribbon แบบกำหนดเองโดยใช้ VBA


100

ฉันกำลังมองหาวิธีเพิ่มแท็บแบบกำหนดเองในริบบิ้น Excel ซึ่งจะมีปุ่มไม่กี่ปุ่ม ฉันเปลี่ยนไปใช้ทรัพยากรบางอย่างที่พูดถึงมันผ่านทาง Google แต่ทั้งหมดดูน่ากลัวและซับซ้อนมาก

วิธีที่ง่ายและรวดเร็วในการทำคืออะไร? ฉันต้องการให้แท็บใหม่โหลดเมื่อ VBA ของฉันโหลดลงใน Excel ..

UPDATE : ฉันลองใช้ตัวอย่างนี้จากที่นี่แต่ได้รับข้อผิดพลาด "object required" ในคำสั่งสุดท้าย:

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

โปรดยืนยันว่าคุณใช้ Excel เวอร์ชันใดอยู่
Siddharth Rout

นั่นคือสำหรับโครงการ
Nathan_Sav

คำตอบ:


147

AFAIK คุณไม่สามารถใช้ VBA Excel เพื่อสร้างแท็บแบบกำหนดเองใน Ribbon ของ Excel อย่างไรก็ตามคุณสามารถซ่อน / ทำให้เห็นส่วนประกอบ Ribbon ได้โดยใช้ VBA นอกจากนี้ลิงก์ที่คุณกล่าวถึงข้างต้นมีไว้สำหรับ MS Project ไม่ใช่ MS Excel

ฉันจะสร้างแท็บสำหรับการประยุกต์ใช้ Excel ของฉัน / Add-Ins ใช้ยูทิลิตี้ฟรีนี้เรียกว่ากำหนดเองแก้ไข UI


แก้ไข: เพื่อรองรับคำขอใหม่ของ OP

บทช่วยสอน

นี่คือบทแนะนำสั้น ๆ ตามสัญญา:

  1. หลังจากที่คุณติดตั้ง Custom UI Editor (CUIE) แล้วให้เปิดขึ้นมาจากนั้นคลิกที่ไฟล์ | เปิดและเลือกไฟล์ Excel ที่เกี่ยวข้อง โปรดตรวจสอบให้แน่ใจว่าปิดไฟล์ Excel แล้วก่อนที่คุณจะเปิดผ่าน CUIE ฉันใช้แผ่นงานใหม่เป็นตัวอย่าง

    ป้อนคำอธิบายภาพที่นี่

  2. คลิกขวาที่แสดงในภาพด้านล่างและคลิกที่ "Office 2007 Custom UI Part" มันจะแทรก "customUI.xml"

    ป้อนคำอธิบายภาพที่นี่

  3. คลิกถัดไปที่เมนูแทรก | ตัวอย่าง XML | แท็บที่กำหนดเอง คุณจะสังเกตเห็นว่าโค้ดพื้นฐานถูกสร้างขึ้นโดยอัตโนมัติ ตอนนี้คุณพร้อมที่จะแก้ไขตามความต้องการของคุณแล้ว

    ป้อนคำอธิบายภาพที่นี่

  4. มาตรวจสอบโค้ดกัน

    ป้อนคำอธิบายภาพที่นี่

    label="Custom Tab": แทนที่ "Custom Tab" ด้วยชื่อที่คุณต้องการตั้งให้กับแท็บของคุณ ในตอนนี้ขอเรียกว่า "เจอโรม"

    ส่วนด้านล่างเพิ่มปุ่มกำหนดเอง

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

    imageMso: นี่คือภาพที่จะแสดงบนปุ่ม "HappyFace" คือสิ่งที่คุณจะเห็นในขณะนี้ คุณสามารถดาวน์โหลดเพิ่มเติม ID ภาพที่นี่

    onAction="Callback": "โทรกลับ" คือชื่อของขั้นตอนที่ทำงานเมื่อคุณคลิกที่ปุ่ม

การสาธิต

จากนั้นให้สร้างปุ่ม 2 ปุ่มและเรียกมันว่า "ปุ่ม JG 1" และ "ปุ่ม JG 2" ขอให้ใบหน้าที่มีความสุขเหมือนภาพแรกและขอให้ "ดวงอาทิตย์" เป็นที่สอง ตอนนี้รหัสที่แก้ไขมีลักษณะดังนี้:

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

ลบรหัสทั้งหมดที่สร้างขึ้นใน CUIE แล้ววางรหัสด้านบนแทนรหัสนั้น บันทึกและปิด CUIE ตอนนี้เมื่อคุณเปิดไฟล์ Excel มันจะมีลักษณะดังนี้:

ป้อนคำอธิบายภาพที่นี่

ตอนนี้ส่วนรหัส เปิด VBA Editor ใส่โมดูลและวางรหัสนี้:

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

บันทึกไฟล์ Excel เป็นไฟล์ที่เปิดใช้งานมาโคร ตอนนี้เมื่อคุณคลิกที่หน้ายิ้มหรือดวงอาทิตย์คุณจะเห็นกล่องข้อความที่เกี่ยวข้อง:

ป้อนคำอธิบายภาพที่นี่

หวังว่านี่จะช่วยได้!


6
ใช่ :) รอนมีตัวอย่างมากมายในเว็บไซต์ของเขา rondebruin.nl/ribbon.htm
Siddharth Rout

1
คุณต้องการสร้างแท็บใหม่หรือไม่? ถ้าใช่โปรดให้รายละเอียดเพิ่มเติมและฉันจะให้รหัส XML แก่คุณ :)
Siddharth Rout

1
Gimme 20 นาที การอัปเดตโพสต์ด้านบนด้วยรหัสและภาพรวมที่เกี่ยวข้อง :)
Siddharth Rout

7
@SiddharthRout +1 - ฉันพบว่าฉันไม่ต้องการหนังสือ Excel ใด ๆ เพียงติดตามโพสต์ของคุณเพื่อดูสิ่งที่ฉันต้องเรียนรู้ในหนึ่งวันทำงาน (และเย็นนี้เป็น Ribbon XML!) :)
Our Man in กล้วย

1
ฉันอยากจะแนะนำให้สร้าง quesiton ใหม่โดยใช้โค้ด xml พื้นฐานและรหัส VBA จากนั้นเราจะสร้างแบบฟอร์มที่นั่นได้ไหม @YasserKhalil
Siddharth Rout

30

ฉันสามารถทำสิ่งนี้ให้สำเร็จได้ด้วย VBA ใน Excel 2013 ไม่จำเป็นต้องมีบรรณาธิการพิเศษ สิ่งที่คุณต้องมีคือโปรแกรมแก้ไขโค้ด Visual Basic ซึ่งสามารถเข้าถึงได้จากแท็บนักพัฒนา โดยค่าเริ่มต้นแท็บนักพัฒนาจะมองไม่เห็นดังนั้นจึงต้องเปิดใช้งานในไฟล์> ตัวเลือก> กำหนด Ribbon เอง บนแท็บนักพัฒนาคลิกปุ่ม Visual Basic โปรแกรมแก้ไขโค้ดจะเปิดขึ้น คลิกขวาในบานหน้าต่าง Project Explorer ทางด้านซ้าย คลิกเมนูแทรกและเลือกโมดูล เพิ่มทั้งสองส่วนด้านล่างลงในโมดูลใหม่

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

เรียกใช้ LoadCustRibbon ย่อยใน Wookbook เปิดแม้กระทั่งและเรียกใช้ ClearCustRibbon ย่อยในเหตุการณ์ Before_Close ของไฟล์รหัส ThisWorkbook


สิ่งนี้ใช้ได้ผลสำหรับฉัน แต่มีปัญหาเล็กน้อยเพียงไม่กี่ประเด็นที่ฉันพบ 1) ถ้าฉันเก็บเหตุการณ์ Before_Close ไว้ริบบิ้นใหม่ไม่โหลด 2) เมื่อฉันจัดการเพื่อให้ Ribbon ทำงานได้โดยการลบเหตุการณ์ Before_Close ฉันต้องโหลด Excel ใหม่ก่อนจึงจะปรากฏขึ้น หากคุณสามารถให้คำแนะนำได้ว่าทำไมจึงเกิดเหตุการณ์นี้ขึ้นนั่นจะดีมาก!
Petay87

รหัสเหมือนกันทุกประการหรือไม่? โพสต์ได้มั้ย แนวคิดคือ Excel ควรแก้ไขไฟล์ Ribbon มาตรฐานก่อนที่จะโหลด Ribbon และรีเซ็ตก่อนที่จะปิดสมุดงาน การรีเซ็ต Ribbon เป็นสิ่งที่จำเป็นดังนั้นจึงไม่แสดงในสมุดงานอื่น
Roi-Kyi Bryant

3
รหัสนี้เขียนทับการปรับแต่ง Ribbon ปัจจุบันทั้งหมดที่ผู้ใช้อาจทำไว้แล้ว
WizzleWuzzle

@WizzleWuzzle ไม่จำเป็นต้อง Ribbon สามารถนำเข้าและแยกวิเคราะห์ลงในวัตถุที่สามารถข้ามผ่านได้ จากนั้นสามารถเพิ่มองค์ประกอบใหม่ลงในวัตถุได้ ผลลัพธ์สามารถบันทึกลงในไฟล์ คำถามคือวิธีสร้าง Ribbon แบบกำหนดเอง ไม่ใช่วิธีแก้ไขที่มีอยู่
Roi-Kyi Bryant

1
@ Roi-Kyi-Bryant คำถามคือการเพิ่มรายการ Ribbon ที่กำหนดเองไม่ใช่เขียนทับ Ribbon ที่กำหนดเองในปัจจุบันทั้งหมด รหัสนี้เขียนทับ Ribbon ปัจจุบัน
WizzleWuzzle

24

ฉันดิ้นรนอย่างบ้าคลั่ง แต่นี่เป็นคำตอบที่ถูกต้องจริงๆ สิ่งที่คุ้มค่าสิ่งที่ฉันพลาดคือ:

  1. อย่างที่คนอื่นบอกไม่มีใครสร้าง Ribbon CustomUI ด้วย VBA แต่คุณไม่จำเป็นต้องทำ!
  2. แนวคิดคือคุณสร้างรหัส xml Ribbon ของคุณโดยใช้ไฟล์ของ Excel> ตัวเลือก> กำหนด Ribbon เองจากนั้นส่งออก Ribbon ไปยังไฟล์. customUI (เป็นเพียงไฟล์ txt โดยมี xml อยู่ในนั้น)
  3. ตอนนี้เคล็ดลับมาแล้ว : คุณสามารถรวมรหัส. customUI ในไฟล์. xlsm ของคุณโดยใช้เครื่องมือ MS ที่อ้างถึงที่นี่โดยการคัดลอกรหัสจากไฟล์. customUI
  4. เมื่อรวมอยู่ในไฟล์. xlsm ทุกครั้งที่คุณเปิดริบบิ้นที่คุณกำหนดจะถูก เพิ่มเข้าไปใน Ribbon ของผู้ใช้ แต่ให้ใช้ <ribbon startFromScratch = "false"> ไม่เช่นนั้นคุณจะสูญเสียส่วนที่เหลือของ Ribbon เมื่อออกจากสมุดงานริบบิ้นจะถูกลบออก
  5. จากที่นี่เป็นเรื่องง่ายให้สร้าง Ribbon ของคุณคัดลอกโค้ด xml ที่เฉพาะเจาะจงสำหรับริบบอนของคุณจากไฟล์. customUI และวางไว้ในกระดาษห่อหุ้มดังที่แสดงด้านบน (... .)

โดยหน้าเว็บที่อธิบายไว้ในเว็บไซต์ของ Ron อยู่ที่ http://www.rondebruin.nl/win/s2/win002.htm

และนี่คือตัวอย่างของเขาเกี่ยวกับวิธีการเปิด / ปิดปุ่มบน Ribbon http://www.rondebruin.nl/win/s2/win013.htm

สำหรับตัวอย่าง xml อื่น ๆ ของริบบอนโปรดดูที่ http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx


2
ยังคง (5 ปีต่อมา) คำตอบที่ดีที่สุดในความคิดของฉันและบางที OP @BuZz ต้องการรีเฟรชโพสต์เดิมอย่างน้อยก็ชี้ไปที่คำตอบนี้ (?) ฉันแทบไม่พบว่ามันนอนอยู่ด้านล่างของรายการคำตอบที่ค่อนข้างยาว
Chri.s

18

คำตอบที่นี่เป็นคำตอบเฉพาะสำหรับการใช้ UI Editor ที่กำหนดเอง ฉันใช้เวลาในการสร้างอินเทอร์เฟซโดยไม่มีโปรแกรมที่ยอดเยี่ยมดังนั้นฉันจึงจัดทำเอกสารโซลูชันที่นี่เพื่อช่วยให้ทุกคนตัดสินใจว่าพวกเขาต้องการตัวแก้ไข UI ที่กำหนดเองหรือไม่

ฉันมาข้ามหน้าเว็บช่วยเหลือ Microsoft ต่อไปนี้ - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx นี่แสดงวิธีตั้งค่าอินเทอร์เฟซด้วยตนเอง แต่ฉันมีปัญหาเมื่อชี้ไปที่โค้ดเสริมที่กำหนดเอง

ที่จะได้รับปุ่มเพื่อทำงานร่วมกับแมโครของคุณเอง, การตั้งค่าแมโครในหมวดย่อย .xlam ของคุณจะถูกเรียกว่าตามที่อธิบายไว้ในคำตอบดังนั้นนี้ - โทรแมโคร Excel จากริบบิ้น โดยทั่วไปคุณจะต้องเพิ่มพารามิเตอร์ "control As IRibbonControl" ลงในโมดูลใด ๆ ที่ชี้จาก xml ริบบอนของคุณ นอกจากนี้ xml ริบบอนของคุณควรมีไวยากรณ์ onAction = "myaddin! mymodule.mysub" เพื่อเรียกโมดูลที่โหลดโดย add in อย่างถูกต้อง

การใช้คำแนะนำเหล่านั้นฉันสามารถสร้าง excel เพิ่มใน (ไฟล์. xlam) ที่มีการโหลดแท็บแบบกำหนดเองเมื่อ VBA ของฉันโหลดลงใน Excel พร้อมกับ Add in ปุ่มเรียกใช้โค้ดจาก Add in และแท็บที่กำหนดเองจะถอนการติดตั้งเมื่อ ฉันลบส่วนเสริมออก


1
สิ่งนี้ใช้ได้กับพวกเราที่ไม่มีเครื่องมือในการพัฒนาทั้งหมด ขอบคุณสำหรับวิธีแก้ปัญหา "ง่ายๆ"
Evan

2
ฉันเคยสอนนักเรียนการเขียนโปรแกรมชั้นปีที่ 2 ด้วยวิธีนี้ แต่ในที่สุดก็พบว่าการใช้เครื่องมือ CustomUI นั้นซับซ้อนน้อยลงหากคุณสามารถเข้าถึงได้
Rick Henderson

8

นอกเหนือจากคำตอบ Roi-Kyi Bryant แล้วโค้ดนี้ยังใช้งานได้อย่างสมบูรณ์ใน Excel 2010 กด ALT + F11 แล้วตัวแก้ไข VBA จะปรากฏขึ้น ดับเบิลคลิกThisWorkbookที่ด้านซ้ายจากนั้นวางรหัสนี้:

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

อย่าลืมบันทึกและเปิดสมุดงานอีกครั้ง หวังว่านี่จะช่วยได้!


คุณจะผ่านข้อโต้แย้งนี้ได้อย่างไร? ฉันใช้สิ่งนี้มาตลอด แต่ไม่สามารถหาวิธีส่งผ่านข้อโต้แย้งได้
jDave1984

การใช้คำตอบของฉันคุณจะเพิ่มรายการอาร์กิวเมนต์ให้กับแต่ละรูทีนย่อยบางอย่างเช่น LoadCustomRibbon (tabName เป็น String, groupName เป็น String, btnName เป็น String) จากนั้นเรียกกิจวัตรย่อยเหล่านั้นในตำแหน่งที่เหมาะสมตามที่ @Erikas ชี้ให้เห็น
Roi-Kyi Bryant

6

ฉันพบปัญหากับโซลูชันของ Roi-Kyi Bryant เมื่อAdd-in หลายตัวพยายามแก้ไข Ribbon ฉันไม่มีสิทธิ์เข้าถึงระดับผู้ดูแลระบบบนคอมพิวเตอร์ที่ทำงานซึ่งตัดไม่ให้ติดตั้งไฟล์Custom UI Editor. ดังนั้นหากคุณอยู่ในเรือลำเดียวกับฉันนี่คือตัวอย่างทางเลือกในการปรับแต่ง Ribbon โดยใช้ Excel เท่านั้น หมายเหตุวิธีการแก้ปัญหาของฉันมาจากคู่มือไมโครซอฟท์


  1. สร้างไฟล์ Excel / ไฟล์ที่มีริบบอนที่คุณต้องการปรับแต่ง ในกรณีของฉันฉันได้สร้าง.xlamไฟล์สองไฟล์Chart Tools.xlamและPriveleged UDFs.xlamเพื่อแสดงให้เห็นว่าส่วนเสริมหลายตัวสามารถโต้ตอบกับ Ribbon ได้อย่างไร
  2. สร้างโฟลเดอร์พร้อมชื่อโฟลเดอร์สำหรับแต่ละโฟลเดอร์ไฟล์ที่คุณเพิ่งสร้าง
  3. ภายในแต่ละโฟลเดอร์ที่คุณสร้างขึ้นให้เพิ่มcustomUIและ_relsโฟลเดอร์
  4. 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. สำหรับแต่ละไฟล์ที่คุณสร้างในขั้นตอนที่ 1 ให้ต่อท้าย.zipชื่อไฟล์ ในกรณีของฉันฉันเปลี่ยนChart Tools.xlamไปChart Tools.xlam.zipและจะPrivelged UDFs.xlamPriveleged UDFs.xlam.zip
  2. เปิดแต่ละ.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>
  1. แทนที่.relsไฟล์ในแต่ละ.zipไฟล์ด้วยนามสกุล.relsไฟล์ / ไฟล์ที่คุณแก้ไขในขั้นตอนก่อนหน้า
  2. คัดลอกและวาง.customUIโฟลเดอร์ที่คุณสร้างลงในโฮมไดเร็กทอรีของ.zipไฟล์ / ไฟล์
  3. ลบ.zipนามสกุลไฟล์ออกจากไฟล์ Excel ที่คุณสร้างขึ้นที่คุณสร้างขึ้น
  4. หากคุณเคยสร้าง .xlamไฟล์กลับมาใน Excel แล้วเพิ่มลงในโปรแกรมเสริม Excel ของคุณ
  5. หากทำได้ให้สร้างการโทรกลับในแต่ละส่วนเสริมของคุณ ในขั้นตอนที่ 4 มีonActionคีย์เวิร์ดในปุ่มของฉัน onActionคำหลักที่แสดงให้เห็นว่าเมื่อมีองค์ประกอบที่จะถูกเรียกโปรแกรม Excel จะเรียกย่อยประจำห่อหุ้มในเครื่องหมายคำพูดโดยตรงหลังจากที่onActionคำหลัก นี้เป็นที่รู้จักกันโทรกลับ ใน.xlamไฟล์ของฉันฉันมีโมดูลที่เรียกว่าCallBacksซึ่งฉันได้รวมรูทีนย่อยการโทรกลับไว้

โมดูล 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กำหนดลายเซ็นการติดต่อกลับทั้งหมด


นี่คือลักษณะของตัวอย่างที่เสร็จแล้วของฉัน

ผลิตภัณฑ์สำเร็จรูป


เคล็ดลับการปิดบัญชี

  1. หากคุณต้องการให้ 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ให้รายละเอียดเพิ่มเติม
  2. ถ้าคุณต้องการให้ Add-in เข้าถึงองค์ประกอบ Ribbon ที่มาพร้อมกับ Excel ให้ใช้isMSOคำสำคัญ ส่วนสองวิธีในการปรับแต่ง Fluent UIในคู่มือ Microsoftให้รายละเอียดเพิ่มเติม

1

อีกวิธีหนึ่งคือการดาวน์โหลดโมดูลคลาส Open XML ฟรีของ Jan Karel Pieterse จากหน้านี้: การแก้ไของค์ประกอบในไฟล์ OpenXML โดยใช้ VBA

เมื่อเพิ่มสิ่งนี้ลงในโปรเจ็กต์ VBA ของคุณคุณสามารถคลายซิปไฟล์ Excel ใช้ VBA เพื่อแก้ไข XML จากนั้นใช้คลาสเพื่อบีบอัดไฟล์อีกครั้ง


ฉันดีใจที่เลื่อนมาที่ด้านล่างสุดของหัวข้อนี้ นี่คือสิ่งที่ฉันกำลังมองหา! ขอบคุณ John :-)
scott_f
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.