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

QuocDung2510

Thành viên hoạt động
Tham gia ngày
20 Tháng tư 2015
Bài viết
117
Được thích
17
Điểm
170
Nơi ở
Hà Nội
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 đỡ!
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
9,023
Được thích
10,435
Điểm
1,560
PHP:
With UserForm1
    For i = 1 To 100
        .Controls("Label" & i).Caption = "xxx " & i
       .Controls("TextBox" & i).Caption = "yyy " & i
    Next
End With
 

befaint

|||||||||||||
Tham gia ngày
6 Tháng một 2011
Bài viết
9,023
Được thích
10,435
Điểm
1,560
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
 

QuocDung2510

Thành viên hoạt động
Tham gia ngày
20 Tháng tư 2015
Bài viết
117
Được thích
17
Điểm
170
Nơi ở
Hà Nội
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:

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
7,221
Được thích
8,170
Điểm
860
Nơi ở
TP.HCM
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í.
 

QuocDung2510

Thành viên hoạt động
Tham gia ngày
20 Tháng tư 2015
Bài viết
117
Được thích
17
Điểm
170
Nơi ở
Hà Nội
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á
 

Hoang2013

Thành viên gắn bó
Tham gia ngày
15 Tháng tám 2013
Bài viết
1,625
Được thích
1,598
Điểm
560
Tuổi
6
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?
 

hpkhuong

######
Tham gia ngày
20 Tháng năm 2011
Bài viết
4,615
Được thích
4,052
Điểm
560
Nơi ở
Quận 2 - TP.HCM
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ì???
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,243
Được thích
52,567
Điểm
11,910
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
 

NguyenNgocThuHien

Cute Black Cat
Tham gia ngày
11 Tháng mười một 2016
Bài viết
596
Được thích
418
Điểm
235
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.
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,243
Được thích
52,567
Điểm
11,910
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
 

Hoang2013

Thành viên gắn bó
Tham gia ngày
15 Tháng tám 2013
Bài viết
1,625
Được thích
1,598
Điểm
560
Tuổi
6
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!
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,243
Được thích
52,567
Điểm
11,910
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
 

QuocDung2510

Thành viên hoạt động
Tham gia ngày
20 Tháng tư 2015
Bài viết
117
Được thích
17
Điểm
170
Nơi ở
Hà Nội
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!
 

adult

Thành viên hoạt động
Tham gia ngày
2 Tháng mười hai 2007
Bài viết
186
Được thích
29
Điểm
670
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 ạ?
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,243
Được thích
52,567
Điểm
11,910
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)
 

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
8,544
Được thích
8,303
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
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.
 
Top Bottom