Vấn đề hiển thị Menu tự tạo trong Excel 2007

Liên hệ QC
Cho 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ị.
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 Bill


editBox.jpg

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="The&#777; ri&#234;ng cu&#777;a t&#244;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

  • editBox.xlsm
    18.7 KB · Đọc: 19
Lần chỉnh sửa cuối:
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 Bill


View attachment 273653

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="The&#777; ri&#234;ng cu&#777;a t&#244;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
Em cảm ơn anh @batman1, rất tuyệt vời. Em sẽ thử thực hành xem sao ạ.
 
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 Bill


View attachment 273653

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="The&#777; ri&#234;ng cu&#777;a t&#244;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>
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
 
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
Dòng đấy chỉ phiên bản và kiểu mã hoá của file xml thôi, chắc không liên quan gì đâu
 
Chào anh @batman1 và các anh/chị,

Ngay dòng đầu của Code Xml để tạo Ribbon có đoạn: <?xml version="1.0" encoding="UTF-8"?>

Cái này có liên quan gì đến phiên bản của Excel không? Vì em đang gặp thực trạng sau:
- Add-in vào Excel 2016 dùng ổn.
- Add-in vào Excel 365 thì sau khi add, ribbon có hiện lên. Nhưng khi tắt file đi bật lại thì Ribbon lại mất. Kiểm tra trong hộp thoại Add-in thì vẫn check.

Em cảm ơn,
Cái dòng đó thì không liên quan gì tới Excel.

Tôi không biết sao bạn có lỗi như thế. Tôi không có phiên bản Excel để thử.

Chỉ nên lưu ý rằng với Excel phiên bản mới hơn thì dùng

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" >

thay cho

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

Tôi không thể giúp bạn. Có thể có những cái tôi không biết chăng. Hơi lạ với tôi.
 
Cái dòng đó thì không liên quan gì tới Excel.

Tôi không biết sao bạn có lỗi như thế. Tôi không có phiên bản Excel để thử.

Chỉ nên lưu ý rằng với Excel phiên bản mới hơn thì dùng

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" >

thay cho

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

Tôi không thể giúp bạn. Có thể có những cái tôi không biết chăng. Hơi lạ với tôi.
Vâng, em cũng thấy hơi lạ, không hiểu có phải do xung đột các Add-in hay không? mặc dù e cũng thử gỡ tất cả các addin chỉ để mình nó, vẫn bị tình trạng vậy.
 
File *.xlam không mở trực tiếp được anh ah,

Mấy chục năm dùng Excel lần đầu tiên có người nói file Addin *.xlam (*.xla) không mở trực tiếp được.

Bạn chỉ cần click đúp (hoặc chọn và nhấn enter) vào file đó là mở lên được thôi.

Em đang làm Addin bằng CustomUIEditor
Addin gì hay vậy bạn?

CustomUIEditor chỉ là công cụ trung gian tạo cái menu dạng Ribbon thôi.
 
Mấy chục năm dùng Excel lần đầu tiên có người nói file Addin *.xlam (*.xla) không mở trực tiếp được.

Bạn chỉ cần click đúp (hoặc chọn và nhấn enter) vào file đó là mở lên được thôi.


Addin gì hay vậy bạn?

CustomUIEditor chỉ là công cụ trung gian tạo cái menu dạng Ribbon thôi.
Vâng anh, enter vào thì chỉ mở excel ra thôi, chứ ko ra nội dung gì.
 
Không hiện lên Ribbon như mong đợi anh.

Thế thì chỗ này vô lý rồi.
1653553041675.png

Khi bạn mở trực tiếp file.xlam mà không hiện được ribbon -> chứng tỏ file.xlam đó có vấn đề.


Còn vấn đề của bạn
1653553130309.png

là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.
 
Không hiện lên Ribbon như mong đợi anh.
Bạn thử gửi file xml lên đi, có khi bạn viết sai mã cũng nên ấy. Chỉ cần sai một lỗi nhỏ như chữ hoa mà bạn lại viết thường hoặc quên dấu "/" là Ribbon cũng không hiện lên được rồi, mặc dù trong mục addin vẫn tích như thường
 
Bạn thử gửi file xml lên đi, có khi bạn viết sai mã cũng nên ấy. Chỉ cần sai một lỗi nhỏ như chữ hoa mà bạn lại viết thường hoặc quên dấu "/" là Ribbon cũng không hiện lên được rồi, mặc dù trong mục addin vẫn tích như thường
Đúng bạn, tôi biết điều này, nếu có sai thì ngay lúc Add đầu tiên Ribbon đã không lên được rồi.


là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.

Cảm ơn anh, để em thử giải pháp này xem sao.
 
Thế thì chỗ này vô lý rồi.
View attachment 276492

Khi bạn mở trực tiếp file.xlam mà không hiện được ribbon -> chứng tỏ file.xlam đó có vấn đề.


Còn vấn đề của bạn
View attachment 276493

là do MS Excel không mở được file.xlam đó lên thôi (mặc dù vẫn có cái bạn mô tả là "vẫn check").
Cách khắc phục đơn giản đó là chép file.xlam vào thư mục Excel\XLSTART.
Bây giờ e mới tìm được nguyên nhân, và cách khắc phục, em Post lên để nếu anh/chị nào gặp tình huống không load được Addin khi mở Excel có thể có giải pháp.
Bước 1: Click phải chuột vào File addin chọn Properties
imager_1_2712_700.png
Bước 2: Tab General, tích chọn Unblock

imager_2_2712_700.png
 
Ợ. Hóa ra là bạn tải file từ nơi nào đó về, mà không phải tự mình tạo ra.

Cái unlock kia là điều hiển nhiên bạn phải xử lý khi làm việc với Windows 10,11 mà.
Tự tạo chứ anh. Nhưng vẫn phải tích cái đó. Như e nói. Có máy add thì ko vấn đề gì, máy thì lại ko load được
 
Web KT
Back
Top Bottom