Sơ lược về tự tạo menu custom ribbon Excel 2010, 2013, 2016

Liên hệ QC

Maika8008

Thành viên gạo cội
Tham gia
12/6/20
Bài viết
4,764
Được thích
5,724
Donate (Momo)
Donate
Giới tính
Nam
Việc tạo custom ribbon menu trên GPE đã có từ lâu và đã có nhiều công cụ được các thành viên viết ra để hỗ trợ cú pháp, tìm tên icon và tất nhiên là có cả cách làm được nhiều thành viên khác trình bày trong phần bình luận. Tuy nhiên không dễ gì nắm bắt được 1 cách cơ bản việc tạo ra nó như thế nào, để từ đó làm nền tảng cho việc tùy biến, chỉnh sửa phù hợp với nhu cầu từng người. Việc có 1 cái menu đẹp và gọn gàng cho file của mình tuy cũng hơi phù phiếm nhưng cũng mang lại sự thu hút đáng kể đối với mọi người, cũng hay hay ấy chứ nhề.

Có 2 cách làm:
I- Cách 1- Dùng VBA: dễ làm, dùng với những menu đơn giản, dành cho những ai không thích rối rắm hoặc không rành lắm, có code sẵn đấy sửa lại tí là xong.
Dùng VBA có nhược điểm là khá hạn chế trong việc hỗ trợ gõ dấu tiếng Việt. Một số nguyên âm có dấu như ồ, ố, ổ, ệ, ị, ớ… không thể gõ dấu được. Gặp mấy chữ này thì đành chừa dấu lại hoặc xử lý tình thế như ồ thay bằng ô` , ớ thay bằng ơ’ , Thôi vào đề luôn.

UPDATE: vụ này là do tôi hạn chế --=0 chưa nghiên cứu tới chứ giải pháp đã có từ lâu. Dựa vào mã số ký tự unicode để mã hóa các nguyên âm có dấu, từ đó code sẽ viết vào file hiển thị caption của menu. Ví dụ chữ ổ được viết lại thành ổ
Anh em dùng hàm ở bài #2 để lấy mã tiếng Việt cho ribbon nhé!

1. Trước tiên cần tạo 2 sự kiện Workbook như sau để tạo và xóa ribbon khi mở và đóng file
PHP:
Private Sub Workbook_Open()
    CreateRibbon
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ClearRibbon
End Sub
2. Tiếp đến, cẩn thận từng dòng cho sub tạo ribbon:
PHP:
Private Sub Workbook_Open()
    CreateRibbon
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ClearRibbon
End Sub
2. Cẩn thận từng dòng cho sub tạo ribbon:
Sub CreateRibbon()
Dim hFile As Long
Dim path As String, fileName As String, ribnXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribnXML = "<mso:customUI    xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>" & vbNewLine
ribnXML = ribnXML + "  <mso:ribbon>" & vbNewLine
ribnXML = ribnXML + "    <mso:qat/>" & vbNewLine
ribnXML = ribnXML + "    <mso:tabs>" & vbNewLine
ribnXML = ribnXML + "      <mso:tab id=' CustomTab ' label='Hoat dong cua toi'  >" & vbNewLine

ribnXML = ribnXML + "        <mso:group id='GiaiTri' label='Giai tri' autoScale='true'>" & vbNewLine
ribnXML = ribnXML + "          <mso:button id=' NgheNhac ' label= 'Nghe Nhac ' " & vbNewLine
ribnXML = ribnXML + "imageMso='ListNumFieldInsert'      onAction='Goto_Nhac'/>" & vbNewLine
ribnXML = ribnXML + "          <mso:button id='XemPhim' label='Xem phim' " & vbNewLine
ribnXML = ribnXML + "imageMso='ListSetNumberingValue'      onAction='Goto_Phim'/>" & vbNewLine
ribnXML = ribnXML + "        </mso:group>" & vbNewLine

ribnXML = ribnXML + "      </mso:tab>" & vbNewLine
ribnXML = ribnXML + "    </mso:tabs>" & vbNewLine
ribnXML = ribnXML + "  </mso:ribbon>" & vbNewLine
ribnXML = ribnXML + "</mso:customUI>"

ribnXML = Replace(ribnXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribnXML
Close hFile
End Sub
Muốn gõ dấu, phải dùng bảng mã UTF-8 Literal của Unikey. Khi gõ nó ra như chữ tượng hình cứ kệ nó đi, lên menu thì OK. Gõ chữ nào nhảy ra dấu ? là không xong rồi, phải xử lý như trên đã nói.
Code ở trên chỉ là ví dụ cho 1 group và 2 button của nó. Cứ chép thêm dòng cần thiết xuống rồi chỉnh sửa lại, miễn sao cứ có <mso:group ABC chi đó> thì phải có <mso:button ... /> <mso:button ... /> và cuối cùng là </mso:group>
Chạy sub luôn để xem thành quả. Khi chỉnh sửa ngay trong phiên làm việc thì các label là có hiệu lực ngay, còn với imagemso phải đóng file rồi mở lại mới được.
3. Thêm sub xóa ribbon nữa là xong:
PHP:
Sub ClearRibbon()
Dim hFile As Long
Dim path As String, fileName As String, ribnXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribnXML = "<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, ribnXML
Close hFile
End Sub

II- Nạp và liên kết file xml ngoài:
Đây là cách cơ bản giải quyết được bài toán dấu tiếng Việt. Nó không cần bật VBA để hiện menu, chỉ cần mở file lên là có sẵn. Cách làm cơ bản như sau:
1. Mở file Excel .xlsm cần tạo menu, chép các macro để chạy khi bấm vào các công cụ trên menu. Có thể tạo sau cũng được nhưng nhất thiết các macro đó phải có đối số trong ngoặc, ví dụ:

Bình thường là Goto_sheet1() nhưng để chạy từ menu phải là Goto_sheet1(control As IribbonControl) và phải nhớ tên để điền vào file xml khi thiết kế.

Code hay dở thì tùy người nhưng theo lời khuyên của nhiều anh em có kinh nghiệm thì nên đặt ID trùng với tên sheet để dễ dàng lấy từ thuộc tính control.id dùng cho code. Đặt thêm thuộc tính Tag để dùng cho nhiều giải thuật khác nhau. File đính kèm bên dưới là 1 ví dụ rất hay.

2. Đổi đuôi file .xlsm thành .zip

3. Tạo 1 thư mục tên là customUI

4. Chạy NotePad++ mở 1 trang text mới, chép các dòng sau đây vào:
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
      <tab id="CustomTab" label="Hoạt động của tôi" >
          <group id="GiaiTri"
        label="Giải trí" >
         <button
        id="NgheNhac"
        label="Nghe nhạc"
        size="normal"
        onAction="Goto_Nhac"
        imageMso="ListNumFieldInsert" />
                   <button
        id="XemPhim"
        label="Xem phim"
        size="normal"
        onAction="Goto_Phim"
imageMso="ListNumFieldInsert" />
    </group>
  </tab>
</tabs>
</ribbon>
</customUI>
Đấy mới chỉ là code của 1 group gồm 2 buton. Cứ theo cú pháp như vậy để làm tiếp với lưu ý:

Id không được trùng nhau

Sau onAction= là tên macro

Sau imageMso= là tên các icon (thứ này tìm trên GPE, có file hỗ trợ)

5. Lưu trang text với tên là customUI14.xml vào thư mục customUI đã tạo ở bước 3 (chọn định dạng *.xml; *.xaml; *.xsl; *xslt; *.xsd; *.kml; *.wsdl; *.xlf; *.xliff; *.config… trong hộp Save as type).

6. Chuột phải vào thư mục customUI, chọn 7-zip -> Add to Archive -> Duyệt tìm file .zip tạo ở bước 2 -> Bấm OK để hoàn tất đưa cái thư mục customUI vào bên trong file .zip.

(Tôi không cài WinRAR nên không biết làm với RAR thế nào, nhưng 7-zip dùng tốt lại miễn phí do đó khuyến nghị nhân dịp này anh em nên cài 7-zip)

7. Chuột phải vào file .zip cần làm menu chọn 7-zip -> Open archive -> vào bên trong thư mục _rels, chuột phải vào .rels -> Edit -> Chép đoạn code sau thay thế cho code có sẵn trong file đó:
HTML:
<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml" Id="rId3" />
<Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml" Id="rId2" />
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml" Id="rId1" />
<Relationship Type="http://schemas.microsoft.com/office/2007/relationships/ui/extensibility" Target="customUI/customUI14.xml" Id="rId4" />
</Relationships>
8. Đóng file -> chọn Save để lưu lại -> chọn Yes để lưu file .zip -> Đóng cửa sổ 7-Zip.

9. Đổi đuôi file .zip trở lại thành .xlsm rồi mở lên xem thành quả.

10. Muốn thêm group, button vào menu, có 2 cách:

- Cách 1: hãy chuyển file lại thành zip rồi mở lên như ở bước 7 -> vào trong thư mục customUI -> chuột phải vào file customUI14.xml -> Edit -> chỉnh sửa trong đó hoặc copy dán vào -> Save -> Update file zip.

- Cách 2: Làm hoàn chỉnh code xml rồi mới tạo file customUI14.xml như ở bước 4 và 5.
Kỹ thuật làm menu nâng cao rất phong phú, anh em tự nghiên cứu đào sâu thêm. Hết rồi
 

File đính kèm

Lần chỉnh sửa cuối:
Bây giờ bạn hiểu chưa? Nếu hiểu thì cho tôi hỏi chổ Sub OnClickAction muốn dùng cho tất cả các control, chứ chẳng lẻ một control thì lại dùng một cái sub thì code dài quá. Nói thiệt bạn đừng giận chứ cái file Quản lý vật tư công nợ gì đó của bạn tôi chẳng học được gì từ cái Code tạo ribbon cả.
Hôm qua đến giờ thử nhưng bí chỗ này. Nó cương quyết không nhận đối số
 
Upvote 0
Bạn dùng control id làm đối số cho cái Sub/func tổng dùng chung.
Trong Sub này dùng Select Case controlID để viết lệnh thực hiện cho từng control.
Cách này là tạo ribbon bằng file xml không bàn tới (do tôi đã biết). Cái tôi cần tìm hiểu là tạo ribbon bằng code vba và gọi sub dựa vào id của control như bạn nói, nhưng hiện tại đang bị tịt, nếu mỗi control viết một sub thì thấy cách này chưa hay lắm, muốn dùng 1 sub chung cho mọi control. Nếu bạn biết có thể chỉ cho file cụ thể ở #20.
 
Upvote 0

Bác Maika8008 ơi cho em hỏi chút ạ: ở cách 1 em muốn thêm toggleButton thì làm thế nào ạ?​

 
Upvote 0
Upvote 0
hình ảnh_2021-11-08_143020.png
Mình làm theo cách làm file customUI14.xml đưa vào File. Khi ấn vào button để chạy macro thì bị báo lỗi như trên hình.
Mong các sư huynh giúp với ạ!
 
Upvote 0
1643526858800.png

Các bạn cho mình hỏi cái control trong hình ( phần khoanh đỏ) tên là gì? MÌnh đang cần tạo một cái có hình thức giống như vậy.
 
Upvote 0
View attachment 271865

Các bạn cho mình hỏi cái control trong hình ( phần khoanh đỏ) tên là gì? MÌnh đang cần tạo một cái có hình thức giống như vậy.
Nó là Gallery thì phải, nhưng tôi nhớ không nhầm thì không thể tạo được giống như hình (Do control này không được Word hổ trợ để tạo giống như cái mặc định của nó) mà chỉ tạo như đường link phía dưới thôi.
 
Upvote 0
Việc tạo custom ribbon menu trên GPE đã có từ lâu và đã có nhiều công cụ được các thành viên viết ra để hỗ trợ cú pháp, tìm tên icon và tất nhiên là có cả cách làm được nhiều thành viên khác trình bày trong phần bình luận. Tuy nhiên không dễ gì nắm bắt được 1 cách cơ bản việc tạo ra nó như thế nào, để từ đó làm nền tảng cho việc tùy biến, chỉnh sửa phù hợp với nhu cầu từng người. Việc có 1 cái menu đẹp và gọn gàng cho file của mình tuy cũng hơi phù phiếm nhưng cũng mang lại sự thu hút đáng kể đối với mọi người, cũng hay hay ấy chứ nhề.

Có 2 cách làm:
I- Cách 1- Dùng VBA: dễ làm, dùng với những menu đơn giản, dành cho những ai không thích rối rắm hoặc không rành lắm, có code sẵn đấy sửa lại tí là xong.
Dùng VBA có nhược điểm là khá hạn chế trong việc hỗ trợ gõ dấu tiếng Việt. Một số nguyên âm có dấu như ồ, ố, ổ, ệ, ị, ớ… không thể gõ dấu được. Gặp mấy chữ này thì đành chừa dấu lại hoặc xử lý tình thế như ồ thay bằng ô` , ớ thay bằng ơ’ , Thôi vào đề luôn.

UPDATE: vụ này là do tôi hạn chế --=0 chưa nghiên cứu tới chứ giải pháp đã có từ lâu. Dựa vào mã số ký tự unicode để mã hóa các nguyên âm có dấu, từ đó code sẽ viết vào file hiển thị caption của menu. Ví dụ chữ ổ được viết lại thành &#7893;
Anh em dùng hàm ở bài #2 để lấy mã tiếng Việt cho ribbon nhé!

1. Trước tiên cần tạo 2 sự kiện Workbook như sau để tạo và xóa ribbon khi mở và đóng file
PHP:
Private Sub Workbook_Open()
    CreateRibbon
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ClearRibbon
End Sub
2. Tiếp đến, cẩn thận từng dòng cho sub tạo ribbon:
PHP:
Private Sub Workbook_Open()
    CreateRibbon
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ClearRibbon
End Sub
2. Cẩn thận từng dòng cho sub tạo ribbon:
Sub CreateRibbon()
Dim hFile As Long
Dim path As String, fileName As String, ribnXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribnXML = "<mso:customUI    xmlns:mso='http://schemas.microsoft.com/office/2009/07/customui'>" & vbNewLine
ribnXML = ribnXML + "  <mso:ribbon>" & vbNewLine
ribnXML = ribnXML + "    <mso:qat/>" & vbNewLine
ribnXML = ribnXML + "    <mso:tabs>" & vbNewLine
ribnXML = ribnXML + "      <mso:tab id=' CustomTab ' label='Hoat dong cua toi'  >" & vbNewLine

ribnXML = ribnXML + "        <mso:group id='GiaiTri' label='Giai tri' autoScale='true'>" & vbNewLine
ribnXML = ribnXML + "          <mso:button id=' NgheNhac ' label= 'Nghe Nhac ' " & vbNewLine
ribnXML = ribnXML + "imageMso='ListNumFieldInsert'      onAction='Goto_Nhac'/>" & vbNewLine
ribnXML = ribnXML + "          <mso:button id='XemPhim' label='Xem phim' " & vbNewLine
ribnXML = ribnXML + "imageMso='ListSetNumberingValue'      onAction='Goto_Phim'/>" & vbNewLine
ribnXML = ribnXML + "        </mso:group>" & vbNewLine

ribnXML = ribnXML + "      </mso:tab>" & vbNewLine
ribnXML = ribnXML + "    </mso:tabs>" & vbNewLine
ribnXML = ribnXML + "  </mso:ribbon>" & vbNewLine
ribnXML = ribnXML + "</mso:customUI>"

ribnXML = Replace(ribnXML, """", "")

Open path & fileName For Output Access Write As hFile
Print #hFile, ribnXML
Close hFile
End Sub
Muốn gõ dấu, phải dùng bảng mã UTF-8 Literal của Unikey. Khi gõ nó ra như chữ tượng hình cứ kệ nó đi, lên menu thì OK. Gõ chữ nào nhảy ra dấu ? là không xong rồi, phải xử lý như trên đã nói.
Code ở trên chỉ là ví dụ cho 1 group và 2 button của nó. Cứ chép thêm dòng cần thiết xuống rồi chỉnh sửa lại, miễn sao cứ có <mso:group ABC chi đó> thì phải có <mso:button ... /> <mso:button ... /> và cuối cùng là </mso:group>
Chạy sub luôn để xem thành quả. Khi chỉnh sửa ngay trong phiên làm việc thì các label là có hiệu lực ngay, còn với imagemso phải đóng file rồi mở lại mới được.
3. Thêm sub xóa ribbon nữa là xong:
PHP:
Sub ClearRibbon()
Dim hFile As Long
Dim path As String, fileName As String, ribnXML As String, user As String

hFile = FreeFile
user = Environ("Username")
path = "C:\Users\" & user & "\AppData\Local\Microsoft\Office\"
fileName = "Excel.officeUI"

ribnXML = "<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, ribnXML
Close hFile
End Sub

II- Nạp và liên kết file xml ngoài:
Đây là cách cơ bản giải quyết được bài toán dấu tiếng Việt. Nó không cần bật VBA để hiện menu, chỉ cần mở file lên là có sẵn. Cách làm cơ bản như sau:
1. Mở file Excel .xlsm cần tạo menu, chép các macro để chạy khi bấm vào các công cụ trên menu. Có thể tạo sau cũng được nhưng nhất thiết các macro đó phải có đối số trong ngoặc, ví dụ:

Bình thường là Goto_sheet1() nhưng để chạy từ menu phải là Goto_sheet1(control As IribbonControl) và phải nhớ tên để điền vào file xml khi thiết kế.

Code hay dở thì tùy người nhưng theo lời khuyên của nhiều anh em có kinh nghiệm thì nên đặt ID trùng với tên sheet để dễ dàng lấy từ thuộc tính control.id dùng cho code. Đặt thêm thuộc tính Tag để dùng cho nhiều giải thuật khác nhau. File đính kèm bên dưới là 1 ví dụ rất hay.

2. Đổi đuôi file .xlsm thành .zip

3. Tạo 1 thư mục tên là customUI

4. Chạy NotePad++ mở 1 trang text mới, chép các dòng sau đây vào:
Mã:
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
      <tab id="CustomTab" label="Hoạt động của tôi" >
          <group id="GiaiTri"
        label="Giải trí" >
         <button
        id="NgheNhac"
        label="Nghe nhạc"
        size="normal"
        onAction="Goto_Nhac"
        imageMso="ListNumFieldInsert" />
                   <button
        id="XemPhim"
        label="Xem phim"
        size="normal"
        onAction="Goto_Phim"
imageMso="ListNumFieldInsert" />
    </group>
  </tab>
</tabs>
</ribbon>
</customUI>
Đấy mới chỉ là code của 1 group gồm 2 buton. Cứ theo cú pháp như vậy để làm tiếp với lưu ý:

Id không được trùng nhau

Sau onAction= là tên macro

Sau imageMso= là tên các icon (thứ này tìm trên GPE, có file hỗ trợ)

5. Lưu trang text với tên là customUI14.xml vào thư mục customUI đã tạo ở bước 3 (chọn định dạng *.xml; *.xaml; *.xsl; *xslt; *.xsd; *.kml; *.wsdl; *.xlf; *.xliff; *.config… trong hộp Save as type).

6. Chuột phải vào thư mục customUI, chọn 7-zip -> Add to Archive -> Duyệt tìm file .zip tạo ở bước 2 -> Bấm OK để hoàn tất đưa cái thư mục customUI vào bên trong file .zip.

(Tôi không cài WinRAR nên không biết làm với RAR thế nào, nhưng 7-zip dùng tốt lại miễn phí do đó khuyến nghị nhân dịp này anh em nên cài 7-zip)

7. Chuột phải vào file .zip cần làm menu chọn 7-zip -> Open archive -> vào bên trong thư mục _rels, chuột phải vào .rels -> Edit -> Chép đoạn code sau thay thế cho code có sẵn trong file đó:
HTML:
<?xml version="1.0" encoding="utf-8"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml" Id="rId3" />
<Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml" Id="rId2" />
<Relationship Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="xl/workbook.xml" Id="rId1" />
<Relationship Type="http://schemas.microsoft.com/office/2007/relationships/ui/extensibility" Target="customUI/customUI14.xml" Id="rId4" />
</Relationships>
8. Đóng file -> chọn Save để lưu lại -> chọn Yes để lưu file .zip -> Đóng cửa sổ 7-Zip.

9. Đổi đuôi file .zip trở lại thành .xlsm rồi mở lên xem thành quả.

10. Muốn thêm group, button vào menu, có 2 cách:

- Cách 1: hãy chuyển file lại thành zip rồi mở lên như ở bước 7 -> vào trong thư mục customUI -> chuột phải vào file customUI14.xml -> Edit -> chỉnh sửa trong đó hoặc copy dán vào -> Save -> Update file zip.

- Cách 2: Làm hoàn chỉnh code xml rồi mới tạo file customUI14.xml như ở bước 4 và 5.
Kỹ thuật làm menu nâng cao rất phong phú, anh em tự nghiên cứu đào sâu thêm. Hết rồi
Em làm theo cách 1 gặp báo lỗi 2 dòng bên dưới làm sao để sửa ạ?
Open path & fileName For Output Access Write As hFile
Print #hFile, ribnXML

'Print #hFile, ribnXML
 
Upvote 0
@Doãn Quốc Bình Bạn tham khảo thêm công cụ này xem sao

 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom