Hướng dẫn tùy chọn ẩ/hiện Custum Ribbon tự tạo

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
719
Được thích
97
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Mình có tạo 2 Tab trên Ribbon, loay hoay mãi vẫn không biết cách thiết lập cho luôn hiện Tab1 còn Tab2 thuộc dạng tùy chọn có thể ẩn hiện lên khi cần. Thiết lập tùy chọn ẩn hiện Tab 2 được ghi xuống Sheet với giá trị True, False
Nhờ anh chị giúp đỡ ạ

1610238930415.png
 

File đính kèm

  • Hide-Display-Tab.xlsm
    25.5 KB · Đọc: 6
  • getVisibleExamples.zip
    128.4 KB · Đọc: 6
Mình có tạo 2 Tab trên Ribbon, loay hoay mãi vẫn không biết cách thiết lập cho luôn hiện Tab1 còn Tab2 thuộc dạng tùy chọn có thể ẩn hiện lên khi cần. Thiết lập tùy chọn ẩn hiện Tab 2 được ghi xuống Sheet với giá trị True, False
Nhờ anh chị giúp đỡ ạ

View attachment 252757
Đưa cái file thực tế của bạn lên đây tôi sẽ giúp, còn file này giúp xong bạn lại không biết áp dụng vào file thực tế sẽ mất thời gian thêm.
Còn có đủ khả năng thì có thể tham khảo file ở bài này sẽ có cái bạn cần.
 
Upvote 0
Trước hết học cách thêm menu vào ribbon. Sau đó mới học cách ẩn hiện menu. Bạn còn chưa biết cách thêm menu thì trước hết học cách thêm menu đã. Những tập tin đính kèm là của người khác, chứng tỏ bạn chưa biết thêm menu vào ribbon.
 
Upvote 0
Trước hết học cách thêm menu vào ribbon. Sau đó mới học cách ẩn hiện menu. Bạn còn chưa biết cách thêm menu thì trước hết học cách thêm menu đã. Những tập tin đính kèm là của người khác, chứng tỏ bạn chưa biết thêm menu vào ribbon.
Cách thêm vào tạo ribbon em biết rồi a. Em đã tạo 3 Tab Ribbon cho 3 chức năng em cần, tuy nhiên khi chạy file em muôn Tab chính luôn hiển thị các Tab còn lại tùy chọn bằng cách dùng Form đặt checkbox cho phép Tab nào được hiển thị hay ẩn ạ (Giá trị True hay False sẽ ghi xuống Sheet cấu hình để cho việc chạy lần sau)
 
Upvote 0
Cách thêm vào tạo ribbon em biết rồi a. Em đã tạo 3 Tab Ribbon cho 3 chức năng em cần, tuy nhiên khi chạy file em muôn Tab chính luôn hiển thị các Tab còn lại tùy chọn bằng cách dùng Form đặt checkbox cho phép Tab nào được hiển thị hay ẩn ạ (Giá trị True hay False sẽ ghi xuống Sheet cấu hình để cho việc chạy lần sau)
Nếu đúng là bạn biết tạo menu trên ribbon thì bạn phải hiểu được những gì tôi viết sau đây.
-------------
Nếu bạn tự làm thì lần sau bạn sẽ biết cách làm và nhớ lâu.

Do bạn không đính kèm tập tin có menu của mình (các tập tin đính kèm rõ ràng là code của người khác) nên tôi chỉ viết chay thôi, hi vọng không sai.

Chăc chắn trong nội dung XML có đoạn:

<tab id="..." label="My Tab 2" ...>

Hãy thêm getVisible="MyCustomVisible" để có

<tab id="..." label="My Tab 2" ... getVisible="MyCustomVisible">

Do có nhiều get*** có cơ cấu hoạt động, có triết lý tương tự, nên tôi giải thích cặn kẽ cho bạn hiểu getVisible.

1. Bạn sẽ cung cấp một getVisible trong nội dung XML khi bạn muốn linh động việc ẩn (Visible = false) hoặc hiện (Visible = true) control - ở đây là tab "My Tab 2".

2. getVisible gọi là hàm callback - hàm gọi ngược.

3. triết lý của callback - hàm gọi ngược là thế nào? Giả sử hàng ngày bác A sẽ treo bảng thông tin về từng người trong văn phòng lên bức tường. Nhưng mỗi NV trong phòng có thể tự quyết định ngày nào mình muốn ẩn/hiện bảng thông tin của mình. Vậy bác A sẽ xử lý như thế nào? Bác A sẽ yêu cầu mỗi người cung cấp số di động. Số di động này chính là callback. Hàng ngày bác A sẽ gọi số cho từng người, và nhiệm vụ của người đó là cung cấp quyết định ẩn/hiện trong ngày đó cho bác A. Bác A sẽ thực hiện ẩn/hiện người đó trong ngày đó.

Một cái "giỏ" hay cái "khay" cũng có thể đóng vai trò callback. Khi cần lấy QUYẾT ĐỊNH thì cái giỏ hoặc cái khay sẽ được CHÌA RA. Và người quyết định sẽ ĐẶT quyết định của mình vào khay hoặc giỏ. Tùy theo cái giỏ hoặc khay chứa quyết định thế nào mà một lệnh nào đó sẽ được thực hiện như thế nào.

Lôgíc trong cuộc sống và trong lập trình là một thôi.

Trong trường hợp cụ thể ẩn hiện control mà muốn quyết định tùy theo điều kiện thì phải cung cấp callback MyCustomVisible (tương tự số di động, cái giỏ, cái khay). Khi ribbon cần làm mới thì callback MyCustomVisible sẽ được gọi (số di động sẽ được bấm, giỏ hoặc khay sẽ được chìa ra). Code của callback MyCustomVisible phải trả về giá trị false hoặc true (quyết định ẩn hiện phải được truyền qua sóng, đặt vào giỏ hoặc khay). Tùy theo giá trị trả về trong callback MyCustomVisible (qua sóng điện thoại, trong giỏ hoặc khay) mà TAB trên ribbon (bảng trên tường) sẽ được ẩn hoặc hiện.

Tóm lại:
- trong nội dung XML phải có: <tab id="..." label="My Tab 2" ... getVisible="MyCustomVisible">

- code ví dụ trong tập tin Excel: returnedVal là nơi trả về true hoặc false - nơi trả về quyết định.
Mã:
Sub MyCustomVisible(control As IRibbonControl, ByRef returnedVal)
    returnedVal = Sheet3.Range("A1").Value <> ""
End Sub

Với code ví dụ như trên thì mỗi khi cần làm mới ribbon, vd. khi mở tập tin, thì Sub MyCustomVisible sẽ được gọi, và tùy giá trị trả về trong biến returnedVal mà thẻ "My Tab 2" sẽ được ẩn hoặc hiện. Nếu A1 trong sheet3 rỗng thì thẻ được ẩn, ngược lại thẻ được hiện.

Thế nếu muốn mỗi khi A1 thay đổi thì thẻ được ẩn/hiện ngay lập tức thì phải làm thế nào? Nếu muốn thế thì phải "ép" ribbon làm mới bằng cách:
1. trong nội dung XML sửa thành (thêm onLoad="RibbonLoad"):

<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="RibbonLoad">

2. Trong tập tin Exccel trong module ngay trên cùng dán code
Mã:
Private rb As IRibbonUI

Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
End Sub

3. trong module thêm
Mã:
Sub AnHienTab2()
    rb.InvalidateControl ("MyCustomTab")    ' ép làm mới thẻ MyCustomTab
End Sub

Tất nhiện bạn phải thay "MyCustomTab" bằng ID của "My Tab 2". Do bạn không đính kèm tập tin nên tôi không biết ID của nó thế nào.

4. Trong module Sheet3 dán code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then AnHienTab2    ' gọi AnHienTab2 để làm mới "My Tab 2"
End Sub
------------
Lưu ý: Trong code ở trên thay Sheet3 bằng sheet của mình.

sub MyCustomVisible có thêm tham số control As IRibbonControl để làm gì?

Được phép gán cho nhiều control, vd. nhiều TAB, cùng một callback, vd. callback MyCustomVisible. Giả sử callback MyCustomVisible được gán cho 10 TAB khác nhau. Lúc đó callback MyCustomVisible sẽ được gọi lần lượt 10 lần: lần gọi 1 thì control = Tab1, lần gọi 2 thỉ control = Tab2, ..., lần gọi 10 thì control = Tab10. Code của MyCustomVisible phải căn cứ vào control.id để trả về quyết định ẩn hiện cho tab có ID = control.id. Vd. nếu "My Tab 2" có id = "My Custom Tab 2" thì giá trị trả về trong returnedVal cho trường hợp control.id = "My Custom Tab 2" chính là để ẩn/hiện "My Tab 2".
Mã:
Sub MyCustomVisible(control As IRibbonControl, ByRef returnedVal)
    Select Case control.ID
        Case "My Custom Tab 2":    returnedVal = Sheet3.Range("A1").Value <> ""
        ' ...
    End Select
End Sub
 
Upvote 0
Dạ em cám ơn anh
Em gửi file thực tế của em đang làm ạ. Anh chị giúp em với nhé
 

File đính kèm

  • Help_Hidden_CustomTab.xlsb
    145.9 KB · Đọc: 9
Upvote 0
Dạ em cám ơn anh
Em gửi file thực tế của em đang làm ạ. Anh chị giúp em với nhé
Có 4 Tab vậy Tab nào luôn hiển thị, Tab nào cần ẩn? Khi ẩn muốn nó hiển thị thì nháy vào nút nào? Dữ liệu ghi nhận (Ẩn/hiện) sẽ ghi vào sheet nào? Ô nào?...
 
Upvote 0
Dạ Tab đầu tiên luôn hiển thị. Các Tab còn lại tùy chọn trong Form cấu hình ạ
Bài đã được tự động gộp:

Trong Sheet Setting em có để thông tin đó ạ.
 
Upvote 0

File đính kèm

  • Help_Hidden_CustomTab.xlsb
    77.5 KB · Đọc: 10
Upvote 0
Có 1 vấn đề anh
Khi mình Click chọn Textbox bị lỗi này ạ
View attachment 252788
Cái vụ Textbox tui không biết? Tôi chỉ sửa tên CheckBox thôi chẳng có đá động gì các Textbox của bạn cả. Nếu báo lỗi Textbox thì bạn xem lại code của mình đi. Mà máy tui click vào tất cả các textbox đều chạy ầm ầm.
 
Upvote 0
Cái vụ Textbox tui không biết? Tôi chỉ sửa tên CheckBox thôi chẳng có đá động gì các Textbox của bạn cả. Nếu báo lỗi Textbox thì bạn xem lại code của mình đi. Mà máy tui click vào tất cả các textbox đều chạy ầm ầm.
Dạ checkbox anh. Anh chạy click vào xong bỏ chọn click lại xem ạ
Bài đã được tự động gộp:

1610350466162.png

1610350495389.png
 
Upvote 0
Dạ checkbox anh. Anh chạy click vào xong bỏ chọn click lại xem ạ
Bài đã được tự động gộp:

View attachment 252791

View attachment 252792
Máy tui không hề bị nhé!
Một điều cần lưu ý khi thiết kế file Excel có sử dụng Ribbon: Khi sửa code thì biến gobjRibbon sẽ reset lại, chính vì vậy khi sửa code muốn chạy lại thì nên đóng file excel xong mở lại và Test thử (Lúc này chưa hề sửa code nhé). Nếu sử code xong và cho chạy luôn là nó sẽ báo lỗi. Bạn tự kiểm tra phải vậy không?
 
Upvote 0
Dạ khi click chọn đi chọn lại bị lỗi trên a
 
Upvote 0
Hóa ra là ai đó làm hộ hoặc bắt chước mà không hiểu. Viết thế, giải thích thế mà không làm được thì bó tay toàn tập.
Tôi dừng ở đây.
 
Upvote 0
Web KT

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

Back
Top Bottom