Ah, hóa ra phải dùng thêm 1 thủ tục
[GPECODE=vb] <comboBox id="combobox1" enabled="true" label="Chọn" getText="GetText">[/GPECODE]
[GPECODE=vb]Sub GetText(control As IRibbonControl, ByRef text)
text = "A"
End Sub
[/GPECODE]
1. Xin hỏi các anh chị chỉ có cách khác không ?
Nhưng xin hỏi tiếp các anh chị là khi ta thay đổi giá trị combobox thì truy vấn đến giá trị nó như thế nào
Nếu là tôi thì tôi làm như sau. Vì thực chất thì trong nhiều th thì các mục của combobox chưa được biết ở giai đoạn compile trong Custom UI Editor. Các mục cụ thể và số lượng thậm chí có thể thay đổi qua mỗi lần mở tập tin
[GPECODE=vb]
<?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">
<group id="customGroup1" label="Nhóm gì đó">
<button id="MyButton1" imageMso="FrontPageToggleBookmark" size="large"
label="Hãy thay danh sách trong combo"
onAction="Macro1" />
<comboBox id="MyCombo" label="Đây là Combo"
onChange="onChange"
getItemCount="GetItemCount"
getItemID="GetItemID"
getItemLabel="GetItemLabel"
getText="GetText"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
[/GPECODE]
module
[GPECODE=vb]
Private ribbon As IRibbonUI
Dim arrItem(), currText As String
Sub RibbonLoad(rb As IRibbonUI)
Set ribbon = rb
arrItem = Array("muc 1", "muc 2", "muc 3", "muc 4", "muc 5")
End Sub
Sub Macro1(control As IRibbonControl)
arrItem = Array("hic hic", "ten ten", "a la la", "hi hi")
ribbon.InvalidateControl ("MyCombo")
End Sub
Sub onChange(control As IRibbonControl, text As String)
currText = text
MsgBox "nguoi dung chon muc co gia tri " & text
End Sub
Sub GetItemCount(control As IRibbonControl, ByRef count)
count = UBound(arrItem) + 1
End Sub
Sub GetItemLabel(control As IRibbonControl, index As Integer, ByRef itemLabel)
itemLabel = arrItem(index)
End Sub
Sub GetText(control As IRibbonControl, ByRef text)
text = arrItem(2)
currText = text
End Sub
Sub GetItemID(control As IRibbonControl, index As Integer, ByRef ID)
ID = "item" & index
End Sub
[/GPECODE]
Tôi cố giải thíc cho ai cần thì hiểu cơ chế hoạt động. Các callback mà Excel sẽ gọi. Tôi hiểu thế nào thì trình bầy thế đó
1. Do
onLoad="RibbonLoad" nên trước tiên callback
RibbonLoad sẽ được gọi. Ta lợi dụng cơ hội này để thiết lập bảng danh sách các mục của combobox -
arrItem. Đồng thời ta cũng ghi nhớ pointer tới
ribbon để dùng về sau (vd. có object - interface
ribbon thì ta gọi phương thức
InvalidateControl sau khi đã làm mới bảng danh sách các mục (
arrItem) của combobox - trong code của nút Button)
2. Excel phải biết combobox của ta có bao nhiêu mục để còn biết đường mà tạo. Do vậy Excel gọi callback
GetItemCount. Nhiệm vụ của code là cung cấp số mục trong combobox
3. Excel cũng cần biết các mục trong combobox lần lượt có giá trị như thế nào để còn biết đường hiển thị chúng trong danh sách thả xuống. Để biết được các giá trị này thì Excel gọi callback
GetItemLabel n lần (Excel đã biết
n do gọi
GetItemCount ở điểm 2) với đối số index lần lượt từ 0 tới n - 1 (
n mục trong combobox). Nhiệm vụ của code là cung cấp giá trị cho mục thứ index (thứ 0, thứ 1, ..., thứ n - 1)
4. Mỗi khi người dùng chọn mục trong combobox thì Excel gọi callback
onChange. Thì ta viết code để phục vụ sự kiện này thôi.
5. Trong code ví dụ thì vào thời điểm "
chào buổi sáng" thì combobox được thiết lập với text của mục thứ 3 (index tính từ 0) - trong callback
GetText.
6. Nếu cần thì trong
onChange và
GetText ta ghi nhớ text hiện hành trong combobox. Nếu cần thì ở thời điểm bất kỳ ta có thể đọc ra. Cũng có thể đọc ra index vì có text thì ta tìm xem nó là mục thứ mấy trong mảng
arrItem. Thế thôi. Bởi vì nói cho cùng thì bạn chỉ cần biết text hiện hành trong combobox, và từ đó cũng biết được index của nó trong mảng
arrItem là bao nhiêu. Và có code phục vụ sự kiện
onChange