Làm quen với Ribbon (2 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

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à
 
Web KT

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

Back
Top Bottom