Xin hướng dẫn về cách duyệt qua từng checkbox

Liên hệ QC

huutinh85

Thành viên hoạt động
Tham gia
8/1/13
Bài viết
120
Được thích
7
Em có tập làm 1 form tính tổng khi các checkbox được check dùng để thống kê phiếu. Hiện form đã chạy được nhưng có 2 vấn đề em muốn cải thiện:
1. Em muốn rút gọn code theo kiểu đặt mỗi checkbox1,2... thay bằng biến checkbox i và lần lượt duyệt qua các checkbox.
2. Trong 8 người đó chỉ được lựa chọn không quá 5 người thì mình cần code như thế nào được ạ.
Mong các bác chỉ giáo.Cảm ơn các bác!
 

File đính kèm

1. Bạn có thể gọi đối tượng bằng tên của nó.
Mã:
Controls("Checkbox" & i)
2. Dùng 1 biến cục bộ userform (SoNguoi), khi 1 checkbox thay đổi giá trị thì tăng, giảm giá trị biến SoNguoi dựa vào giá trị checkbox (hoặc đếm số checkbox đang được chọn). Nếu lớn hơn 5 thì hiện thông báo.
 
Upvote 0
Em có tập làm 1 form tính tổng khi các checkbox được check dùng để thống kê phiếu. Hiện form đã chạy được nhưng có 2 vấn đề em muốn cải thiện:
1. Em muốn rút gọn code theo kiểu đặt mỗi checkbox1,2... thay bằng biến checkbox i và lần lượt duyệt qua các checkbox.
2. Trong 8 người đó chỉ được lựa chọn không quá 5 người thì mình cần code như thế nào được ạ.
Mong các bác chỉ giáo.Cảm ơn các bác!
Bạn thử cái này.
Mã:
Private Sub CommandButton1_Click()
      Dim a As Long, arr(), i As Long, ten As String
      arr = Range("A2:C9").Value
      For i = 1 To 8
          ten = "cb" & i
          If Controls(ten) = True Then
             a = a + 1
             If a > 5 Then MsgBox "chon qua so luong": Exit Sub
             arr(i, 3) = arr(i, 3) + 1
          End If
      Next
      Range("A2:C9").Value = arr
End Sub
 
Upvote 0
1. Bạn có thể gọi đối tượng bằng tên của nó.
Mã:
Controls("Checkbox" & i)
2. Dùng 1 biến cục bộ userform (SoNguoi), khi 1 checkbox thay đổi giá trị thì tăng, giảm giá trị biến SoNguoi dựa vào giá trị checkbox (hoặc đếm số checkbox đang được chọn). Nếu lớn hơn 5 thì hiện thông báo.
cảm ơn bác nhiều ạ.
1-Lúc đầu em cũng nghĩ gọi checkbox nhưng không biết phương thức & i
2- cảm ơn bác cho em biết thêm biến cục bộ.
Bài đã được tự động gộp:

Bạn thử cái này.
Mã:
Private Sub CommandButton1_Click()
      Dim a As Long, arr(), i As Long, ten As String
      arr = Range("A2:C9").Value
      For i = 1 To 8
          ten = "cb" & i
          If Controls(ten) = True Then
             a = a + 1
             If a > 5 Then MsgBox "chon qua so luong": Exit Sub
             arr(i, 3) = arr(i, 3) + 1
          End If
      Next
      Range("A2:C9").Value = arr
End Sub
dạ cảm ơn bác Snow25 nhiều ạ. cái biến "a" có phải biến cục bộ mà bác huuthang_bd nói phải ở trên phải không ạ. Giờ em muốn khi bấm "bỏ phiếu" là các checkbox trở về trạng thái false hết. Em có thêm "
End If
Controls(ten) = False
Next
Range("A2:C9").Value = arr
End Sub"
không biết có tối ưu không bác nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Đặt cả 8 cái checkbox vào một Frame.
Duyệt các control nằm trong Frame đó, đếm những cái được checked.

Dùng Frame hơi nặng gánh cho Form một chút. Nhưng bù lại, dễ kiểm soát. Nếu Form có nhiều checkbox khác thì không bị lẫn lộn.
 
Upvote 0
Đặt cả 8 cái checkbox vào một Frame.
Duyệt các control nằm trong Frame đó, đếm những cái được checked.

Dùng Frame hơi nặng gánh cho Form một chút. Nhưng bù lại, dễ kiểm soát. Nếu Form có nhiều checkbox khác thì không bị lẫn lộn.
Dạ vì em cũng mới tìm hiểu VBA nên em sẽ xem. cảm ơn bác đã tư vấn!
 
Upvote 0
Mã:
Function DemCheckBoxes() As Integer
' Generic function to count the number of checked checkboxes within a form
Dim ctl
For Each ctl In Me.Controls
  If TypeName(ctl) = "CheckBox" Then If ctl.Value Then DemCheckBoxes = DemCheckBoxes + 1
Next ctl
End Function

Function DemCheckBoxesGR(grp As Control) As Integer
' Speciifc function to count the number of checked checkboxes grouped inside a frame within a form
Dim ctl
For Each ctl In grp.Controls
  If ctl.Value Then DemCheckBoxesGR = DemCheckBoxesGR + 1
Next ctl
End Function

Sử dụng hàm tổng quát:
If DemCheckBoxes() > 5 Then
MsgBox "Chỉ được tick tối đa 5 checkboxes"
End If

Sử dụng hàm chuyên:
If DemCheckBoxesGR(Frame1) > 5 Then
MsgBox "Chỉ được tick tối đa 5 checkboxes trong nhóm " & Frame1.Caption
End If
 
Upvote 0
Web KT

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

Back
Top Bottom