Nếu bạn tự tạo các thành phần của ribbon thì bạn phải đọc tài liệu. Tốt nhất là đọc ở ngay nguồn, tức trang của bác BillCho em hỏi anh @batman1 và các anh/chị trên GPE,
Như anh Batman1 có hướng dẫn viết code trên custom UI, việc tạo nút dùng thẻ Button id, tạo menu dùng thẻ menu id...
Nếu em muốn thêm 1 textbox vào Group id, thì code trên custom UI sẽ làm thế nào ạ?
Mục đích: để nhập đường dẫn vào (hoặc có nút Browse chọn đường dẫn đưa vào textbox) xong thực hiện việc lưu file/sheet theo textbox đó.
(ý tưởng như hình vẽ)
View attachment 273650
Cảm ơn các anh/chị.
[MS-CUSTOMUI]: editBox (Edit Box)
This element specifies an edit box control that allows a user to enter a string of text. For example, consider an edit
docs.microsoft.com
Bạn có thể dùng editBox. XML cho tập tin đính kèm là:
<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="RibbonLoad">
<ribbon>
<tabs>
<tab id="MyCustomTab" label="Thẻ riêng của tôi" insertAfterMso="TabHome">
<group id="mybox">
<editBox id="editBox1" label="Edit Box" onChange="EditBoxTextChanged" imageMso="HappyFace" tag="group1editBox1" getText="GetEditBoxText"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
Tôi giải thích từ A đến Z cho bạn hiểu cách thức hoạt động của editBox.
Khi ribbon cần text để hiển thị trong editBox thì nó sẽ gọi call back getText nếu có. Nhìn XML ở trên thì có getText="GetEditBoxText", và ribbon gọi GetEditBoxText mỗi khi cần text để hiển thị trong editBox. Khi nào ribbon cần hiển thị text trong editBox? Vd. khi bạn chọn thẻ mà mình tạo. Ở thời điểm "chào buổi sáng" thì ribbon phải có text để nhập vào editBox. Vì thế nó sẽ gọi GetEditBoxText. Trong code của GetEditBoxText bạn phải trả về text mà ribbon sẽ hiển thị trong editBox. GetEditBoxText cũng được gọi khi code của bạn gọi InvalidateControl ("editBox1") để làm mới editBox.
Mỗi khi có sự thay đổi trong editBox thì onChange sẽ được thực hiện nếu có. Nhìn ở trên thấy onChange="EditBoxTextChanged" nên mỗi khi nhập gì đó trong editBox rồi click ô nào đó trên sheet (kết thúc nhập trong editBox) hoặc nhấn Button1 trên sheet (kết thúc nhập trong editBox) thì EditBoxTextChanged sẽ được gọi để thực thi. Trong call back EditBoxTextChanged thì tham số text chính là nội dung đang có trong editBox.
Trong ví dụ bạn không thể nhập "thich con gai" được (nhập xong rồi nhấn Button1 hoặc chọn ô bất kỳ trên sheet để ra hiệu là việc nhập editBox đã hoàn tất). Nếu nhập "thich con gai" thì thông báo sẽ hiện ra và editBox được phục hồi về giá trị cuối cùng trước lỗi.
Nhìn code ở dưới thì thấy ở mọi thời điểm thì nội dung trong editBox và currText là như nhau.
Code trong Module1
Mã:
Private rb As IRibbonUI
Public currText As String
'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
Set rb = ribbon
currText = "hichic" ' ghi nho noi dung cua editBox o thoi diem "chao buoi sang" trong bien currText
End Sub
'Callback for editBox1 onChange
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
' khong cho phep nhap "thich con gai". Neu cau nay duoc nhap thi noi dung cu se duoc phuc hoi
If text <> "thich con gai" Then
currText = text
Else
MsgBox "thich con gai la cau noi bi cam. Khong duoc phep nhe!" ' thong bao lenh cam
rb.InvalidateControl ("editBox1") ' goi InvalidateControl cho editBox1 nen GetEditBoxText se duoc goi de thuc hien
End If
End Sub
'Callback for editBox1 getText
Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
returnedVal = currText ' lay currText de lam nguon nhap vao, lam moi editBox
End Sub
File đính kèm
Lần chỉnh sửa cuối: