Làm sao xác định được tên của control trên userform khi ta click vào? (3 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Với Shape ở trong sheet, ta có thủ tục dưới đây để xác định:

Sheet1.Shapes(Application.Caller).Name

Thế nhưng, với UserForm thì dùng thủ tục dưới đây sẽ bị lỗi:

MsgBox Controls(Application.Caller).Name

Xin vui lòng cho hỏi làm sao để khi Click vào 1 label thì nó trả về tên của label đó?

Mã:
Private Sub Label1_Click()
      MsgBox Controls(Application.Caller).Name
      'Tra ve la "Label1"
End Sub


Cám ơn rất nhiều!
 
Với Shape ở trong sheet, ta có thủ tục dưới đây để xác định:

Sheet1.Shapes(Application.Caller).Name

Thế nhưng, với UserForm thì dùng thủ tục dưới đây sẽ bị lỗi:

MsgBox Controls(Application.Caller).Name

Xin vui lòng cho hỏi làm sao để khi Click vào 1 label thì nó trả về tên của label đó?

Mã:
Private Sub Label1_Click()
      MsgBox Controls(Application.Caller).Name
      'Tra ve la "Label1"
End Sub


Cám ơn rất nhiều!
Dùng ClassModule, chỉ có thế thôi
Áp dụng cho mọi Control thuộc ActiveX
 
Upvote 0
Thầy có thể nó rõ hơn được không ạ? Thầy biết tỏng là em chưa biết sử dụng ClassModule mà!
Chèn code sau vào class:
Mã:
Public WithEvents LabelEvents As MSForms.Label

Private Sub LabelEvents_Click()
    MsgBox "Ban vua click """ & LabelEvents.Name & """"
End Sub

Chèn code sau vào form

Mã:
Dim Labels() As New Class1

Private Sub UserForm_Initialize()
    Dim Counter As Integer, Obj As Control
    For Each Obj In Me.Controls
        If TypeOf Obj Is MSForms.Label Then
            Counter = Counter + 1
            ReDim Preserve Labels(1 To Counter)
            Set Labels(Counter).LabelEvents = Obj
        End If
    Next
    Set Obj = Nothing

End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thầy làm ơn nói rõ hơn được không ạ? Thầy biết tỏng là em chưa biết sử dụng ClassModule mà!
Ví dụ trong Form có sự hiện diện của CommandButton, Label và CheckBox. Giờ ta viết code:
1> Chèn 1 Class Module (tên Class1) và code:
Mã:
Public WithEvents cmd As MSForms.CommandButton
Public WithEvents lbl As MSForms.Label
Public WithEvents chk As MSForms.CheckBox

Private Sub chk_Click()
  MsgBox chk.Name
End Sub

Private Sub cmd_Click()
  MsgBox cmd.Name
End Sub

Private Sub lbl_Click()
  MsgBox lbl.Name
End Sub
2> Code trong UserForm
Mã:
Dim ObjCmd() As New Class1, ObjLbl() As New Class1, ObjChk() As New Class1
Private Sub UserForm_Initialize()
  Dim Ctrl As Control
  Dim x As Long, y As Long, z As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      x = x + 1
      ReDim Preserve ObjCmd(1 To x)
      Set ObjCmd(x).cmd = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.Label Then
      y = y + 1
      ReDim Preserve ObjLbl(1 To y)
      Set ObjLbl(y).lbl = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
      z = z + 1
      ReDim Preserve ObjChk(1 To z)
      Set ObjChk(z).chk = Ctrl
    End If
  Next
End Sub
 
Upvote 0
Chèn code sau vào class:
Mã:
Public WithEvents LabelEvents As MSForms.Label

Private Sub LabelEvents_Click()
    MsgBox "Ban vua click """ & LabelEvents.Name & """"
End Sub

Chèn code sau vào form

Mã:
Dim Labels() As New Class1
[COLOR=#ff0000][B]Private Sub Label1_Click()[/B][/COLOR]
    Dim Counter As Integer, Obj As Control
    For Each Obj In Me.Controls
        If TypeOf Obj Is MSForms.Label Then
            Counter = Counter + 1
            ReDim Preserve Labels(1 To Counter)
            Set Labels(Counter).LabelEvents = Obj
        End If
    Next
    Set Obj = Nothing

End Sub

Hình như phải đặt vào sự kiện UserForm_Initialize phải không nhỉ? Mà sao anh chép vào sự kiện nào cũng báo lỗi Object Required?
 
Upvote 0
Upvote 0
Ví dụ trong Form có sự hiện diện của CommandButton, Label và CheckBox. Giờ ta viết code:
1> Chèn 1 Class Module (tên Class1) và code:
Mã:
Public WithEvents cmd As MSForms.CommandButton
Public WithEvents lbl As MSForms.Label
Public WithEvents chk As MSForms.CheckBox

Private Sub chk_Click()
  MsgBox chk.Name
End Sub

Private Sub cmd_Click()
  MsgBox cmd.Name
End Sub

Private Sub lbl_Click()
  MsgBox lbl.Name
End Sub
2> Code trong UserForm
Mã:
Dim ObjCmd() As New [COLOR=#ff0000][B]Class1[/B][/COLOR], ObjLbl() As New [COLOR=#ff0000][B]Class1[/B][/COLOR], ObjChk() As New [COLOR=#ff0000][B]Class1[/B][/COLOR]
Private Sub UserForm_Initialize()
  Dim Ctrl As Control
  Dim x As Long, y As Long, z As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      x = x + 1
      ReDim Preserve ObjCmd(1 To x)
      Set ObjCmd(x).cmd = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.Label Then
      y = y + 1
      ReDim Preserve ObjLbl(1 To y)
      Set ObjLbl(y).lbl = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
      z = z + 1
      ReDim Preserve ObjChk(1 To z)
      Set ObjChk(z).chk = Ctrl
    End If
  Next
End Sub

À, em dần hiểu rồi đấy! với mấy cái tô đỏ, tức là tên của ClassModule phải không ạ?

Cám ơn Thầy và Hai Lúa Miền Tây rất nhiều!
 
Lần chỉnh sửa cuối:
Upvote 0
Ví dụ trong Form có sự hiện diện của CommandButton, Label và CheckBox. Giờ ta viết code:
1> Chèn 1 Class Module (tên Class1) và code:
Mã:
Public WithEvents cmd As MSForms.CommandButton
Public WithEvents lbl As MSForms.Label
Public WithEvents chk As MSForms.CheckBox

Private Sub chk_Click()
  MsgBox chk.Name
End Sub

Private Sub cmd_Click()
  MsgBox cmd.Name
End Sub

Private Sub lbl_Click()
  MsgBox lbl.Name
End Sub
2> Code trong UserForm
Mã:
Dim ObjCmd() As New Class1, ObjLbl() As New Class1, ObjChk() As New Class1
Private Sub UserForm_Initialize()
  Dim Ctrl As Control
  Dim x As Long, y As Long, z As Long
  For Each Ctrl In Me.Controls
    If TypeOf Ctrl Is MSForms.CommandButton Then
      x = x + 1
      ReDim Preserve ObjCmd(1 To x)
      Set ObjCmd(x).cmd = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.Label Then
      y = y + 1
      ReDim Preserve ObjLbl(1 To y)
      Set ObjLbl(y).lbl = Ctrl
    ElseIf TypeOf Ctrl Is MSForms.CheckBox Then
      z = z + 1
      ReDim Preserve ObjChk(1 To z)
      Set ObjChk(z).chk = Ctrl
    End If
  Next
End Sub
Với checkbox, commandbutton, textbox... thì không cần khai báo thế đâu Thầy.
 
Lần chỉnh sửa cuối:
Upvote 0
Với checkbox, commandbutton, textbox thì không cần khai báo thế đâu Thầy.

Thế thì khai báo thế nào mới đúng?
Chắc là Hai Lúa muốn khai báo kiểu Public WithEvents cmd As CommandButton
Cũng được nhưng với CheckBox và TextBox thì không được đâu nha
Bởi vậy với mọi Control thuộc FM20.DLL thì cứ vầy: Public WithEvents cmd As MSForms.CommandButton cho chắc cú (sẽ không nhầm với object thuộc Forms Control)
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Code này cho vào sự kiện click của từng control, hơi bất tiện nhưng khỏi dùng class

Thì vậy
Ở đây đang nói 1 form có nhiều control cơ mà, nếu viết code cho từng control thì không có gì để nói cả
Nói tóm lại: nếu tôi có 1 form có độ vài chục control thì chẳng đời nào tôi lại viết code riêng cả --> Mệt chết ---> Cứ thằng nào cùng tính chất thì dùng Class gom vào làm một
 
Upvote 0
Thì vậy
Ở đây đang nói 1 form có nhiều control cơ mà, nếu viết code cho từng control thì không có gì để nói cả
Nói tóm lại: nếu tôi có 1 form có độ vài chục control thì chẳng đời nào tôi lại viết code riêng cả --> Mệt chết ---> Cứ thằng nào cùng tính chất thì dùng Class gom vào làm một
Vì bài 1 như sau:

Với Shape ở trong sheet, ta có thủ tục dưới đây để xác định:

Sheet1.Shapes(Application.Caller).Name

Thế nhưng, với UserForm thì dùng thủ tục dưới đây sẽ bị lỗi:

MsgBox Controls(Application.Caller).Name

Xin vui lòng cho hỏi làm sao để khi Click vào 1 label thì nó trả về tên của label đó?

Mã:
Private Sub Label1_Click()
      MsgBox Controls(Application.Caller).Name
      'Tra ve la "Label1"
End Sub


Cám ơn rất nhiều!

Nên dùng
Mã:
Private Sub Label1_Click()
      MsgBox Me.ActiveControl.Name
      'Tra ve la "Label1"
End Sub

Là hợp đề tài.
 
Upvote 0
Vì bài 1 như sau:



Nên dùng
Mã:
Private Sub Label1_Click()
      MsgBox Me.ActiveControl.Name
      'Tra ve la "Label1"
End Sub

Là hợp đề tài.

Dám cá với Hai Lúa rằng Nghĩa hỏi bài này là cho cái Calendar (không tin cứ hỏi)... Nếu không thì thà tôi viết
Mã:
Private Sub [COLOR=#ff0000]Label1[/COLOR]_Click()
   MsgBox  [COLOR=#0000cd]""[/COLOR]
End Sub
Xong, tôi copy cái màu đó paste vào giữa cặp nháy đôi ---> Hợp lý không?
Vấn đề ở đây là thằng Calendar có ít nhất 30 cái label, chả lẽ copy/paste 30 lần? Vậy nên mới có cái chuyện dùng Class
 
Upvote 0
Dám cá với Hai Lúa rằng Nghĩa hỏi bài này là cho cái Calendar (không tin cứ hỏi)... Nếu không thì thà tôi viết
Mã:
Private Sub [COLOR=#ff0000]Label1[/COLOR]_Click()
   MsgBox  [COLOR=#0000cd]""[/COLOR]
End Sub
Xong, tôi copy cái màu đó paste vào giữa cặp nháy đôi ---> Hợp lý không?
Vấn đề ở đây là thằng Calendar có ít nhất 30 cái label, chả lẽ copy/paste 30 lần? Vậy nên mới có cái chuyện dùng Class

Thầy lại biết tỏng Nghĩa sẽ làm gì rồi! Vì có những cái không biết nên hỏi từng phần rồi lắp ghép vào, từ vị trí cell đến class, mục đích vừa học hỏi ở các Thầy các Anh, vừa cải tiến những tiện ích mà mình đang viết còn lượm thượm.

Cám ơn Thầy và Hai Lúa Miền Tây nhiều nhé!
 
Upvote 0
Web KT

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

Back
Top Bottom