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,762
Được thích
5,716
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

  • EnableDisableTest.xlsm
    26.2 KB · Đọc: 123
Lần chỉnh sửa cuối:
Tham khảo code bài số 7 để viết tiếng Việt cho Ribbon Excel... code bài đó nó hổ trợ cho cả VB6 + Delphi 7 về trước + cái gì mà ko hổ trợ Unicode cho menu Ribbon khi viết trong ( VBE ) thực hiện nó dễ hơn

Mạnh copy code bài đó viết lại như sau

Mã:
Public Function RibbonTV(ByVal myText As String) As String
    Dim i As Long, myWord As Long
    For i = 1 To Len(myText)
        myWord = AscW(Mid$(myText, i, 1))
        If myWord < &H80 Then
            RibbonTV = RibbonTV & Chr$(myWord)
        Else
            RibbonTV = RibbonTV & "&#" & myWord & ";"
        End If
    Next i
End Function

Thực hiện
A1 = Kiều Mạnh
A2 = RibbonTV(A1)
Xong lấy cái A2 mà cho vào VBE là xong khỏi phải lo xử lý dấu tiếng việt
 
Upvote 0
Tham khảo code bài số 7 để viết tiếng Việt cho Ribbon Excel... code bài đó nó hổ trợ cho cả VB6 + Delphi 7 về trước + cái gì mà ko hổ trợ Unicode cho menu Ribbon khi viết trong ( VBE ) thực hiện nó dễ hơn

Mạnh copy code bài đó viết lại như sau

Mã:
Public Function RibbonTV(ByVal myText As String) As String
    Dim i As Long, myWord As Long
    For i = 1 To Len(myText)
        myWord = AscW(Mid$(myText, i, 1))
        If myWord < &H80 Then
            RibbonTV = RibbonTV & Chr$(myWord)
        Else
            RibbonTV = RibbonTV & "&#" & myWord & ";"
        End If
    Next i
End Function

Thực hiện
A1 = Kiều Mạnh
A2 = RibbonTV(A1)
Xong lấy cái A2 mà cho vào VBE là xong khỏi phải lo xử lý dấu tiếng việt
Chắc chưa nghiên cứu tới. Với code trong bài, đã thử lấy trên cell nhưng vẫn lỗi.
 
Upvote 0
MÌnh xài cho VBA + VB6 + Delphi rất tốt ... còn lỗi gì keo vậy là chịu
Lỗi trong code của cái bài tôi viết khi chưa biết vụ mã hóa &#7879; này thôi bạn. Để tôi sửa lại cái hàm mà tôi có rồi cập nhật lại bài viết. Cảm ơn bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Về cách đặt tên cho thuộc tính Tag để phục vụ cho giải thuật, file demo đính kèm bài #1 viết có mã xml cho menu như sau:
HTML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customUI onLoad="RibbonOnLoad" xmlns="http://schemas.microsoft.com/office/2006/01/customui">

  <ribbon>
    <tabs>

      <tab idMso="TabHome" >

        <group id="MyCustomGroup1" label="Group1" tag="MyPersonalGroup1" >
          <button id="G1B1" label="Caption 1" size="normal" onAction="Macro1" imageMso="DirectRepliesTo"
         tag="Group1Button1" getEnabled="GetEnabledMacro"/>
          <button id="G1B2" label="Caption 2" size="normal" onAction="Macro2" imageMso="AccountMenu"
        tag="Group1Button2" getEnabled="GetEnabledMacro"/>
          <button id="G1B3" label="Caption 3" size="normal" onAction="Macro3" imageMso="RegionLayoutMenu"
        tag="Group1Button3" getEnabled="GetEnabledMacro"/>
          </group>

        <group id="MyCustomGroup2" label="Group2" tag="MyPersonalGroup2" >
          <button id="G2B1" label="Caption 1" size="normal" onAction="Macro4" imageMso="DirectRepliesTo"
         tag="Group2Button1" getEnabled="GetEnabledMacro"/>
          <button id="G2B2" label="Caption 2" size="normal" onAction="Macro5" imageMso="AccountMenu"
        tag="Group2Button2" getEnabled="GetEnabledMacro"/>
          <button id="G2B3" label="Caption 3" size="normal" onAction="Macro6" imageMso="RegionLayoutMenu"
        tag="Group2Button3" getEnabled="GetEnabledMacro"/>
          </group>

    </tab>

    </tabs>
  </ribbon>
</customUI>
- Đặt tên cho 6 nút gồm 2 nhóm
+ Nhóm 1: Group1Button1, Group1Button2, Group1Button3
+ Nhóm 2: Group2Button1, Group2Button2, Group2Button3
- Khi cần Enable hay Disable đối tượng nào thì lấy thông tin để xử lý bằng ký tự đại diện * hoặc ?
Ví dụ:
- Cần xử lý nhóm 1 thì dùng Group1* , nhóm 2 thì Group2*
- Cần riêng button1 của cả nhóm 1 và 2 thì dùng Group?Button1
- Cần tất cả thì dùng *
- Không cần tất cả thì dùng "" (rỗng)
...

Xử lý việc đó, dùng thuộc tính getEnabled="Tên macro xử lý"
 
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='Hoạt động của tôi'  >" & vbNewLine

ribnXML = ribnXML + "        <mso:group id='GiaiTri' label='Giải trí' autoScale='true'>" & vbNewLine
ribnXML = ribnXML + "          <mso:button id=' NgheNhac ' label= 'Nghe Nhạc ' " & 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
Bạn cho 1 Demo về Cách 1- Dùng VBA để mình học hỏi với. Cách này trước kia có nghiên cứu nhưng thấy nó chưa đáp ứng yêu cầu của mình, nay thấy bạn đăng chắc có có nghiên cứu nhiều về nó nên xin tham khảo. Còn việc hiển thị tiếng việt Unicode thì bạn dùng FileSystemObject để ghi dữ liệu ra file là được chứ gì.
Đặc biệt là cái onAction lấy tên nút lệnh đang Click vào.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn cho 1 Demo về Cách 1- Dùng VBA để mình học hỏi với. Cách này trước kia có nghiên cứu nhưng thấy nó chưa đáp ứng yêu cầu của mình, nay thấy bạn đăng chắc có có nghiên cứu nhiều về nó nên xin tham khảo. Còn việc hiển thị tiếng việt Unicode thì bạn dùng FileSystemObject để ghi dữ liệu ra file là được chứ gì.
Đặc biệt là cái onAction lấy tên nút lệnh đang Click vào.
Tôi cũng mới bập vào menu để làm cái file tôi đã đăng ở thớt này https://www.giaiphapexcel.com/diend...àng-và-công-nợ-khách-hàng.151557/#post-988007
Code ở trong module Menubar. Muốn chuyên sâu hoặc tìm công cụ hỗ trợ thì bạn vào link ở bài #2
 
Upvote 0
Tôi cũng mới bập vào menu để làm cái file tôi đã đăng ở thớt này https://www.giaiphapexcel.com/diendan/threads/tặng-tiếp-anh-em-file-quản-lý-vật-tư-công-nợ-nhập-xuất-kho-hàng-và-công-nợ-khách-hàng.151557/#post-988007
Code ở trong module Menubar. Muốn chuyên sâu hoặc tìm công cụ hỗ trợ thì bạn vào link ở bài #2
Chủ đề này mà bạn viết chỉ có vài bài và kết thúc thì thôi rồi. Nếu nói về Ribbon viết 50 trang cũng chưa đủ nửa. Bạn mới viết về button (Chưa đủ nội dung của button) thôi, nhưng Ribbon còn có:
Tab
ContextualTabs
Group
Label
DialogBox Launcher
Button
SplitButton
ToggleButton
ButtonGroups
Separator
CheckBox
EditBox
Combobox
DropDown
Gallery
Menu
..........
Mỗi một Control viết khoảng 5 trang không biết có đủ không nửa.
Tôi cũng định viết một chuyên đề về Ribbon nhưng thấy nó nhiều nội dung quá nên bỏ qua ý đồ.
 
Lần chỉnh sửa cuối:
Upvote 0
Chủ đề này mà bạn viết chỉ có vài bài và kết thúc thì thôi rồi. Nếu nói về Ribbon viết 50 trang cũng chưa đủ nửa. Bạn mới viết về button (Chưa đủ nội dung của button) thôi, nhưng Ribbon còn có:
Tab
Group
Label
Check Box
Menu
Combo Box
Spinner
Button
Toggle Button
Drop-Down Button
Split Button
Drop-Down Gallery
Split Button Gallery
Drop-Down Color Picker
..........
Mỗi một Control viết khoảng 5 trang không biết có đủ không nửa.
Tôi cũng định viết một chuyên đề về Ribbon nhưng thấy nó nhiều nội dung quá nên bỏ qua ý đồ.
Bạn có nhầm không? Bạn hỏi file demo, tôi chỉ link là file tôi làm thật, code thật luôn. Menu làm bằng VBA trong đó, bạn làm gì tùy thích (tôi viết là: Tôi cũng mới bập vào menu để làm cái file tôi đã đăng ở thớt này -> link)

Còn câu cuối của tôi là: Muốn chuyên sâu hoặc tìm công cụ hỗ trợ thì bạn vào link ở bài #2 -> thì bạn vào bài #2 của thớt này nè, bấm vào cái link của Kiều Mạnh đó mà tham khảo
 
Upvote 0
Bạn có nhầm không? Bạn hỏi file demo, tôi chỉ link là file tôi làm thật, code thật luôn. Menu làm bằng VBA trong đó, bạn làm gì tùy thích (tôi viết là: Tôi cũng mới bập vào menu để làm cái file tôi đã đăng ở thớt này -> link)

Còn câu cuối của tôi là: Muốn chuyên sâu hoặc tìm công cụ hỗ trợ thì bạn vào link ở bài #2 -> thì bạn vào bài #2 của thớt này nè, bấm vào cái link của Kiều Mạnh đó mà tham khảo
Tôi không nhầm, cái tôi muốn là cái onAction phải cùng một tên cho tất cả các control luôn chứ sau mỗi control lại một cái sub onAction (Các sub đều có chung chức năng Sheet Activate) khác nhau vậy? Trong khi nếu dùng cách Nạp và liên kết file xml ngoài này thì chỉ dùng một cái sub onAction để dùng chung cho mọi control.
Tôi thấy cách dùng VBA để tạo Ribbon thì được cái là thêm control dễ dàng, nhưng code thì bị động. Cụ thể trong file của bạn (Link) khi thêm sheet gì đó thì phải sửa code, trong khi nếu làm theo cách thứ 2 (Nạp và liên kết file xml ngoài) thì không cần sửa code.
Bạn có thể xem file mẫu tôi tạo ở link sau tạo Ribbon theo cách thứ 2 (Nạp và liên kết file xml ngoài) cho dù có thêm đối tượng nhưng code không cần phải sửa mà vẫn chạy ngon lành.
Tôi hỏi ở chủ đề này là muốn tìm hiểu thêm cách tạo Ribbon bằng code mà chỉ sử dụng một cái sub cho OnAction thôi cho dù có thêm đối tượng (Ở đây là sheet mới) thì nó vẫn hiển thị trên Ribbon luôn.
 
Upvote 0
Tôi không nhầm, cái tôi muốn là cái onAction phải cùng một tên cho tất cả các control luôn chứ sau mỗi control lại một cái sub onAction (Các sub đều có chung chức năng Sheet Activate) khác nhau vậy? Trong khi nếu dùng cách Nạp và liên kết file xml ngoài này thì chỉ dùng một cái sub onAction để dùng chung cho mọi control.
Tôi thấy cách dùng VBA để tạo Ribbon thì được cái là thêm control dễ dàng, nhưng code thì bị động. Cụ thể trong file của bạn (Link) khi thêm sheet gì đó thì phải sửa code, trong khi nếu làm theo cách thứ 2 (Nạp và liên kết file xml ngoài) thì không cần sửa code.
Bạn có thể xem file mẫu tôi tạo ở link sau tạo Ribbon theo cách thứ 2 (Nạp và liên kết file xml ngoài) cho dù có thêm đối tượng nhưng code không cần phải sửa mà vẫn chạy ngon lành.
Tôi hỏi ở chủ đề này là muốn tìm hiểu thêm cách tạo Ribbon bằng code mà chỉ sử dụng một cái sub cho OnAction thôi cho dù có thêm đối tượng (Ở đây là sheet mới) thì nó vẫn hiển thị trên Ribbon luôn.
Cái bạn cần là chủ đề custom ribbon lập ra từ 2015 mà bạn Kiều Mạnh bài #2 góp phần nhiều trong đó. Bạn vào đó tham khảo và thảo luận chứ ở đây mấy người có kinh nghiệm nói vào làm gì nữa.

Luôn phải sửa code chứ. Xml ngoài lại càng phải sửa. Mà menu thiết kế ra để dùng cho 1 ứng dụng đã định hình. Sao có chuyện phải thêm sheet? Giống như file vật tư công nợ của tôi, người ta nhập liệu rồi xem báo cáo, di chuyển giữa các sheet đã thiết kế, chứ thêm sheet nữa làm gì?
Còn ai tùy biến được thì việc thêm 1 vài dòng code để mở rộng menu là việc tất yếu phải làm và làm bằng tay.
 
Upvote 0
Luôn phải sửa code chứ. Xml ngoài lại càng phải sửa. Mà menu thiết kế ra để dùng cho 1 ứng dụng đã định hình. Sao có chuyện phải thêm sheet?
Bạn lại không hiểu ý tôi, ở đây thêm sheet là ví dụ thôi. Thêm ở đây là đối tượng bất kỳ tôi là ví dụ thêm sheet cho bạn dễ hiểu thôi. Giả sử ứng dụng của tôi là di chuyển đến sheet bất kỳ trong các file đang mở. Vậy vấn đề nảy sinh là nếu trong file của người dùng đang mở có 10 sheet thì trên ribbon có 10 nút lệnh, trên file người dùng có 5 sheet thì trên ribbon có 5 nút lệnh. Nếu làm trên file xml thì quá đơn giản còn dùng code vba để tạo nút lệnh như vậy thì phải làm sao.
Tôi thấy bạn có đề cập đến tạo ribbon bằng code tôi thấy tiện lợi nên định xin file tham khảo thôi chứ tôi đâu có nói mình không biết tạo ribbon băng file xml khi nào đâu.
À mà chuyện file xml ngoài càng phải sửa là phát biểu sai nhé.
 
Upvote 0
Bạn lại không hiểu ý tôi, ở đây thêm sheet là ví dụ thôi. Thêm ở đây là đối tượng bất kỳ tôi là ví dụ thêm sheet cho bạn dễ hiểu thôi. Giả sử ứng dụng của tôi là di chuyển đến sheet bất kỳ trong các file đang mở. Vậy vấn đề nảy sinh là nếu trong file của người dùng đang mở có 10 sheet thì trên ribbon có 10 nút lệnh, trên file người dùng có 5 sheet thì trên ribbon có 5 nút lệnh. Nếu làm trên file xml thì quá đơn giản còn dùng code vba để tạo nút lệnh như vậy thì phải làm sao.
Tôi thấy bạn có đề cập đến tạo ribbon bằng code tôi thấy tiện lợi nên định xin file tham khảo thôi chứ tôi đâu có nói mình không biết tạo ribbon băng file xml khi nào đâu.
À mà chuyện file xml ngoài càng phải sửa là phát biểu sai nhé.
Bạn lấy code trong file vật tư công nợ của tôi trong link tôi dẫn đó. Tôi nói code ở trong đó mà bạn cứ chú ý đâu đâu vây?
 
Upvote 0
Cách 1- Dùng VBA

sao mình làm theo cách này rồi mở file Excel vừa làm lên nó không có thay đổi gì hết bạn ơi.
 
Upvote 0
Cách 1- Dùng VBA

sao mình làm theo cách này rồi mở file Excel vừa làm lên nó không có thay đổi gì hết bạn ơi.
Bạn đưa file lên để tôi xem lỗi chỗ nào. Nó nhạy cảm lắm, chỉ cần 1 ký tự unicode sai là không chạy luôn nhưng lại không có cơ chế báo lỗi sai ở đâu
 
Upvote 0

File đính kèm

  • menu excel.xlsm
    16.2 KB · Đọc: 46
Upvote 0
Đọc lại mấy bình luận của bác @giaiphap, quả là tôi không hiểu bác chứ không phải là bác không hiểu tôi. Đọc trên di động và hơi vội di chuyển nên không hiểu. Bác bỏ quá cho!
 
Upvote 0
bạn xem giúp mình nhé. Cám ơn!
Do có nhiều nguyên âm unicode trong đó nên code không chạy, VD: tôi, giai trí , Bạn tải lại đoạn sub CreateRibbon tôi đã cập nhật ở #1 để thay cho sub trong file bạn xem thế nào. Đây là tôi thử có sai gì nữa không để các thành viên khác không bị lỗi nữa. Cảm ơn bạn
 
Upvote 0
Đọc lại mấy bình luận của bác @giaiphap, quả là tôi không hiểu bác chứ không phải là bác không hiểu tôi. Đọc trên di động và hơi vội di chuyển nên không hiểu. Bác bỏ quá cho!
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ả.
 

File đính kèm

  • Test Ribbon.xlsm
    20.3 KB · Đọc: 67
Upvote 0
Web KT

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

Back
Top Bottom