[UserForm]Add Label for UserForm-Tự động thêm Label vào UserForm

Euler

Administrator
Thành viên BQT
Các tool như đặt thiết bị, hoặc đặt phòng họp có thể sử dụng code này.
Thay vì tạo sẵn các label bằng tay trên userform, chúng ta sẽ tạo tự động label bằng code.
Code trên module
Mã:
Sub addLabel()

Dim theLabel As Object
Dim labelCounter As Long

For labelCounter = 1 To 3
    Set theLabel = UserForm1.Controls.Add("Forms.Label.1", "Test" & labelCounter, True)
    With theLabel
        .Caption = "Test" & labelCounter
        .Left = 10
        .Width = 50
        .Top = 10 * labelCounter
'Chúng ta có thể tùy ý thiết định các thuộc tính khác
    End With
Next
End Sub
Code trên nút bấm trên UserForm
Mã:
Private Sub CommandButton1_Click()
    Call addLabel
End Sub
Bạn cần đăng nhập để thấy hình ảnh
 

vbano1

SMod
Thành viên BQT
Bạn cần đăng nhập để thấy hình ảnh

Nghịch thử remove Label thì sao, hí hoáy mãi mới được. Remove label in UserForm VBA.
Sửa lại code ở trên, thêm thuộc tính Name:
Mã:
Sub addLabel()

Dim theLabel As Object
Dim labelCounter As Long

For labelCounter = 1 To 3
    Set theLabel = UserForm1.Controls.Add("Forms.Label.1", "Test" & labelCounter, True)
    With theLabel
        .Name = "LabelA" & labelCounter
        .Caption = "Test" & labelCounter
        .Left = 10
        .Width = 50
        .Top = 10 * labelCounter
        .ControlTipText = .Name

    End With
Next
End Sub
Tạo nút bấm thứ hai để gọi thủ tục xóa label này:
Code cho nút bấm số 2:
Mã:
Private Sub CommandButton2_Click()
    Call Delete_all
End Sub
Mã:
Sub Delete_all()
    Dim labelCounter As Long
    Dim s   As String
    Dim i   As Integer
   
    labelCounter = UserForm1.Controls.Count
 
    On Error Resume Next
    For i = 1 To labelCounter Step 1
        s = UserForm1.Controls.Item(i).Name
        If InStr(1, s, "LabelA") > 0 Then
            UserForm1.Controls.Remove (s)
           
        End If
    Next i
End Sub
Kết quả khá tệ, nguyên nhân được cho là bởi dòng code số 9.
Bạn cần đăng nhập để thấy hình ảnh


Tôi sửa lại code cho chạy vòng i ngược từ cuối về đầu.
Mã:
Sub Delete_all()
   'tuhocvba.net
    Dim labelCounter As Long
    Dim s   As String
    Dim i   As Integer
   
    labelCounter = UserForm1.Controls.Count
  
    On Error Resume Next 'Dong code nay bat buoc phai co, neu không sẽ báo lỗi. Hiện tôi chưa rõ nguyên nhân lỗi.
    For i = labelCounter To 1 Step -1 'Khá thú vị ở chỗ phải chạy giảm dần thì mới xóa hết được label
        s = UserForm1.Controls.Item(i).Name
        If InStr(1, s, "LabelA") > 0 Then
            UserForm1.Controls.Remove (s)
           
        End If
    Next i
End Sub
Kết quả:
Bạn cần đăng nhập để thấy hình ảnh

Lý do là các Label này được quản lý như một mảng động.
Ví dụ ban đầu có 3 phần tử thì nó là label(0 to 2). Phần tử 0 luôn tồn tại.
Cho nên nếu bạn xóa phần tử đầu tiên, tức phần tử 0 của mảng, thì mảng được định nghĩa lại là label(0 to 1). Phần tử 0 vẫn tồn tại. Nhưng code của bạn thì biến i tăng lên, nó sẽ bỏ sót label trong quá trình xóa.
 

giaiphapvba

Administrator
Thành viên BQT
Bạn cần đăng nhập để thấy hình ảnh

Bắt chước, tạo Combobox tự động ^_^
Mã:
Private Sub CommandButton1_Click()
    Dim cmbAdd_1 As MSForms.ComboBox

    Set cmbAdd_1 = _
        UserForm1.Controls.Add("Forms.ComboBox.1", "cmbBox1", True)

    cmbAdd_1.AddItem "Excel"
cmbAdd_1.AddItem "Word"
    cmbAdd_1.AddItem "Access"

End Sub
 

tuhocvba

Administrator
Thành viên BQT
Thôi thì tổng hợp thành một bài cho gọn.
Tổng quát là Auto create object (label, button, combobox, ...)
Bây giờ tôi sẽ tóm lược cách tạo tất cả các loại đối tượng trong Userform.
Cấu trúc code của nó sẽ có dạng như sau:
Mã:
Dim Object_name As MSForms.Object_Type

   Set Object_name = UserForm1.Controls.Add("Object_ID", "Tên tùy ý", True)
Object_Id: Tham khảo bảng dưới:
Option_TypeObject_ID
CheckBoxForms.CheckBox.1
ComboBoxForms.ComboBox.1
CommandButtonForms.CommandButton.1
FrameForms.Frame.1
ImageForms.Image.1
LabelForms.Label.1
ListBoxForms.ListBox.1
MultiPageForms.MultiPage.1
OptionButtonForms.OptionButton.1
ScrollBarForms.ScrollBar.1
SpinButtonForms.SpinButton.1
TabStripForms.TabStrip.1
TextBoxForms.TextBox.1
ToggleButtonForms.ToggleButton.1
Đến đây bạn đã hiểu chưa ạ?
Giá trị True là bạn sẽ cho đối tượng hiển thị, tất nhiên nếu để False thì nó vẫn sẽ được tạo ra nhưng không được nhìn thấy.
Ví dụ đoạn code sau sẽ tạo ra nút bấm sau khi tôi click vào nút bấm CommandButton0 đã được tạo ra từ trước có gắn code ở dưới đây:
Mã:
Private Sub CommandButton0_Click()
   Dim cmbAdd_1 As MSForms.CommandButton

   Set cmbAdd_1 = UserForm1.Controls.Add("Forms.CommandButton.1", "nutbam1", True)
 
End Sub
Nguồn tham khảo:
 
Top