Tạo và đặt tên cho hàng loạt label, texbox bằng code VBA

Liên hệ QC

QuocDung2510

Thành viên hoạt động
Tham gia
20/4/15
Bài viết
117
Được thích
17
Nghề nghiệp
Chuyên viên
Do nhu cầu công việc cần tạo nhiều label và textbox (theo một quy định nhất định)
Vì dụ tạo 100 label có tên : = "LB" & i (i chạy từ 1 đến 100)
Mong các anh em giúp đỡ!
 
PHP:
With UserForm1
    For i = 1 To 100
        .Controls("Label" & i).Caption = "xxx " & i
       .Controls("TextBox" & i).Caption = "yyy " & i
    Next
End With
 
Upvote 0
PHP:
Private Sub UserForm_Initialize()
Const h = 15
Dim lLabel(1 To 100) As Control, tTextBox(1 To 100) As Control
For i = 1 To 100
    Set lLabel(i) = UserForm1.Controls.Add("Forms.Label.1", "Label" & i, True)
    With lLabel(i)
        If i = 1 Then
            .Top = 10 + h / 5
        Else
        .Top = lLabel(i - 1).Top + 1 * h
        End If
        .Left = 15
        .Height = h
        .Width = 30
        .Caption = "xxx " & i & ":"
    End With
    Set tTextBox(i) = UserForm1.Controls.Add("Forms.TextBox.1", "Textbox" & i, True)
    With tTextBox(i)
        .Top = 10 + (i - 1) * h
        .Left = 40
        .Height = h
        .Width = 100
    End With
Next i
End Sub
 
Upvote 0
PHP:
Private Sub UserForm_Initialize()
Const h = 15
Dim lLabel(1 To 100) As Control, tTextBox(1 To 100) As Control
For i = 1 To 100
    Set lLabel(i) = UserForm1.Controls.Add("Forms.Label.1", "Label" & i, True)
    With lLabel(i)
        If i = 1 Then
            .Top = 10 + h / 5
        Else
        .Top = lLabel(i - 1).Top + 1 * h
        End If
        .Left = 15
        .Height = h
        .Width = 30
        .Caption = "xxx " & i & ":"
    End With
    Set tTextBox(i) = UserForm1.Controls.Add("Forms.TextBox.1", "Textbox" & i, True)
    With tTextBox(i)
        .Top = 10 + (i - 1) * h
        .Left = 40
        .Height = h
        .Width = 100
    End With
Next i
End Sub
Xin cảm ơn! Nhưng mình muốn sau khi chạy xong label và texbox còn lại trên userform (VBA) để còn xử lý tiếp! hiện tại là tạo ra khi chạy và thoát ra thì ko còn texbox hay label nào nữa
 
Lần chỉnh sửa cuối:
Upvote 0
Xin cảm ơn! Nhưng mình muốn sau khi chạy xong label và texbox còn lại trên userform (VBA) để còn xử lý tiếp! hiện tại là tạo ra khi chạy và thoát ra thì ko còn texbox hay label nào nữa
Khâu thiết kế thì nên làm bằng tay. Nhờ người khác bỏ công sức ra làm để bạn dùng 1 lần thì quá phí.
 
Upvote 0
Khâu thiết kế thì nên làm bằng tay. Nhờ người khác bỏ công sức ra làm để bạn dùng 1 lần thì quá phí.
Mình không có ý định nhờ người khác thiết kế để chỉ dùng 1 lần!
Mình nhờ giữ lại các control đó vì mình không biết cách để giữ lại!
Nếu làm thủ công vẽ cả vài trăm cái texbox và đặt tên thì tốn nhiều thời gian quá
 
Upvote 0
Do nhu cầu công việc cần tạo nhiều label và textbox (theo một quy định nhất định)
Vì dụ tạo 100 label có tên : = "LB" & i (i chạy từ 1 đến 100)
Không rõ nhu cầu công việc này có "chính đáng" hay không nữa?
Nếu được bạn nêu cụ thể cái nhu cầu kia của bạn, có thể có cách khác thì sao?
 
Upvote 0
Mình không có ý định nhờ người khác thiết kế để chỉ dùng 1 lần!
Mình nhờ giữ lại các control đó vì mình không biết cách để giữ lại!
Nếu làm thủ công vẽ cả vài trăm cái texbox và đặt tên thì tốn nhiều thời gian quá

Ctr + C (1 lần) và Ctr+V :100 lần cũng không được thì ngồi làm gì???
 
Upvote 0
Thấy nhu cầu này cũng thực tế chứ đâu phải như mọi người nghĩ. Ví dụ lúc trước tôi có làm cái Piano trên VBA giống vầy:

Untitled.jpg

Mấy cái phím trắng đen này mà kêu ngồi vẽ bằng tay chắc "lúa" luôn, bởi sẽ không tài nào chính xác được. Vậy nên dùng code để vẽ cũng rất hợp lý
------------------------------------------------
Ví dụ code tạo 10 textbox + 10 label trên 1 UserForm có sẵn
Mã:
Sub CreateControls()
  Dim i As Long
  Const H = 30
  Const W = 130
  With ThisWorkbook.VBProject.VBComponents("UserForm1")
    For i = 1 To 10
    ''10 textboxes
      With .Designer.Controls.Add("forms.TextBox.1", "tbx_" & i)
        .Left = 10: .Top = (i - 1) * H + 10
        .Width = W: .Height = H
      End With
    ''10 labels
      With .Designer.Controls.Add("forms.Label.1", "lbl_" & i)
        .Left = 20 + W: .Top = (i - 1) * H + 18
        .Width = W / 2: .Height = H - 8
        .Caption = "Label " & i
      End With
    Next
  End With
End Sub
Yêu cầu để chạy được code:
1> Đã tạo trước 1 UserForm có tên là UserForm1 và trên UseForm này chưa có control nào hoặc nếu có thì phải chắc chắn không trùng tên với các controls sắp tạo
2> Trong Excel Options, đã check mục "Trust access to... " trong Trust Center Settings
 
Upvote 0
Thấy nhu cầu này cũng thực tế chứ đâu phải như mọi người nghĩ. Ví dụ lúc trước tôi có làm cái Piano trên VBA giống vầy:

View attachment 189502

Mấy cái phím trắng đen này mà kêu ngồi vẽ bằng tay chắc "lúa" luôn, bởi sẽ không tài nào chính xác được. Vậy nên dùng code để vẽ cũng rất hợp lý
------------------------------------------------
Ví dụ code tạo 10 textbox + 10 label trên 1 UserForm có sẵn
Mã:
Sub CreateControls()
  Dim i As Long
  Const H = 30
  Const W = 130
  With ThisWorkbook.VBProject.VBComponents("UserForm1")
    For i = 1 To 10
    ''10 textboxes
      With .Designer.Controls.Add("forms.TextBox.1", "tbx_" & i)
        .Left = 10: .Top = (i - 1) * H + 10
        .Width = W: .Height = H
      End With
    ''10 labels
      With .Designer.Controls.Add("forms.Label.1", "lbl_" & i)
        .Left = 20 + W: .Top = (i - 1) * H + 18
        .Width = W / 2: .Height = H - 8
        .Caption = "Label " & i
      End With
    Next
  End With
End Sub
Yêu cầu để chạy được code:
1> Đã tạo trước 1 UserForm có tên là UserForm1 và trên UseForm này chưa có control nào hoặc nếu có thì phải chắc chắn không trùng tên với các controls sắp tạo
2> Trong Excel Options, đã check mục "Trust access to... " trong Trust Center Settings
Chủ thớt đăng thớt này khá là thiếu thông tin, vị trí, kích thước, các thuộc tính đính kèm đều không có thì chả ai code lổi. Với bài này thì nên dùng control động thôi, khi khởi tạo form sẽ thêm vào. Nếu có thêm được lúc thiết kế ( như code của anh) thì việc quản lý chúng cũng vất vả không kém.
 
Upvote 0
Chủ thớt đăng thớt này khá là thiếu thông tin, vị trí, kích thước, các thuộc tính đính kèm đều không có thì chả ai code lổi. Với bài này thì nên dùng control động thôi, khi khởi tạo form sẽ thêm vào. Nếu có thêm được lúc thiết kế ( như code của anh) thì việc quản lý chúng cũng vất vả không kém.
Giống như bài trên tôi đã nói: Nhu cầu này là có thật (như cái Piano tôi đã tạo) và chỉ cần tạo control, không cần code
Nói chung là tùy từng trường hợp cụ thể sẽ quyết định dùng dạng "động" hay tĩnh. Bác Bill đã cho ta công cụ thì phải có lúc cần dùng đến
 
Upvote 0
Cái piano đó cũng có thể thực hiện thủ công, nếu chịu khó lấy giấy bút ghi lại kích thước chỉ 2 fím trắng & fím đen nào cho là chuẩn nhất;
Sau đó là chép ra mà thôi.

Mà mình chưa thấy cái piano nào trên 99 fím cả & tác giả bài đăng thì kiên quyết giữ bí mật đứa con tính thần sắp ra đời của mình!

Tạm biệt & chúc vui!
 
Upvote 0
Vừa nói hôm qua thì hôm nay đã có việc cần dùng đến vụ này rồi
Ví dụ cái form tôi vừa tạo (do tìm grid không ra)

Untitled.jpg

Cái này vẽ bằng tay thì được (copy/pase vài lần thôi) nhưng còn khoảng đặt tên cho từng control mà bằng tay thì có mà... chết
 
Upvote 0
Vừa nói hôm qua thì hôm nay đã có việc cần dùng đến vụ này rồi
Ví dụ cái form tôi vừa tạo (do tìm grid không ra)

View attachment 189528

Cái này vẽ bằng tay thì được (copy/pase vài lần thôi) nhưng còn khoảng đặt tên cho từng control mà bằng tay thì có mà... chết
Nhu cầu của mình cũng gần giống như này! Chỉ có nội dung bên trong mình ví dụ đưa ra con số là 100 chứ trên thực tế nó cả vài trăm !
Cảm ơn tất cả các bác đã trợ giúp!
 
Upvote 0
Vừa nói hôm qua thì hôm nay đã có việc cần dùng đến vụ này rồi
Ví dụ cái form tôi vừa tạo (do tìm grid không ra)

View attachment 189528

Cái này vẽ bằng tay thì được (copy/pase vài lần thôi) nhưng còn khoảng đặt tên cho từng control mà bằng tay thì có mà... chết
Cái này của bác nhìn hấp dẫn quá. Ko biết bác có thể chia sẻ thêm cách thúc hoạt động của form bác đang làm không ạ?
 
Upvote 0
Cái này của bác nhìn hấp dẫn quá. Ko biết bác có thể chia sẻ thêm cách thúc hoạt động của form bác đang làm không ạ?
Cái form này tôi đã bỏ không dùng nữa bạn à (vì xử lý phức tạp).
Hiện tai đang dùng iGrid (iGrid chỉ chạy được trên Office 32 bit)
 
Upvote 0
Nhu cầu của mình cũng gần giống như này! Chỉ có nội dung bên trong mình ví dụ đưa ra con số là 100 chứ trên thực tế nó cả vài trăm !
Cảm ơn tất cả các bác đã trợ giúp!
Góp ý cho bạn:
1/ Nếu đến con số là 100 thì bạn nên nghĩ đến dùng sheetForm có lẽ đến con số vài trăm là chuyện nhỏ.
2/ Tốt nhất là bạn nên đính kèm File với cái con số là 100 hay vài trăm gì đó để mọi người góp ý hoặc thiết kế lại giúp bạn thì sẽ hay hơn. Tôi nghĩ sau khi thiết kế lại cho bạn chắc còn khoảng 30 cột là tối đa, đủ đáp ứng cái yêu cầu cái vài trăm hay vài ngàn như bạn đã nêu.
 
Upvote 0
Web KT
Back
Top Bottom