Làm quen với Ribbon (1 người xem)

  • Thread starter Thread starter viehoai
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,908
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

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

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

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: 115
Chỉnh sửa lần cuối bởi điều hành viên:
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ị
Mong các anh chị giúp tạo nút lệnh tương tự như trến (bài 20). Xin cảm ơn các anh chị
 
Lần chỉnh sửa cuối:
Mong các anh chị giúp tạo nút lệnh tương tự như trến (bài 20). Xin cảm ơn các anh chị

Tương tự như trên là thế nào bạn?
Tôi đọc bài #20 từ mấy ngày trước và muốn xem cái nút đó mặt mũi thế nào, hoạt động ra sao nhưng đành chịu. Vì nó luôn luôn "đơ". Tôi tìm đọc thì thấy nói phải dùng Tablet PC.
Bạn chọn cách tốn công ít nhất: "giống A". Nhưng nếu người muốn giúp không biết A mặt mũi thế nào thì cũng đành chịu.
Tôi nghĩ bạn nên dùng cách miêu tả. Không cần biết Excel đã có nút ấy chưa, bạn có thể miêu tả nhu cầu của mình: "tôi muốn tạo nút mà có lúc nó enabled (thỏa đk nào đó), có lúc disabled (không thỏa đk nào đó). Khi click vào nó thì nếu lần trước đã làm "việc A" thì lần này sẽ làm "việc B", và ngược lại (tôi đoán thế vì bạn nói về Checkbox nào đó)"
Đại loại phải miêu tả như trên, chi tiết và đầy đủ.
Tôi hơi tò mò: tại sao bạn nghĩ "nó" giống Checkbox? "Nó" cũng có "dấu kiểm" à?
 
Thử giải thích:

Chức năng cái nút đó, nếu trên form hoặc trên sheet giống như control toggle button: Nhấn 1 cái chìm xuống, nhấn 1 cái nổi lên. Giá trị tương ứng của nó là True và False.
 
Tương tự như trên là thế nào bạn?
Tôi đọc bài #20 từ mấy ngày trước và muốn xem cái nút đó mặt mũi thế nào, hoạt động ra sao nhưng đành chịu. Vì nó luôn luôn "đơ". Tôi tìm đọc thì thấy nói phải dùng Tablet PC.
Bạn chọn cách tốn công ít nhất: "giống A". Nhưng nếu người muốn giúp không biết A mặt mũi thế nào thì cũng đành chịu.
Tôi nghĩ bạn nên dùng cách miêu tả. Không cần biết Excel đã có nút ấy chưa, bạn có thể miêu tả nhu cầu của mình: "tôi muốn tạo nút mà có lúc nó enabled (thỏa đk nào đó), có lúc disabled (không thỏa đk nào đó). Khi click vào nó thì nếu lần trước đã làm "việc A" thì lần này sẽ làm "việc B", và ngược lại (tôi đoán thế vì bạn nói về Checkbox nào đó)"
Đại loại phải miêu tả như trên, chi tiết và đầy đủ.
Tôi hơi tò mò: tại sao bạn nghĩ "nó" giống Checkbox? "Nó" cũng có "dấu kiểm" à?
Em xin lỗi vì khả năng diễn tả kém nên đành chụp hình nút lệnh mình cần có tác dụng như hình trên.
Mong được Anh quan tâm
Thử giải thích:
Chức năng cái nút đó, nếu trên form hoặc trên sheet giống như control toggle button: Nhấn 1 cái chìm xuống, nhấn 1 cái nổi lên. Giá trị tương ứng của nó là True và False.
Đúng như vậy Anh, ý em là muốn như thế
Ví dụ: Khi nhấn nút lần đầu tiên thì nút ấy được đánh dấu (xem là True) thì trên bảng tính được phép thực hiện một việc nào đó (dùng lệnh copy chẳng hạn). Nhấn tiếp 1 lần nữa, nút lệnh bỏ đánh dấu và bảng tính không cho phép thực hiện việc đó (không cho phép dùng lệnh copy).
Hoặc có thể đơn giản như vầy:
Nếu nút lệnh được đánh dấu (True) thì MsgBox "True"
Nếu nút lệnh không được đánh dấu (False) thì Msgbox "False"

CheckBox có thể làm việc này nhưng em muốn như nút lệnh trên, mong được giúp đỡ của các anh chị. Em xin cảm ơn.
 
Lần chỉnh sửa cuối:
CheckBox có thể làm việc này nhưng em muốn như nút lệnh trên, mong được giúp đỡ của các anh chị. Em xin cảm ơn.

Tôi chưa làm tới ribbon nên chưa biết gì hết. Nhưng nếu viehoai add được combobox vào, thì chắc cũng add được toggle button chứ?
 
Tôi chưa làm tới ribbon nên chưa biết gì hết. Nhưng nếu viehoai add được combobox vào, thì chắc cũng add được toggle button chứ?
Cảm ơn Anh, nhưng em không biết tên của nó. Ví dụ như Conbobox tên là comboBox, Button tên là button, vậy toggle button tên là gì? em thử togglebutton bị lỗi
 
Tên là ToggleButton, thuộc nhóm ActiveX Controls
 
Tên là ToggleButton, thuộc nhóm ActiveX Controls
Em viết Code tạo ToggleButton trong XN2007 như sau nhưng không biết sai ở đâu mà không được
[GPECODE=vb]<toggleButton id="MyToggButton" size="normal"
onAction=""Toggle_is_clicked"" getPressed=""GetPressed" " imageMso=""Chart3DPieChart""/>[/GPECODE]
 
Em viết Code tạo ToggleButton trong XN2007 như sau nhưng không biết sai ở đâu mà không được
[GPECODE=vb]<toggleButton id="MyToggButton" size="normal"
onAction=""Toggle_is_clicked"" getPressed=""GetPressed" " imageMso=""Chart3DPieChart""/>[/GPECODE]

Bỏ 2 nháy kép thành 1 thôi (""xxx""==> "xxx").
 
Bạn kiểm tra đối số các hàm "GetPressed", "Toggle_is_clicked" đã đúng theo mẫu chưa?
 
Bạn kiểm tra đối số các hàm "GetPressed", "Toggle_is_clicked" đã đúng theo mẫu chưa?
Em làm các hàm đó như sau:
[GPECODE=vb]Dim ExlObj As New wkbEvent
Sub Toggle_is_clicked(control As IRibbonControl, pressed As Boolean)
Dim ws As Worksheet
Set ws = ActiveWorkbook.Worksheets(1)
If pressed = True Then
If ExlObj Is Nothing Then Set ExlObj = New wkbEvent
Else
Set ExlObj = Nothing
End If

End Sub
Public Function GetPressed(ByVal control As IRibbonControl) As Boolean
GetPressed = False
End Function[/GPECODE]
Lỗi khi kích hoạt lần đầu tiên khi mở ra thôi, sau đó (các lần kích sau không còn báo lỗi) code chạy ngon
 
Em làm các hàm đó như sau:
[GPECODE=vb]
Public Function GetPressed(ByVal control As IRibbonControl) As Boolean
GetPressed = False
End Function[/GPECODE]
Lỗi khi kích hoạt lần đầu tiên khi mở ra thôi, sau đó (các lần kích sau không còn báo lỗi) code chạy ngon

Cần sửa lại như sau:

[GPECODE=vb]
Public Sub GetPressed(ByVal control As IRibbonControl, ByRef returnValue)
returnValue = False
End Function[/GPECODE]
 
Lần chỉnh sửa cuối:
Public Function GetPressed(ByVal control As IRibbonControl) As Boolean
GetPressed = False
End Function
1. Bạn lấy code trên ở đâu vậy? Vì Custom UI tạo SUB (không phải Function) và có 2 tham số. Tôi nghi là bạn không cho phép Custom UI tạo sub mà tự mình "bịa" ra Function mà thôi.
2. Nếu bạn đã trả về "cứng nhắc" FALSE thì cần gì nhọc công thế? Chỉ cần bỏ getPressed="GetPressed" là được. Vì sao? Vì FALSE là mặc định.
3.Tên không phải là togglebutton cũng không phải là ToggleButton mà là toggleButton
Mà bạn viết sai thì Custom UI sẽ thông báo mà. Và nó còn gợi ý tên thế nào là đúng. Bạn không thấy gợi ý thì lạ quá
4. Bạn nên đọc bác Bill ở link tôi đưa ở dưới
-------------
XML
Mã:
<?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">
<!-- them nhom go 1 nut -->
        <group id="box">
          <toggleButton id="togglebutton1" label="Toggle Button 1" onAction="toggleMacro" imageMso="HappyFace" tag="group1Button1" getPressed="IsButtonToggled"/>
          <toggleButton id="togglebutton2" label="Toggle Button 2" onAction="toggleMacro" imageMso="HappyFace" tag="group1Button2" getPressed="IsButtonToggled"/>
        </group>
      </tab>        
    </tabs>            
  </ribbon>            
</customUI>

Module
Mã:
Private rb As IRibbonUI

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
End Sub

'Callback for togglebutton1 onAction
Sub toggleMacro(control As IRibbonControl, pressed As Boolean)
MsgBox control.ID & " pressed is " & pressed
End Sub

'Callback for togglebutton1 getPressed
Sub IsButtonToggled(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "togglebutton1" Then
        returnedVal = Sheet1.Range("A1").Value = "toogle"
    Else
        returnedVal = Sheet1.Range("A2").Value = "toogle"
    End If
End Sub

End Sub
--------------
Sub IsButtonToggled được gọi 1 lần đầu tiên (mở thẻ) để thiết lập trạng thái của toggle button. Nếu vào thời điểm "chào buổi sáng" ta luôn để toggle button ở trạng thái không nhấn thì chỉ cần bỏ getPressed="IsButtonToggled" trong XML vì Pressed = FALSE là mặc định. Sau thời điểm "chào buổi sáng" thì trạng thái của toggle button sẽ thay đổi qua mỗi lần nhấn toggle button.
Ta có thể cho mỗi toggle button một Macro riêng biệt. Trong XML tôi cho chung một Macro: onAction="toggleMacro". Lúc này thì trong toggleMacro phải dùng control để xác định nút nào được nhấn để xử lý tiếp.
---------------
Về các thuộc tính của mọi nút thì bạn nên đọc tại

http://msdn.microsoft.com/en-us/library/dd926139(v=office.12).aspx

Lỗi khi kích hoạt lần đầu tiên khi mở ra thôi, sau đó (các lần kích sau không còn báo lỗi) code chạy ngon


Thì dĩ nhiên rồi. Tại sao? Vì nó chỉ được gọi 1 lần để xác định trạng thái của toggle button vào thời điểm "chào buổi sáng". Còn trạng thái ở những lần tiếp theo là do nhấn nút toggle button mà. Lôgíc quá mà bạn.
 

File đính kèm

Lần chỉnh sửa cuối:
1. Bạn lấy code trên ở đâu vậy? Vì Custom UI tạo SUB (không phải Function) và có 2 tham số. Tôi nghi là bạn không cho phép Custom UI tạo sub mà tự mình "bịa" ra Function mà thôi.
2. Nếu bạn đã trả về "cứng nhắc" FALSE thì cần gì nhọc công thế? Chỉ cần bỏ getPressed="GetPressed" là được. Vì sao? Vì FALSE là mặc định.
3.Tên không phải là togglebutton cũng không phải là ToggleButton mà là toggleButton
Mà bạn viết sai thì Custom UI sẽ thông báo mà. Và nó còn gợi ý tên thế nào là đúng. Bạn không thấy gợi ý thì lạ quá
4. Bạn nên đọc bác Bill ở link tôi đưa ở dưới
-------------
XML
Mã:
<?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">
<!-- them nhom go 1 nut -->
        <group id="box">
          <toggleButton id="togglebutton1" label="Toggle Button 1" onAction="toggleMacro" imageMso="HappyFace" tag="group1Button1" getPressed="IsButtonToggled"/>
          <toggleButton id="togglebutton2" label="Toggle Button 2" onAction="toggleMacro" imageMso="HappyFace" tag="group1Button2" getPressed="IsButtonToggled"/>
        </group>
      </tab>        
    </tabs>            
  </ribbon>            
</customUI>

Module
Mã:
Private rb As IRibbonUI

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
End Sub

'Callback for togglebutton1 onAction
Sub toggleMacro(control As IRibbonControl, pressed As Boolean)
MsgBox control.ID & " pressed is " & pressed
End Sub

'Callback for togglebutton1 getPressed
Sub IsButtonToggled(control As IRibbonControl, ByRef returnedVal)
    If control.ID = "togglebutton1" Then
        returnedVal = Sheet1.Range("A1").Value = "toogle"
    Else
        returnedVal = Sheet1.Range("A2").Value = "toogle"
    End If
End Sub

End Sub
--------------
Sub IsButtonToggled được gọi 1 lần đầu tiên (mở thẻ) để thiết lập trạng thái của toggle button. Nếu vào thời điểm "chào buổi sáng" ta luôn để toggle button ở trạng thái không nhấn thì chỉ cần bỏ getPressed="IsButtonToggled" trong XML vì Pressed = FALSE là mặc định. Sau thời điểm "chào buổi sáng" thì trạng thái của toggle button sẽ thay đổi qua mỗi lần nhấn toggle button.
Ta có thể cho mỗi toggle button một Macro riêng biệt. Trong XML tôi cho chung một Macro: onAction="toggleMacro". Lúc này thì trong toggleMacro phải dùng control để xác định nút nào được nhấn để xử lý tiếp.
---------------
Về các thuộc tính của mọi nút thì bạn nên đọc tại

http://msdn.microsoft.com/en-us/library/dd926139(v=office.12).aspx

Thì dĩ nhiên rồi. Tại sao? Vì nó chỉ được gọi 1 lần để xác định trạng thái của toggle button vào thời điểm "chào buổi sáng". Còn trạng thái ở những lần tiếp theo là do nhấn nút toggle button mà. Lôgíc quá mà bạn.
Bài giảng rất hay cho em và cho mọi người, em đã hiểu. Em cảm ơn Thầy rất nhiều.
Cảm ơn các anh đã giúp đỡ
 
Hỏi về code gán dữ liệu cho EditBox trên Ribbon

Chào mọi người, mình đang thực hành các thao tác với Ribbon và có vấn đề thắc mắc như hình bên dưới. Xin hỏi làm cách nào để khi click vào 1 cell bất kỳ nào đó (SelectionChange) thì EditBox "Ho va Ten" trên Ribbon thể hiện đúng nội dung của Activecell.

Ví dụ: chọn [A1] --> EditBox = "Dũng", ...

Mọi người xem giúp file đính kèm, code tạo ribbon viết trong Custom UI Editor For MSO. Xin cảm ơn!

12-06-201311-12-09AM.png
 

File đính kèm

Lần chỉnh sửa cuối:
Chào mọi người, mình đang thực hành các thao tác với Ribbon và có vấn đề thắc mắc như hình bên dưới. Xin hỏi làm cách nào để khi click vào 1 cell bất kỳ nào đó (SelectionChange) thì EditBox "Ho va Ten" trên Ribbon thể hiện đúng nội dung của Activecell.

Ví dụ: chọn [A1] --> EditBox = "Dũng", ...

Mọi người xem giúp file đính kèm, code tạo ribbon viết trong Custom UI Editor For MSO. Xin cảm ơn!

12-06-201311-12-09AM.png

Vào thời điểm "Chào buổi sáng" thì interface IRibbonUI sẽ gọi call back getText. Tất nhiên ở thời điểm bất kỳ bạn có thể thực hiện code của getText bằng cách gọi method của IRibbonUI
Mã:
rb.InvalidateControl ("editBox1")

Để gọi được method thì bạn phải có object (interface). Vì thế trong RibbonLoad bạn ghi nhớ vào biến rb
Kết quả là IRibbonUI sẽ gọi getText
Vậy tôi đề nghị như sau:
1. Trong Worksheet_SelectionChange gọi sub DoText
2. Trong DoText gọi rb.InvalidateControl ("editBox1")
3. Trong getText "cung cấp" text để IRibbonUI nhập vào editBox. Ở thời điểm "Chào buổi sáng" tôi cung cấp text rỗng, bạn sửa lại theo nhu cầu.
------------
XML
Mã:
<?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>

code Sheet1
Mã:
'Private Sub Worksheet_Change(ByVal Target As Range)
'    If Target.Address = "$B$1" Then
'        If Target.Value <> "Em lay bac" Then
'            currText = "H" & ChrW(227) & "y nh" & ChrW(7853) & "p: Em lay bac"
'        Else
'            currText = "Em l" & ChrW(7853) & "y b" & ChrW(225) & "c"
'        End If
'        DoText
'    End If
'End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        currText = Target.Value
        DoText
    End If
End Sub

Module1
Mã:
Private rb As IRibbonUI
Public currText As String

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
End Sub

'Callback for editBox1 onChange
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    MsgBox text
End Sub

'Callback for editBox1 getText
Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = currText
End Sub

Sub DoText()
    rb.InvalidateControl ("editBox1")
End Sub
 

File đính kèm

Vào thời điểm "Chào buổi sáng" thì interface IRibbonUI sẽ gọi call back getText. Tất nhiên ở thời điểm bất kỳ bạn có thể thực hiện code của getText bằng cách gọi method của IRibbonUI
Mã:
rb.InvalidateControl ("editBox1")

Để gọi được method thì bạn phải có object (interface). Vì thế trong RibbonLoad bạn ghi nhớ vào biến rb
Kết quả là IRibbonUI sẽ gọi getText
Vậy tôi đề nghị như sau:
1. Trong Worksheet_SelectionChange gọi sub DoText
2. Trong DoText gọi rb.InvalidateControl ("editBox1")
3. Trong getText "cung cấp" text để IRibbonUI nhập vào editBox. Ở thời điểm "Chào buổi sáng" tôi cung cấp text rỗng, bạn sửa lại theo nhu cầu.
------------
XML
Mã:
<?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>

code Sheet1
Mã:
'Private Sub Worksheet_Change(ByVal Target As Range)
'    If Target.Address = "$B$1" Then
'        If Target.Value <> "Em lay bac" Then
'            currText = "H" & ChrW(227) & "y nh" & ChrW(7853) & "p: Em lay bac"
'        Else
'            currText = "Em l" & ChrW(7853) & "y b" & ChrW(225) & "c"
'        End If
'        DoText
'    End If
'End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Column = 1 And Target.Count = 1 Then
        currText = Target.Value
        DoText
    End If
End Sub

Module1
Mã:
Private rb As IRibbonUI
Public currText As String

'Callback for customUI.onLoad
Sub RibbonLoad(ribbon As IRibbonUI)
    Set rb = ribbon
End Sub

'Callback for editBox1 onChange
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    MsgBox text
End Sub

'Callback for editBox1 getText
Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = currText
End Sub

Sub DoText()
    rb.InvalidateControl ("editBox1")
End Sub

Tuyệt cú mèo anh ơi, như vậy là có thể ghi nội dung vào EditBox ở thời điểm bất kỳ. Em thắc mắc là liệu có thể làm được bài toán ngược hay không? Tức là, vào 1 thời điểm bất kỳ làm sao mình đọc được nội dung của EditBox hả anh???

Ví dụ: Tại thời điểm bất kỳ EditBox đang có nội dung là "Abc123", phải viết code làm sao để lấy được chuỗi "Abc123", một lần nữa thank a rất nhiều!
 
Tuyệt cú mèo anh ơi, như vậy là có thể ghi nội dung vào EditBox ở thời điểm bất kỳ. Em thắc mắc là liệu có thể làm được bài toán ngược hay không? Tức là, vào 1 thời điểm bất kỳ làm sao mình đọc được nội dung của EditBox hả anh???

Ví dụ: Tại thời điểm bất kỳ EditBox đang có nội dung là "Abc123", phải viết code làm sao để lấy được chuỗi "Abc123", một lần nữa thank a rất nhiều!

Text hiện hành trong editBox thì bạn "ghi nhớ" ở trong currText. Chỉ có 2 khả năng: hoặc bạn nhập vào editBox bằng code bằng cách gọi DoText, hoặc người dùng gõ / dán từ bộ nhớ (Ctrl+V). Người dùng gõ / dán thì bạn có EditBoxTextChanged.

Vậy thì thay

Mã:
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    MsgBox text
End Sub

bằng

Mã:
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    currText = text
End Sub

Và ở thời điểm bất kỳ thì đọc ở currText ra thôi. Tôi cố tình đặt biến là currText = current text, tức văn bản hiện hành mà
 
Text hiện hành trong editBox thì bạn "ghi nhớ" ở trong currText. Chỉ có 2 khả năng: hoặc bạn nhập vào editBox bằng code bằng cách gọi DoText, hoặc người dùng gõ / dán từ bộ nhớ (Ctrl+V). Người dùng gõ / dán thì bạn có EditBoxTextChanged.

Vậy thì thay

Mã:
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    MsgBox text
End Sub

bằng

Mã:
Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    currText = text
End Sub

Và ở thời điểm bất kỳ thì đọc ở currText ra thôi. Tôi cố tình đặt biến là currText = current text, tức văn bản hiện hành mà

Dạ em cũng có nghĩ đến cách này, nhưng thấy hạn chế ở chỗ là nếu như trong quá trình chạy code mà phát sinh lỗi thì mấy cái biến toàn cục rbcurrText nó cũng bị xoá mất luôn, nên đôi lúc gọi rb.InvalidateControl thì nó báo lỗi không tìm thấy object và currText nó cũng thành chuỗi rỗng trong khi EditBox vẫn có nội dung.
 
Lần chỉnh sửa cuối:
Dạ em cũng có nghĩ đến cách này, nhưng thấy hạn chế ở chỗ là nếu như trong quá trình chạy code mà phát sinh lỗi thì mấy cái biến toàn cục rbcurrText nó cũng bị xoá mất luôn, nên đôi lúc gọi rb.InvalidateControl thì nó báo lỗi không tìm thấy object và currText nó cũng thành chuỗi rỗng trong khi EditBox vẫn có nội dung.

Bạn lo xa cũng đúng thôi.
Text có thể ghi vào nhiều chỗ để khi có sự cố thì đọc ra. Ghi vào đâu thì tùy bạn "láu cá" đến đâu. Có thể

tạo name với giá trị là currText. Khi cần thì đọc từ name ra
Ví dụ:

Mã:
Sub RibbonLoad(ribbon As IRibbonUI)
    ...
    currText = Chr(32)
    ThisWorkbook.Names.Add Name:="editBoxText", RefersTo:=currText
End Sub

Sub EditBoxTextChanged(control As IRibbonControl, text As String)
    currText = text
    ThisWorkbook.Names("editBoxText").RefersTo = currText
End Sub

Sub GetEditBoxText(control As IRibbonControl, ByRef returnedVal)
    returnedVal = currText
    ThisWorkbook.Names("editBoxText").RefersTo = currText
End Sub

Sub Button1_Click()
'   doc Text trong editBox
    MsgBox Replace(Replace(ThisWorkbook.Names("editBoxText").RefersTo, "=", ""), Chr(34), "")
End Sub
----------
Tất nhiên khi mà pointer đã "bị mất" thì để tiếp tục làm việc - vd. gọi rb.InvalidateControl ("editBox1")

trong DoText - thì vẫn phải phục hồi pointer. Tức ở thời điểm "Chào buổi sáng" ta tạo name vd.

"RibbonPoiter" và cho RefersTo = pointer của rb. Khi ta mất pointer thì phục hồi lại từ RefersTo.
 
Thầy siwtom và anh chị GPE cho em hỏi thêm.
Có cách nào tạo ra kiểu ribbon như hình mẫu trên không ạ.

Hình 1: Một box gần giống như gallerry gồm 3 spinbutton để chọn các image trong danh sách. Cái này em không biết tên gọi của controls này là cái gì để lên google search cho đúng.
1.png

Hình 2: Khi click vào button bên dưới thì cái gallery xổ xuống thì như hình dưới. (Cái này em làm được)
2.jpg



Cảm ơn thầy và anh chị trên diễn đàn rất nhiều.

Mong nhận được hồi đáp từ mọi người.
 
Em vừa tìm ra controls đó tên In-RibbonGallery
Tuy nhiên em tìm trên mạng thì không thấy thông tin nào dùng để tạo controls này trên môi trường VBA cả.
Trên VSTO thì có.
Nhờ thầy và anh chị trong diễn đàn tìm được thông tin về cotrols này thì cho em một ví dụ được không ạ.

Cảm ơn mọi người.
 

File đính kèm

  • 1.png
    1.png
    7.6 KB · Đọc: 22
Lần chỉnh sửa cuối:
File Test mình thay đổi arrItem chỗ này
Mã:
Sub RibbonLoad(rb As IRibbonUI)    Set ribbon = rb
    arrItem = WorksheetFunction.Transpose(Range(Sheets("SOY").Range("c11"), Sheets("SOY").Range("c65000").End(xlUp)))
End Sub
Thì đoạn này báo lỗi
Mã:
Sub GetItemLabel(control As IRibbonControl, index As Integer, ByRef itemLabel)    
itemLabel = arrItem(index)
End Sub

Xin thầy cô & ace giúp đỡ
 

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

Back
Top Bottom