Đối tượng Command Button

Liên hệ QC

Mr Okebab

Ngon Ngất Ngây
Thành viên đã mất
Tham gia
6/8/06
Bài viết
3,260
Được thích
3,787
Mình 1 sheet có nhiều Command Button (100 chẳng hạn) . Mình muốn khi Click vào CB nào thì CB đó chuyển sang màu xanh, còn các CB khác vẫn màu xám nhạt.

Muốn dùng vòng lặp For Each nhưng lại không biết cách, chỉ điều khiển được kích cỡ của chúng vì thuộc tính BackColor không thấy đâu.

Vậy thì phải khai báo như thế nào nhỉ ???

Cảm ơn nhiều :
PHP:
Sub ChangeCB(CB As String)
    Application.ScreenUpdating = False
    Dim i As Integer
    Dim CBi As OLEObject
    Range("A1") = CB
    i = 1
    For Each CBi In ActiveSheet.OLEObjects
        i = i + 1
        Range("B" & i) = CBi.Name
        Range("C" & i) = CBi.progID
        If CBi.progID = "Forms.CommandButton.1" Then
        If CBi.Name = Sheet1.Range("A1").Value Then
            CBi.Height = 45
        Else
            CBi.Height = 25
        End If: End If: Next
    Range("A1").ClearContents
    Application.ScreenUpdating = True
End Sub
Thân!
 

File đính kèm

Mã:
Private Sub CB2_Click()
   CB2.BackColor = &H8000000D
    'ChangeCB Sheet1.CB2.Name
End Sub

Mã này chạy tốt, có lẽ do bác dùng OLEObject nó không hỗ trợ Properties.BackColor mà.

Khai báo CBi là ActiveX.CommandButton được không nhỉ?
 
Upvote 0
LearnExcel đã viết:
Mã:
Private Sub CB2_Click()
   CB2.BackColor = &H8000000D
    'ChangeCB Sheet1.CB2.Name
End Sub
Mã này chạy tốt, có lẽ do bác Late Binding nên nó không nhận.
Cảm ơn bác nhiều, nhưng bác hiểu nhầm ý của em rồi.
Em muốn bác thay đổi ở Sub ChangCB cơ, để khi có 100 Command Button, em chỉ cần gọi Sub ChangeCB ra là nó sẽ chuyển sang màu xanh, còn các Command Button khác sẽ chuyển sang màu xám.

Chứ như của bác thì chỉ thay đổi được màu của chính nó, còn 99 Command Button khác thì sao ???
Nếu bác viết ra 99 dòng code để thay đổi 99 Command Button này thì e rằng . . quá phí.

Đấy mới chỉ là 1 Command Button thôi.
Bác hãy xem qua File của em nhé.


Em có thể khai báo :
Dim CBi as CommandButton
Nhưng lại không thể chạy
For each CBi in ActiveSheet.CommandButtons
Khai báo như thế nào để nó chỉ quét các Command Button thôi bác nhỉ ??

PHP:
 có lẽ do bác dùng OLEObject nó không hỗ trợ Properties.BackColor mà.
Khai báo CBi là ActiveX.CommandButton được không nhỉ?

Cuối cùng bác đã hiểu em. Tuy nhiên khai thế nào nhỉ ???+-+-+-++-+-+-+


Thân!
 
Upvote 0
Đành khất bác vậy, nhưng có thể bác
"thư giãn" với đoạn code sau về Tooltip OLEobject và CommandButton vậy

Expert: Richard Stephens
Date: 9/29/2006
Subject: tooltip on CommandButton

Question
Richard Stephens:

How do you add a tooltip to a CommandButton?

Thanks,

Rodney
---------------------------
Answer
Rodney

It can only be emulated by using a VBA solution, if you are familiar with VBA I can send you a sample, or better still have a look below. I haven't used it so can't guarantee anything

To do this, put the following code in a standard code module (making it
available to the whole workbook).

Mã:
'------------- bas module ------------------------ 
Option Explicit 


Declare Function GetSystemMetrics Lib "user32" ( _ 
   ByVal nIndex As Long) As Long 


Declare Function GetSysColor Lib "user32" ( _ 
   ByVal nIndex As Long) As Long 


Public Function CreateToolTipLabel(objHostOLE As Object, _ 
                                  sTTLText As String) As Boolean 
Dim objToolTipLbl As OLEObject 
Dim objOLE As OLEObject 


Const SM_CXSCREEN = 0 
Const COLOR_INFOTEXT = 23 
Const COLOR_INFOBK = 24 
Const COLOR_WINDOWFRAME = 6 


 Application.ScreenUpdating = False   'just while label is created and 
formatted 


 For Each objOLE In ActiveSheet.OLEObjects 
     If objOLE.Name = "TTL" Then objOLE.Delete 'only one can exist at a 
time 
 Next objOLE 


'create a label control... 
 Set objToolTipLbl = ActiveSheet.OLEObjects.Add(ClassType:="Forms.Label.1") 


'...and format it to look as a ToolTipWindow 
 With objToolTipLbl 
     .Top = objHostOLE.Top + objHostOLE.Height - 10 
     .Left = objHostOLE.Left + objHostOLE.Width - 10 
     .Object.Caption = sTTLText 
     .Object.Font.Size = 8 
     .Object.BackColor = GetSysColor(COLOR_INFOBK) 
     .Object.BackStyle = 1 
     .Object.BorderColor = GetSysColor(COLOR_WINDOWFRAME) 
     .Object.BorderStyle = 1 
     .Object.ForeColor = GetSysColor(COLOR_INFOTEXT) 
     .Object.TextAlign = 1 
     .Object.AutoSize = False 
     .Width = GetSystemMetrics(SM_CXSCREEN) 
     .Object.AutoSize = True 
     .Width = .Width + 2 
     .Height = .Height + 2 
     .Name = "TTL" 
 End With 
 DoEvents 
 Application.ScreenUpdating = True 


'delete the tooltip window after 3 secs 
 Application.OnTime Now() + TimeValue("00:00:05"), "DeleteToolTipLabels" 


End Function 


Public Sub DeleteToolTipLabels() 
Dim objToolTipLbl As OLEObject 
 For Each objToolTipLbl In ActiveSheet.OLEObjects 
     If objToolTipLbl.Name = "TTL" Then objToolTipLbl.Delete 
 Next objToolTipLbl 
End Sub 


'------------end of bas module -------------
Then in the code module for the sheet that has the control, add some
mousedown event code. To get to this module, right-click on the sheet name
tab, and select code (or double-click on the sheet name from within the VB
IDE). Here is an example of how to call it, assuming that the command button
is called cmdTooltipTest

Mã:
Private Sub CmdTooltipTest_MouseMove(ByVal Button As Integer, _ 
                              ByVal Shift As Integer, _ 
                              ByVal X As Single, _ 
                              ByVal Y As Single) 
Dim objTTL As OLEObject 
Dim fTTL As Boolean 


 For Each objTTL In ActiveSheet.OLEObjects 
     fTTL = objTTL.Name = "TTL" 
 Next objTTL 


 If Not fTTL Then 
    CreateToolTipLabel cmdTooltipTest, "ToolTip Label" 
  End If 


End Sub
 
Upvote 0
còn đây là cách chỉ Loop các CommandButton

Mã:
Sub test()
Dim sh As Shape
For Each sh In ActiveSheet.Shapes
        If Left(sh.Name, 2) = "CB" Then sh.Delete
    Next
End Sub
 
Upvote 0
Hu hu nhưng tìm mỏi cả mắt cũng chảng thấy Property Color đâu cả (Shape Object Members)
 
Upvote 0
Mr Okebab đã viết:
Mình 1 sheet có nhiều Command Button (100 chẳng hạn) . Mình muốn khi Click vào CB nào thì CB đó chuyển sang màu xanh, còn các CB khác vẫn màu xám nhạt.

Muốn dùng vòng lặp For Each nhưng lại không biết cách, chỉ điều khiển được kích cỡ của chúng vì thuộc tính BackColor không thấy đâu.

Vậy thì phải khai báo như thế nào nhỉ ???

Cảm ơn nhiều :
PHP:
Sub ChangeCB(CB As String)
    Application.ScreenUpdating = False
    Dim i As Integer
    Dim CBi As OLEObject
    Range("A1") = CB
    i = 1
    For Each CBi In ActiveSheet.OLEObjects
        i = i + 1
        Range("B" & i) = CBi.Name
        Range("C" & i) = CBi.progID
        If CBi.progID = "Forms.CommandButton.1" Then
        If CBi.Name = Sheet1.Range("A1").Value Then
            CBi.Height = 45
        Else
            CBi.Height = 25
        End If: End If: Next
    Range("A1").ClearContents
    Application.ScreenUpdating = True
End Sub
Thân!

Mr Okebab chưã thành như sau là được.

Mã:
Sub ChangeCB(CB As String)
    Application.ScreenUpdating = False
    Dim i As Integer
    Dim CBi As OLEObject
    Range("A1") = CB
    i = 1
    For Each CBi In ActiveSheet.OLEObjects
        i = i + 1
        Range("B" & i) = CBi.Name
        Range("C" & i) = CBi.progID
        If CBi.progID = "Forms.CommandButton.1" Then
        If CBi.Name = Sheet1.Range("A1").Value Then
            CBi.Height = 45
            [COLOR="Red"]CBi.[B]Object[/B].BackColor = vbYellow[/COLOR]
        Else
            [COLOR="Red"]CBi.[B]Object[/B].BackColor = vb3DFace[/COLOR]
            CBi.Height = 25
        End If: End If: Next
    Range("A1").ClearContents
    Application.ScreenUpdating = True
End Sub

Các bạn tham khảo thêm ví dụ "clsCommandButton" - "Class module - Kỹ thuật Wrapping đối tượng" nhé!
http://www.giaiphapexcel.com/forum/showthread.php?p=40609#post40609

Chúc vui vẻ!
 
Upvote 0
TuanVNUNI đã viết:
Mr Okebab chưã thành như sau là được.


Các bạn tham khảo thêm ví dụ "clsCommandButton" - "Class module - Kỹ thuật Wrapping đối tượng" nhé!
http://www.giaiphapexcel.com/forum/showthread.php?p=40609#post40609

Chúc vui vẻ!

Tuyệt vời bác ạ. Nhưng làm sao biết BackColor là một thuộc tính của Obbject vậy bác ??? Em không hiểu lắm.

Nếu muốn tìm thuộc tính nào đó cho 1 đối tượng thì phải làm sao vậy bác ??

Cảm ơn thật nhiều!!

Thân!
 
Upvote 0
Mr Okebab đã viết:
Tuyệt vời bác ạ. Nhưng làm sao biết BackColor là một thuộc tính của Obbject vậy bác ??? Em không hiểu lắm.

Nếu muốn tìm thuộc tính nào đó cho 1 đối tượng thì phải làm sao vậy bác ??

Cảm ơn thật nhiều!!

Thân!

CommandButton có những thuộc tính nào thì Object sẽ có thuộc tính đó (mặc dù không nhìn thấy).

(*) Object là thuộc tính kiểu đối tượng chuẩn của WINDOWS quản lý nên gần như bất kỳ một Control nào đều có thể gán với nó - Object.
Để tường minh hơn mình dùng phương pháp "hack" class và mã thủ tục "ChangeCB" chữa lại một ít như sau:
Mã:
Sub ChangeCB(CB As String)
    Application.ScreenUpdating = False
    Dim i As Integer
    Dim CBi As OLEObject

    [COLOR="Red"]Dim objBtn As MSForms.CommandButton[/COLOR]
    
    Range("A1") = CB
    i = 1
    For Each CBi In ActiveSheet.OLEObjects
        i = i + 1
        Range("B" & i) = CBi.Name
        Range("C" & i) = CBi.progID
        If CBi.progID = "Forms.CommandButton.1" Then
        Set objBtn = CBi.Object
        If CBi.Name = Sheet1.Range("A1").Value Then
            CBi.Height = 45
            [COLOR="Red"]objBtn[/COLOR].BackColor = vbYellow
        Else
            [COLOR="Red"]objBtn[/COLOR].BackColor = vb3DFace
            CBi.Height = 25
        End If: End If: Next
    Range("A1").ClearContents
    Application.ScreenUpdating = True
End Sub

Khi soạn thỏa các lệnh trên, gõ objBtn rồi gõ dấu chấm (.) bạn sẽ thấy các thành phần của CommandButton hiện hết ra.

Với các hiểu trên các bạn có thể áp dụng cho bất kỳ một Control nào thuộc MSForm.

Chúc thành công!
 
Lần chỉnh sửa cuối:
Upvote 0
TuanVNUNI đã viết:
CommandButton có những thuộc tính nào thì Object sẽ có thuộc tính đó (mặc dù không nhìn thấy).

(*) Object là thuộc tính kiểu đối tượng chuẩn của WINDOWS quản lý nên gần như bất kỳ một Control nào đều có thể gán với nó - Object.
Để tường minh hơn mình dùng phương pháp "hack" class và mã thủ tục "ChangeCB" chữa lại một ít như sau:
Mã:
Sub ChangeCB(CB As String)
    Application.ScreenUpdating = False
    Dim i As Integer
    Dim CBi As OLEObject

    [COLOR=Red]Dim objBtn As MSForms.CommandButton[/COLOR]
    
    Range("A1") = CB
    i = 1
    For Each CBi In ActiveSheet.OLEObjects
        i = i + 1
        Range("B" & i) = CBi.Name
        Range("C" & i) = CBi.progID
        If CBi.progID = "Forms.CommandButton.1" Then
        Set objBtn = CBi.Object
        If CBi.Name = Sheet1.Range("A1").Value Then
            CBi.Height = 45
            [COLOR=Red]objBtn[/COLOR].BackColor = vbYellow
        Else
            [COLOR=Red]objBtn[/COLOR].BackColor = vb3DFace
            CBi.Height = 25
        End If: End If: Next
    Range("A1").ClearContents
    Application.ScreenUpdating = True
End Sub
Khi soạn thỏa các lệnh trên, gõ objBtn rồi gõ dấu chấm (.) bạn sẽ thấy các thành phần của CommandButton hiện hết ra.

Với các hiểu trên các bạn có thể áp dụng cho bất kỳ một Control nào thuộc MSForm.

Chúc thành công!

Tuyệt vời, cảm ơn bác nhiều. Kỹ thuật này đối với dân ngoại đạo như em thì phải nói là tuyệt chiêu, vì em cũng đang định hỏi cho nhiều cái khác.
Nhưng có cài này là OK rồi.

Cảm ơn nhiều!!

Thân!
 
Upvote 0
Web KT

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

Back
Top Bottom