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
Thách thức về Ribbon của chúng ta cụ thể như sau:
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:
Đâ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.
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.
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:
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
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
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.
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.
* 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
Đâ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.
Bạn cần đăng nhập để thấy link
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
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
Bạn cần đăng nhập để thấy 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
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 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
Bạn cần đăng nhập để thấy link
Bạn cần đăng nhập để thấy link
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
Bạn cần đăng nhập để thấy 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: