Làm quen với Ribbon

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,600
Được thích
2,907
Tôi đang tập làm quên với ribbon excel 2010, cần có một số vấn đề cần hỏi
1. Tôi đã lập được 1 combobox với comboBox id="combobox1", gồm có 3 item:
<item id="Item1" label="A">
<item id="Item2" label="B">
<item id="Item3" label="C">
năm trong:
tab id="CustomTab" ,
group id="customGroup1"
Vậy tôi muốn cho combobox có giá trị mặc định là "A" khi mở file thì làm sao?
2. Lệnh nào khi mở file CustomUI.xml trong XN2007 sổ xuống như hình dưới đây?
Ribbon.JPG
Xin cảm ơn các anh chị
 
Lần chỉnh sửa cuối:
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
2. Các anh chị giúp trả lời câu 2
 
Lần chỉnh sửa cuối:
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
2. Các anh chị giúp trả lời câu 2

Có lẽ cách bạn làm không đúng, nó chỉ là đưa giá trị hiển thị lên EditBox của ComboBox mà thôi, thực chất nó không phải của Item1 (Index = 1).

Bạn kiểm tra trong các thuộc tính hoặc sự kiện của ComboBox xem có những mục này không, nếu có thì chọn nó và viết hàm: "SelectedItemIndex"; "getSelectedItemIndex"

Ví dụ:
<comboBox id="combobox1" enabled="true" label="Chọn" getSelectedItemIndex="getSelectedItemIndex">

Sub getSelectedItemIndex(control As IRibbonControl, ByRef Index)
Index = 1
End Sub

Nếu có SelectedItemIndex thì viết thế này
<comboBox id="combobox1" enabled="true" label="Chọn" SelectedItemIndex="1">

Mình chưa cài các công cụ làm ribbon nên không test được, chỉ gợi ý như vậy.
 
Có lẽ cách bạn làm không đúng, nó chỉ là đưa giá trị hiển thị lên EditBox của ComboBox mà thôi, thực chất nó không phải của Item1 (Index = 1).

Bạn kiểm tra trong các thuộc tính hoặc sự kiện của ComboBox xem có những mục này không, nếu có thì chọn nó và viết hàm: "SelectedItemIndex"; "getSelectedItemIndex"

Ví dụ:
<comboBox id="combobox1" enabled="true" label="Chọn" getSelectedItemIndex="getSelectedItemIndex">

Sub getSelectedItemIndex(control As IRibbonControl, ByRef Index)
Index = 1
End Sub

Nếu có SelectedItemIndex thì viết thế này
<comboBox id="combobox1" enabled="true" label="Chọn" SelectedItemIndex="1">

Mình chưa cài các công cụ làm ribbon nên không test được, chỉ gợi ý như vậy.
Cả 2 cách em test không được anh Tuân ạ
Trước khi em hỏi thử dùng cả 2 trường hợp sau đều không được:
<comboBox id="combobox1" enabled="true" label="Chọn" SelectedItemIndex="0">
<comboBox id="combobox1" enabled="true" label="Chọn" getSelectedItemIndex="0">
 
Cả 2 cách em test không được anh Tuân ạ
Trước khi em hỏi thử dùng cả 2 trường hợp sau đều không được:
<comboBox id="combobox1" enabled="true" label="Chọn" SelectedItemIndex="0">
<comboBox id="combobox1" enabled="true" label="Chọn" getSelectedItemIndex="0">

SelectedItemIndex là thuộc tính nên có thể hai báo SelectedItemIndex = "0". Còn getSelectedItemIndex là khai báo thủ tục sự kiện (callback) nên phải gán cho nó một tên thủ tục như là getSelectedItemIndex="getSelectedItemIndex" sau đó viếtthuur tục như trên. Tuy nhiên mình cũng nghi ngờ hai cái khai báo mà mình gợi ý có thể không chạy được trong ComboBox. Đọc tài liệu ribbon của Microsoft thì thấy hai thủ tục này được dùng trong DropDown nhưng ComboBox không thấy có. Vì thế mình mới hỏi bạn xem trong khai báo gợi ý của công cụ XML Node có hiện ra hay cái thuộc tính đã nêu không? Nếu không có thì e là không được rồi.
 
Lần chỉnh sửa cuối:
Đúng như Tuân nói, thuộc tính getSelectedItemIndex dành cho đối tượng dropdown, gallery. Chưa test thử với comboBox, tôi mới cài lại máy nên cũng chưa cài các công cụ hỗ trợ tạo Ribbon. Hay anh sử dụng callback getItemID hoặc getText xem sao?

Ví dụ tôi đưa lên có phần này rồi mà anh.
 
Lần chỉnh sửa cuối:
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
 

File đính kèm

  • test.rar
    13.3 KB · Đọc: 100
Lần chỉnh sửa cuối:
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 onChangeGetText 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
Cảm ơn Thầy, mỗi bài vết trả lời của Thầy lý giải rất cặn kẻ và dể hiểu sâu vấn đề, nhưng tối em mới test được vì máy hiện tại dùng excel 2003, có gì mong được Thầy giúp tiếp nhé
Gửi Thầy PhanTuHuong :
Như ở bài 1 câu 2, khi dùng phần mền XN2007, xin hỏi trong lệnh nào để có được các thuộc tính sổ xuống như hình trên?. Cảm ơn Thầy
 
Cảm ơn Thầy, mỗi bài vết trả lời của Thầy lý giải rất cặn kẻ và dể hiểu sâu vấn đề, nhưng tối em mới test được vì máy hiện tại dùng excel 2003, có gì mong được Thầy giúp tiếp nhé
Gửi Thầy PhanTuHuong :
Như ở bài 1 câu 2, khi dùng phần mền XN2007, xin hỏi trong lệnh nào để có được các thuộc tính sổ xuống như hình trên?. Cảm ơn Thầy

Bác tải file kèm theo nhé, máy em không cài XN2007.
 

File đính kèm

  • CustomControl3.rar
    32.6 KB · Đọc: 71
Qua bài 9 của Thầy Siwtom em đã hiểu rõ về combobox trong Ribbon. Cảm ơn Thầy Siwtom cà các anh chị rất nhiều
Cho phép em hỏi tiếp là có thể dùng các hình ảnh của FaceID để để làm gắn cho các điểu khiển trong ribbon được không?, nếu được thì làm cách nào?
Em xin cảm ơm
 
Cho phép em hỏi tiếp là có thể dùng các hình ảnh của FaceID để để làm gắn cho các điểu khiển trong ribbon được không?,

Nếu tôi không lầm thì không dùng được FaceID đâu. Bạn sẽ "viết" như thế nào? "Nó" chờ đợi imageMso mà.

Sao bạn không muốn dùng imageMso? Đủ chủng loại và số lượng cho bạn dùng mệt nghỉ mà
 
Nếu tôi không lầm thì không dùng được FaceID đâu. Bạn sẽ "viết" như thế nào? "Nó" chờ đợi imageMso mà.

Sao bạn không muốn dùng imageMso? Đủ chủng loại và số lượng cho bạn dùng mệt nghỉ mà
Dạ, cảm ơn Thầy em hỏi để biết thêm thôi mà
 
Qua bài 9 của Thầy Siwtom em đã hiểu rõ về combobox trong Ribbon. Cảm ơn Thầy Siwtom cà các anh chị rất nhiều
Cho phép em hỏi tiếp là có thể dùng các hình ảnh của FaceID để để làm gắn cho các điểu khiển trong ribbon được không?, nếu được thì làm cách nào?
Em xin cảm ơm

Bác chả chịu đọc các file em up lên, nó đây này.
 

File đính kèm

  • Office2007IconsGallery.rar
    57.8 KB · Đọc: 68
Thế hệ Office 2003 về trước thì dùng FaceiD, từ Office 2007 nếu muốn khai thác icon trên menu thì dùng khai báo imageMSO=...Bạn đọc ài liệu sẽ thấy tên các lệnh trên manu chính là tên icon.
 
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 onChangeGetText 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
Thầy cho em hỏi thêm từ file test.xlsm của Thầy, em tạo 1 userform1 có 1 textbox1. Bây giờ em muốn khi load form thì textbox1 có giá trị là giá trị combobox của ribbon
Em thử mãi không được, mong Thầy và các anh chị khác giúp tiếp cho em, em xin cảm ơn
 
Thầy cho em hỏi thêm từ file test.xlsm của Thầy, em tạo 1 userform1 có 1 textbox1. Bây giờ em muốn khi load form thì textbox1 có giá trị là giá trị combobox của ribbon
Em thử mãi không được, mong Thầy và các anh chị khác giúp tiếp cho em, em xin cảm ơn

Tôi biết là text sẽ cần nên đã ghi nó vào biến currText rồi còn gì. Chỉ có điều bạn cho biến đó là Public. Sau đó khi load Form thì: Textbox1.Text = currText

Sao bạn lại gặp khó khăn thế nhỉ? Tôi không chỉ viết trong code mà còn nói "oang oang" trên GPE:

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
 
Lần chỉnh sửa cuối:
Xin hỏi các anh chị cách tạo và code cho nút lệnh tương tự như nút khoanh đỏ như sau
(tác dụng của nó tương tự như checkbox)

Xin cảm ơn các anh chị
 

File đính kèm

  • BottRib.JPG
    BottRib.JPG
    25.7 KB · Đọc: 114
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT
Back
Top Bottom