Làm cách nào để thêm tab Ribbon tùy chỉnh bằng VBA?


98

Tôi đang tìm cách để thêm một tab tùy chỉnh trong ruy-băng Excel sẽ có một vài nút. Tôi đã tìm hiểu một số tài nguyên giải quyết vấn đề này qua Google nhưng tất cả đều trông rất khó hiểu và phức tạp.

Cách nhanh chóng và đơn giản để làm điều đó là gì? Tôi muốn tab mới được tải khi VBA của tôi được tải vào Excel ..

CẬP NHẬT : Tôi đã thử ví dụ này từ đây nhưng gặp lỗi "bắt buộc đối tượng" trên hướng dẫn cuối cùng:

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

Vui lòng xác nhận bạn đang sử dụng phiên bản Excel nào?
Siddharth Rout

Đó là đối với Project.
Nathan_Sav

Câu trả lời:


146

AFAIK bạn không thể sử dụng VBA Excel để tạo tab tùy chỉnh trong ruy-băng Excel. Tuy nhiên, bạn có thể ẩn / hiển thị một thành phần ruy-băng bằng VBA. Ngoài ra, liên kết mà bạn đã đề cập ở trên dành cho MS Project chứ không phải MS Excel.

Tôi tạo các tab cho Ứng dụng / Phần bổ trợ Excel của mình bằng tiện ích miễn phí này có tên là Trình chỉnh sửa giao diện người dùng tùy chỉnh .


Chỉnh sửa: Để đáp ứng yêu cầu mới của OP

Hướng dẫn

Đây là một hướng dẫn ngắn như đã hứa:

  1. Sau khi bạn đã cài đặt Trình chỉnh sửa giao diện người dùng tùy chỉnh (CUIE), hãy mở nó và sau đó nhấp vào Tệp | Mở và chọn Tệp Excel có liên quan. Hãy đảm bảo rằng Tệp Excel đã được đóng trước khi bạn mở nó qua CUIE. Tôi đang sử dụng một trang tính hoàn toàn mới làm ví dụ.

    nhập mô tả hình ảnh ở đây

  2. Nhấp chuột phải như thể hiện trong hình ảnh bên dưới và nhấp vào "Phần giao diện người dùng tùy chỉnh của Office 2007". Nó sẽ chèn "customUI.xml"

    nhập mô tả hình ảnh ở đây

  3. Tiếp theo Nhấp vào menu Chèn | XML mẫu | Tab tùy chỉnh. Bạn sẽ nhận thấy rằng mã cơ bản được tạo tự động. Bây giờ bạn đã sẵn sàng chỉnh sửa nó theo yêu cầu của bạn.

    nhập mô tả hình ảnh ở đây

  4. Hãy kiểm tra mã

    nhập mô tả hình ảnh ở đây

    label="Custom Tab": Thay thế "Tab tùy chỉnh" bằng tên mà bạn muốn đặt cho tab của mình. Hiện tại chúng ta hãy gọi nó là "Jerome".

    Phần bên dưới thêm một nút tùy chỉnh.

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

    imageMso: Đây là hình ảnh sẽ hiển thị trên nút. "HappyFace" là những gì bạn sẽ thấy vào lúc này. Bạn có thể tải thêm ID hình ảnh tại đây .

    onAction="Callback": "Gọi lại" là tên của thủ tục chạy khi bạn nhấp vào nút.

Bản giới thiệu

Cùng với đó, hãy tạo 2 nút và gọi chúng là "Nút JG 1" và "Nút JG 2". Hãy giữ khuôn mặt vui vẻ như hình ảnh của hình ảnh đầu tiên và hãy giữ "Mặt trời" cho hình ảnh thứ hai. Mã sửa đổi bây giờ trông giống như sau:

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

Xóa tất cả mã được tạo trong CUIE và sau đó dán mã trên thay cho mã đó. Lưu và đóng CUIE. Bây giờ khi bạn mở tệp Excel, nó sẽ giống như sau:

nhập mô tả hình ảnh ở đây

Bây giờ là phần mã. Mở VBA Editor, chèn một mô-đun và dán mã này:

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

Lưu tệp Excel dưới dạng tệp hỗ trợ macro. Bây giờ khi bạn nhấp vào Mặt cười hoặc Mặt trời, bạn sẽ thấy hộp thông báo liên quan:

nhập mô tả hình ảnh ở đây

Hi vọng điêu nay co ich!


6
Có :) Ron có rất nhiều ví dụ trong trang web của mình. rondebruin.nl/ribbon.htm
Siddharth Rout

1
Bạn có muốn tạo một Tab mới không? Nếu có thì cung cấp thêm thông tin chi tiết và tôi sẽ cung cấp cho bạn các XML Mã :)
Siddharth rout

1
Gimme 20 phút. Đang cập nhật bài viết ở trên với mã có liên quan và ảnh chụp nhanh :)
Siddharth rout

6
@SiddharthRout +1 - Tôi phát hiện ra rằng tôi không cần bất kỳ sách Excel nào, chỉ cần theo dõi các bài đăng của bạn để biết những gì tôi cần học trong một ngày làm việc (và tối nay, đó là Ribbon XML!) :)
Our Man in Chuối

1
Tôi khuyên bạn nên tạo một quesiton mới với mã xml cơ bản và mã VBA và sau đó chúng ta có thể lấy nó ở đó? @YasserKhalil
Siddharth Rout

30

Tôi đã có thể thực hiện điều này với VBA trong Excel 2013. Không cần trình chỉnh sửa đặc biệt. Tất cả những gì bạn cần là trình chỉnh sửa mã Visual Basic có thể được truy cập trên tab Nhà phát triển. Tab Nhà phát triển không hiển thị theo mặc định vì vậy nó cần được bật trong Tệp> Tùy chọn> Tùy chỉnh Ruy-băng. Trên tab Nhà phát triển, bấm vào nút Visual Basic. Trình chỉnh sửa mã sẽ khởi chạy. Nhấp chuột phải vào ngăn Project Explorer ở bên trái. Nhấp vào menu chèn và chọn mô-đun. Thêm cả hai đăng ký bên dưới vào mô-đun mới.

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

Gọi LoadCustRibbon con trong Wookbook mở chẵn và gọi con ClearCustRibbon trong Sự kiện Before_Close của tệp mã ThisWorkbook.


Điều này đã hiệu quả với tôi nhưng chỉ với một số vấn đề nhỏ mà tôi gặp phải. 1) Nếu tôi giữ Sự kiện Before_Close trong, dải băng mới không tải. 2) Khi tôi quản lý để dải băng hoạt động bằng cách loại bỏ sự kiện Before_Close, tôi phải tải lại Excel trước khi nó xuất hiện. Nếu bạn có thể tư vấn tại sao điều này lại xảy ra, điều đó thật tuyệt!
Petay87

Mã có hoàn toàn giống nhau không? Bạn có thể đăng nó? Ý tưởng là Excel nên sửa đổi tệp ruy-băng chuẩn trước khi ruy-băng được tải và đặt lại nó trước khi đóng sổ làm việc. Đặt lại dải băng là cần thiết để nó không được hiển thị trong các sổ làm việc khác.
Roi-Kyi Bryant

3
Mã này ghi đè tất cả các tùy chỉnh ribbon hiện tại mà người dùng có thể đã thực hiện.
WizzleWuzzle

@WizzleWuzzle Nó không cần thiết. Ruy-băng có thể được nhập và phân tích cú pháp thành một đối tượng có thể được duyệt qua. Các phần tử mới sau đó có thể được thêm vào đối tượng. Kết quả có thể được lưu vào một tệp. Câu hỏi là làm thế nào để tạo một dải băng tùy chỉnh; không phải làm thế nào để sửa đổi một cái hiện có.
Roi-Kyi Bryant,

1
@ Roi-Kyi-Bryant Câu hỏi đặt ra là thêm một mục ribbon tùy chỉnh, không ghi đè lên toàn bộ ribbon tùy chỉnh hiện tại. Mã này ghi đè lên dải băng hiện tại.
WizzleWuzzle,

24

Tôi đã vật lộn như điên, nhưng đây thực sự là câu trả lời đúng. Đối với những gì nó đáng giá, những gì tôi đã bỏ lỡ là:

  1. Như những người khác nói, người ta không thể tạo dải băng CustomUI với VBA, tuy nhiên , bạn không cần phải làm thế!
  2. Ý tưởng là bạn tạo mã Ribbon xml của mình bằng cách sử dụng Tệp của Excel> Tùy chọn> Tùy chỉnh ruy-băng, sau đó xuất Ruy-băng thành tệp .customUI (nó chỉ là tệp txt, với xml trong đó)
  3. Bây giờ đến thủ thuật : bạn có thể đưa mã .customUI vào tệp .xlsm của mình bằng công cụ MS mà họ đề cập đến ở đây, bằng cách sao chép mã từ tệp .customUI
  4. Khi nó được bao gồm trong tệp .xlsm, mỗi khi bạn mở nó, dải băng bạn đã xác định sẽ được thêm vào dải băng của người dùng - nhưng nếu sử dụng <ribbon startFromScratch = "false"> hoặc bạn sẽ mất phần còn lại của dải băng. Khi thoát khỏi sổ làm việc, dải băng sẽ bị xóa.
  5. Từ đây, thật đơn giản, hãy tạo dải băng của bạn, sao chép mã xml dành riêng cho dải băng của bạn từ tệp .customUI và đặt nó trong một trình bao bọc như được hiển thị ở trên (... <tabs> xml của bạn </ tab .. .)

Nhân tiện, trang giải thích điều đó trên trang của Ron hiện có tại http://www.rondebruin.nl/win/s2/win002.htm

Và đây là ví dụ của anh ấy về cách bạn bật / tắt các nút trên Ribbon http://www.rondebruin.nl/win/s2/win013.htm

Đối với các ví dụ xml khác về dải ruy băng, vui lòng xem http://msdn.microsoft.com/en-us/library/office/aa338202%28v=office.12%29.aspx


2
Vẫn (5 năm sau) câu trả lời tốt nhất theo ý kiến ​​của tôi và có lẽ OP @BuZz muốn làm mới bài đăng gốc, ít nhất là chỉ đến câu trả lời này (?). Tôi hầu như không tìm thấy nó vì nó nằm ở cuối một danh sách các câu trả lời khá dài.
Chri.s

18

Các câu trả lời ở đây dành riêng cho việc sử dụng Trình chỉnh sửa giao diện người dùng tùy chỉnh. Tôi đã dành một khoảng thời gian để tạo giao diện mà không có chương trình tuyệt vời đó, vì vậy tôi đang ghi lại giải pháp ở đây để giúp bất kỳ ai khác quyết định xem họ có cần trình chỉnh sửa giao diện người dùng tùy chỉnh đó hay không.

Tôi đã xem qua trang web trợ giúp sau của Microsoft - https://msdn.microsoft.com/en-us/library/office/ff861787.aspx . Điều này cho thấy cách thiết lập giao diện theo cách thủ công, nhưng tôi đã gặp một số rắc rối khi trỏ đến mã bổ trợ tùy chỉnh của mình.

Để các nút hoạt động với macro tùy chỉnh của bạn, hãy thiết lập macro trong đăng ký .xlam của bạn để được gọi như được mô tả trong câu trả lời SO này - Gọi macro excel từ ruy-băng . Về cơ bản, bạn sẽ cần thêm thông số "control As IRibbonControl" đó vào bất kỳ mô-đun nào được trỏ từ ribbon xml của bạn. Ngoài ra, ribbon xml của bạn phải có cú pháp onAction = "myaddin! Mymodule.mysub" để gọi đúng bất kỳ mô-đun nào được tải bởi phần bổ sung.

Bằng cách sử dụng các hướng dẫn đó, tôi đã có thể tạo phần bổ sung excel (tệp .xlam) có tab tùy chỉnh được tải khi VBA của tôi được tải vào Excel cùng với phần bổ sung. Các nút thực thi mã từ phần bổ sung và tab tùy chỉnh gỡ cài đặt khi Tôi xóa phần bổ sung.


1
Điều này phù hợp với những người không có tất cả các công cụ phát triển. Cảm ơn vì giải pháp "đơn giản"
Evan

2
Tôi đã từng dạy các sinh viên lập trình năm thứ hai của mình phương pháp này, nhưng cuối cùng nhận thấy rằng việc sử dụng công cụ CustomUI đơn giản là ít phức tạp hơn nếu bạn có thể truy cập nó.
Rick Henderson

8

Ngoài câu trả lời Roi-Kyi Bryant, mã này hoàn toàn hoạt động trong Excel 2010. Nhấn ALT + F11 và trình chỉnh sửa VBA sẽ bật lên. Nhấp đúp vào ThisWorkbookbên trái, sau đó dán mã này:

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

Đừng quên lưu và mở lại sổ làm việc. Hi vọng điêu nay co ich!


Làm thế nào bạn sẽ vượt qua các đối số với điều này? Tôi đã sử dụng điều này, nhưng không thể tìm thấy cách chuyển đối số.
jDave1984 09/09

Sử dụng câu trả lời của tôi, bạn sẽ thêm một danh sách đối số vào từng quy trình con Giống như LoadCustomRibbon (tabName là String, groupName là String, btnName là String). Sau đó, gọi các quy trình phụ đó ở nơi thích hợp như @Erikas đã chỉ ra.
Roi-Kyi Bryant

6

Tôi đã gặp khó khăn với giải pháp của Roi-Kyi Bryant khi nhiều phần bổ trợ cố gắng sửa đổi dải băng. Tôi cũng không có quyền truy cập quản trị trên máy tính làm việc của mình, điều này đã loại trừ việc cài đặt Custom UI Editor. Vì vậy, nếu bạn ở cùng thuyền với tôi, đây là một ví dụ thay thế để tùy chỉnh dải băng chỉ bằng Excel. Lưu ý, giải pháp của tôi có nguồn gốc từ hướng dẫn của Microsoft .


  1. Tạo tệp / tệp Excel có dải băng bạn muốn tùy chỉnh. Trong trường hợp của tôi, tôi đã tạo hai .xlamtệp Chart Tools.xlamPriveleged UDFs.xlamđể chứng minh cách nhiều phần bổ trợ có thể tương tác với Ribbon.
  2. Tạo một thư mục, với bất kỳ tên thư mục nào, cho mỗi tệp bạn vừa tạo.
  3. Bên trong mỗi thư mục bạn đã tạo, hãy thêm một customUI_relsthư mục.
  4. Bên trong mỗi customUIthư mục, hãy tạo một customUI.xmltệp. Các customUI.xmlchi tiết hồ sơ như thế nào Excel tập tin tương tác với các ribbon. Phần 2 của hướng dẫn Microsoft bao gồm các phần tử trong customUI.xmltệp.

customUI.xmlTệp của tôi cho Chart Tools.xlamtrông giống như thế này

<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.xmlTệp của tôi cho Priveleged UDFs.xlamtrông giống như thế này

<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. Đối với mỗi tệp bạn đã tạo ở Bước 1, đặt hậu tố a .zipvào tên tệp của chúng. Trong trường hợp của tôi, tôi đổi tên Chart Tools.xlamđể Chart Tools.xlam.zip, và Privelged UDFs.xlamđể Priveleged UDFs.xlam.zip.
  2. Mở từng .ziptệp và điều hướng đến _relsthư mục. Sao chép .relstệp vào _relsthư mục bạn đã tạo ở Bước 3. Chỉnh sửa từng .rels tệp bằng trình soạn thảo văn bản. Từ hướng dẫn của Microsoft

Giữa <Relationship>phần tử cuối cùng và phần tử đóng <Relationships>, hãy thêm một dòng tạo mối quan hệ giữa tệp tài liệu và tệp tùy chỉnh. Đảm bảo rằng bạn chỉ định chính xác tên thư mục và tệp.

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

.relsTệp của tôi cho Chart Tools.xlamtrông giống như thế này

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

.relsTệp của tôi cho Priveleged UDFstrông giống như thế này.

<?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. Thay thế các .relstệp trong mỗi .ziptệp bằng .relstệp / tệp bạn đã sửa đổi ở bước trước.
  2. Sao chép và dán .customUIthư mục bạn đã tạo vào thư mục chính của .ziptệp / tệp.
  3. Xóa .zipphần mở rộng tệp khỏi tệp Excel bạn đã tạo .
  4. Nếu bạn đã tạo .xlamtệp, trở lại Excel, hãy thêm chúng vào phần bổ trợ Excel của bạn.
  5. Nếu có thể, hãy tạo lệnh gọi lại trong mỗi phần bổ trợ của bạn. Trong Bước 4, có onActioncác từ khóa trong các nút của tôi. Các onActiontừ khóa chỉ ra rằng, khi các yếu tố chứa được kích hoạt, ứng dụng Excel sẽ kích hoạt các tiểu thường xuyên bọc trong dấu ngoặc kép trực tiếp sau khi các onActiontừ khóa. Đây được gọi là một cuộc gọi lại . Trong .xlamcác tệp của mình , tôi có một mô-đun được gọi là CallBacksnơi tôi đã bao gồm các quy trình con gọi lại của mình.

Mô-đun CallBacks

CallBacksMô-đun của tôi Chart Tools.xlamtrông giống như

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

CallBacksMô-đun của tôi Priveleged UDFs.xlamtrông giống như

Tùy chọn rõ ràng

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

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

Các phần tử khác nhau có một chữ ký phụ quy trình gọi lại khác nhau. Đối với các nút, tham số quy trình phụ bắt buộc là ByRef control As IRibbonControl. Nếu bạn không tuân theo chữ ký gọi lại được yêu cầu, bạn sẽ gặp lỗi khi biên dịch dự án / dự án VBA của mình. Phần 3 của hướng dẫn Microsoft xác định tất cả các chữ ký gọi lại.


Đây là ví dụ đã hoàn thành của tôi trông như thế nào

Sản phẩm hoàn thiện


Một số mẹo đóng cửa

  1. Nếu bạn muốn phần bổ trợ chia sẻ các phần tử Ruy-băng, hãy sử dụng từ khóa idQxlmns:. Trong ví dụ của tôi, Chart Tools.xlamPriveleged UDFs.xlamcả hai đều có quyền truy cập vào các phần tử với idQ's bằng x:chartToolsTabx:privelgedUDFsTab. Để điều này hoạt động, điều x:này là bắt buộc và, tôi đã xác định không gian tên của nó trong dòng đầu tiên của customUI.xmltệp của tôi <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" xmlns:x="sao">,. Phần Hai cách để tùy chỉnh giao diện người dùng Fluent trong hướng dẫn của Microsoft cung cấp thêm một số chi tiết.
  2. Nếu bạn muốn phần bổ trợ truy cập các phần tử Ruy-băng được vận chuyển cùng với Excel, hãy sử dụng isMSOtừ khóa. Phần Hai cách để tùy chỉnh giao diện người dùng Fluent trong hướng dẫn của Microsoft cung cấp thêm một số chi tiết.

0

Một cách tiếp cận khác cho việc này là tải xuống mô-đun lớp Open XML miễn phí của Jan Karel Pieterse từ trang này: Chỉnh sửa các phần tử trong tệp OpenXML bằng VBA

Với điều này được thêm vào dự án VBA của bạn, bạn có thể giải nén tệp Excel, sử dụng VBA để sửa đổi XML, sau đó sử dụng lớp để giải nén tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.