Hành trình về khám phá thách thức số 2

  • Thread starter vothanhthu
  • Ngày gửi
V

vothanhthu

Guest
Dành cho bạn nào chưa biết về cách thách thức trên diễn đàn, các bạn có thể đọc lại nha.

Thách thức về Ribbon của chúng ta cụ thể như sau:
Bạn cần đăng nhập để thấy hình ảnh

Chúng ta có một file với định dạng Addin (.xla) có chứa các Ribbon từ Tab ADD-INS, Tab này có một số điểm đặc biệt như sau:
1. Khi đóng file này đi, mở file khác lên thì Ribbon vẫn còn tồn tại.
2. Ta bỏ vào phần mềm UI thì chương trình sẽ báo không tìm thấy XML tạo Ribbon nào trong file này.
3. Trong file không hề có đoạn Code nào khởi tạo Ribbon.

Vậy câu hỏi đặt ra: Ribbon này rốt cuộc là gì, và được tạo ra từ đâu?

Như tất cả chúng ta đều biết, nguyên nhân mà các Ribbon nằm trong Tab ADD-INS là do người viết đã dùng Code VBA để tạo ra Ribbon, các Ribbon tạo kiểu này không tương thích với các Office đời mới nên đi vào Tab ADD-INS. Ví dụ, để tạo ra một Listbox trong Tab ADD-INS mang tên Tuhocvba, chúng ta có thể dùng Code sau:
Mã:
Const myPopup = "Tuhocvba"
Sub BuildMenu()
   Dim j As Long
   Dim PopupA As CommandBarControl
   With Application.CommandBars(1)
      On Error Resume Next
      .Controls(myPopup).Delete 'XÓA RIBBON KHI KHỎI TẠO LẠI
      On Error GoTo 0
      Set PopupA = .Controls.Add(Type:=msoControlPopup, _
                                 Before:=.FindControl(ID:=30010).Index, _
                                 Temporary:=True) 'TẠO RIBBON
   End With
   With PopupA 'THIẾT LẬP CÁC GIÁ TRỊ'
      .Caption = myPopup 'CAPTION CỦA LISTBOX'
      With .Controls.Add(Type:=msoControlButton) 'THÊM MỘT ITEM TRONG LISTBOX'
         .Caption = "Tuhocvba" 'TÊN'
         .OnAction = "LoadMenu" 'MACRO CẦN GỌI
         .Style = MsoButtonStyle.msoButtonIconAndCaption
         .FaceId = 420 'BIỂU TƯỢNG ICON'
         .Enabled = True 'TRANG THÁI BẬT'
      End With
   End With
End Sub
Đây là kết quả sau khi chạy Code. Và hơn nữa, Sau khi đóng file, Tab Ribbon này vẫn còn tồn tại.
Bạn cần đăng nhập để thấy hình ảnh


Rõ ràng, việc tạo ra Ribbon kiểu này phải do Code, nhưng tại sao lại không có Code tạo trong file?

* Giả thuyết 1: Họ đã ẩn Module
Để kiểm chứng giả thuyết này, ta cần biết chính xác những Module thật sự trong file. Ta sẽ dùng Python để "mổ bụng" file VBAProject.bin nằm trong Addin này ra.
Bạn cần đăng nhập để thấy hình ảnh

Vùng mình tô màu đỏ và có chữ M có nghĩa là đây là nơi có chứa Code VBA thật sự của file, m là Sheet. Vậy chúng ta sẽ có các Module sau: ColorPicker, EventClassModule, Module1, frmColorPicker, frmMain, ThisWorkbook và có thêm Sheet1. Kết quả này hoàn toàn trùng khớp với những Module hiện trên file.

Kết luận 1: File này không hề ẩn Module

Đến đây, Mình đoán 99% là các bạn đã biết Addin này là Addin nào rồi phải không, đây là file Addin gốc trong Topic Làm nổi bật dòng và cột-phần 2, Link .

*Giả thuyết 2: Ribbon có thực sự được tạo từ Code không?
Để kiểm chứng, ta sẽ dùng một đoạn Code để xóa toàn bộ Ribbon trên Tab ADD-INS đi, đoạn Code như sau:
Mã:
Sub DetermineNonBuiltinCommandBars()
    Dim cb As Office.CommandBar

    For Each cb In CommandBars
        If Not cb.BuiltIn Then
            Debug.Print cb.Context & ", " & cb.Name
            cb.Delete
        Else
            cb.Reset
        End If
    Next
End Sub
Sau khi xóa thành công, ta tắt hoàn toàn Macro và mở lại Add-in. Kết quả, Ribbon vẫn hiện lên lại.

Kết luận 2: Ribbon này thực sự là một CommandBars và sự kiện gọi Tab này khi mở file KHÔNG PHẢI DO CODE VBA.

Giả thuyết 3: Có gì đó đặc biệt trong "bụng" file Addin này.
Mình thực hiện nén file Addin này lại bằng cách thêm .ZIP sau đuôi, mở lên và kết quả bị lỗi

Bạn cần đăng nhập để thấy hình ảnh


Lỗi này minh chứng cho việc, Addin này được tạo ra từ bản Office rất cũ (<2007). Mở file, Chúng ta sẽ xử lý bằng cách chuyển đổi định dạng từ Addin (.xla) sang .xlsb. Kết quả, chúng ta nén thành công và đã vào được "bụng" của file, file lúc này mang tên drawLine.xlsb.zip. Tại đây, ta lại thấy một file rất lạ mang tên attachedToolbars.bin tại đường dẫn drawLine.xlsb.zip/xl
Bạn cần đăng nhập để thấy hình ảnh

Ta vào đường dẫn: drawLine.xlsb.zip\xl\_rels\workbook.bin.rels : Ta xóa đoạn Code gọi attachedToolbars.bin, save file lại và bỏ .ZIP đi.

Mã:
<Relationship Id="rId5" Type="http://schemas.microsoft.com/office/2006/relationships/attachedToolbars" Target="attachedToolbars.bin"/>
Kết quả, khi chúng ta mở lên và thấy không còn xuất hiện Ribbon nữa.

Kết luận 3: Nguyên nhân là do file attachedToolbars.bin.

Bạn cần đăng nhập để thấy hình ảnh


* KẾT LUẬN CHUNG:

Thông qua tìm hiểu tại 2 đường dẫn trong diễn đàn của Microsoft về file attachedToolbars.bin

Dựa vào những thông tin trình bày trong 2 Link trên. Ta biết được rằng, File này được tạo ra do người viết Code sử dụng chương trình Office cũ 2003, tạo Ribbon dạng Code VBA dạng CommandBars, lưu với định dạng .xls. Lúc này, file attachedToolbars.bin đã được tạo trong chính bản thân file xls. Sau khi viết xong, họ xóa đoạn Code tạo Ribbon và lưu lại với định dạng .xla.

Việc tạo một Ribbon như thế này đã không còn phổ biến nữa, chúng đã lỗi thời. Hiện tại, chúng ta dùng cách XML như trong loạt bài viết Hướng dẫn tạo Ribbon trong XML, Link vẫn là dễ dàng và tiện hơn cả.

Đây chỉ là một phần nhỏ trong toàn bộ quá trình việt hóa Addin DrawLine. Qua đó, ta có thể thấy được rằng, công sức mà Đội ngũ BQT diễn đàn đã bỏ ra là vô cùng lớn. Tại Tuhocvba.net, mình rất mong tất cả mọi người, chúng ta mỗi người đóng góp một ích, tất cả cùng nhau đưa nền VBA nước nhà ngày càng phát triển vững mạnh hơn.
 
Sửa lần cuối bởi điều hành viên:
Top