Nhờ mọi người giúp cách xóa các mục đã chọn trong Droplist của một nhóm các ô cùng dạy một môn học. (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

vinhphtdp

Thành viên mới
Tham gia
18/6/25
Bài viết
3
Được thích
0
Nhờ các chuyên gia giải quyết giúp bài toán sau:
Mình đã làm làm mẫu PCCM khi nhập chỉ cần chọn lớp từ Droplist, đã xây dựng code VBA để chọn nhiều lớp cho từng GV và muốn bỏ 1 lớp khi chọn nhầm thì chỉ cần chọn lại lớp đấy. Nhưng có 1 vấn đề là khi đã chọn các lớp cho 1 GV rồi thì các GV còn lại sẽ không có các lớp đã chọn trong Droplist nhưng mình không viết được. Nhờ mọi người chỉ giúp.
 

File đính kèm

Nhờ các chuyên gia giải quyết giúp bài toán sau:
Mình đã làm làm mẫu PCCM khi nhập chỉ cần chọn lớp từ Droplist, đã xây dựng code VBA để chọn nhiều lớp cho từng GV và muốn bỏ 1 lớp khi chọn nhầm thì chỉ cần chọn lại lớp đấy. Nhưng có 1 vấn đề là khi đã chọn các lớp cho 1 GV rồi thì các GV còn lại sẽ không có các lớp đã chọn trong Droplist nhưng mình không viết được. Nhờ mọi người chỉ giúp.
Tôi không phải là chuyên gia gì cả nên chỉ có thể góp ý với bạn thế này:
Khi đã chọn 1 lớp nào đó thì tên lớp đó không có trong DropList nữa (như bạn đã muốn)-Điều này là hoàn toàn có thể .
Tham khảo code dưới đây
Mã:
Sub AddLists1(ByVal C As Integer)
    Dim Sh As Worksheet, Ws As Worksheet
    Dim cell As Range, Data(), PhCong()
    Dim i&, j&, Col&
    Dim DictMon As Object, Key
    Set Sh = ThisWorkbook.Sheets("Data")
    Set Ws = Sheets("Phancong 25-26")
        If C = 14 Then Col = 2
        If C = 15 Then Col = 22
        If C = 17 Then Col = 12

    Set Dic = CreateObject("Scripting.Dictionary")
    Set DictMon = CreateObject("Scripting.Dictionary")
        Data = Sh.Range(Sh.Cells(4, Col), Sh.Cells(35, Col)).Value
        PhCong = Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Value

    For j = 1 To UBound(PhCong)
        If PhCong(j, 1) <> Empty Then
            Key = PhCong(j, 1)
            If Not DictMon.Exists(Key) Then DictMon.Add (Key), j
        End If
    Next j

    For j = 1 To UBound(Data)
            Key = Data(j, 1)
            If Not DictMon.Exists(Key) Then Dic.Add (Key), j
    Next j

    Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Validation.Delete
    Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=Join(Dic.keys, ",")
End Sub
và thêm dòng code sau trong Sub Worksheet_Change
Mã:
.......
Else
            If oldValue <> "" Then
                 Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If
.......
thành
Mã:
....
Else
            If oldValue <> "" Then
                 Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If

Call AddLists1(Target.Column)
            .....

Nhưng, khi bạn muốn bỏ 1 lớp do chọn nhầm rồi thì bạn không thể chọn lại bởi : lớp đó không có trong Droplist nữa thì lấy đâu mà chọn.
Do vậy, để vẫn cho phép xóa bỏ lớp đã chọn nhầm và đảm bảo cho các giáo viên sẽ không chọn được lớp đã được chọn là dùng cảnh báo và Droplist vẫn có đủ các lớp (tức là vẫn nguyên từ dòng 4 đến dòng 35 của sheets Data: Nếu chọn 1 lớp mà trước đó đã phân công cho giáo viên khác rồi thì sẽ xuất hiện 1 thông báo "Lớp này đã được chọn-Hãy chọn lớp khác"
Hỏi thêm bạn là sao có đến 14 môn mà sao trong sh Phancong lại chỉ có 3 môn, sao bạn không làm cả 14 môn rồi dùng code để khi chọn tổ thì các môn của tổ đó được hiện còn các môn tổ khác bị ẩn.
 
Upvote 0
Tôi không phải là chuyên gia gì cả nên chỉ có thể góp ý với bạn thế này:
Khi đã chọn 1 lớp nào đó thì tên lớp đó không có trong DropList nữa (như bạn đã muốn)-Điều này là hoàn toàn có thể .
Tham khảo code dưới đây
Mã:
Sub AddLists1(ByVal C As Integer)
    Dim Sh As Worksheet, Ws As Worksheet
    Dim cell As Range, Data(), PhCong()
    Dim i&, j&, Col&
    Dim DictMon As Object, Key
    Set Sh = ThisWorkbook.Sheets("Data")
    Set Ws = Sheets("Phancong 25-26")
        If C = 14 Then Col = 2
        If C = 15 Then Col = 22
        If C = 17 Then Col = 12

    Set Dic = CreateObject("Scripting.Dictionary")
    Set DictMon = CreateObject("Scripting.Dictionary")
        Data = Sh.Range(Sh.Cells(4, Col), Sh.Cells(35, Col)).Value
        PhCong = Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Value

    For j = 1 To UBound(PhCong)
        If PhCong(j, 1) <> Empty Then
            Key = PhCong(j, 1)
            If Not DictMon.Exists(Key) Then DictMon.Add (Key), j
        End If
    Next j

    For j = 1 To UBound(Data)
            Key = Data(j, 1)
            If Not DictMon.Exists(Key) Then Dic.Add (Key), j
    Next j

    Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Validation.Delete
    Ws.Range(Ws.Cells(12, C), Ws.Cells(26, C)).Validation.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:=Join(Dic.keys, ",")
End Sub
và thêm dòng code sau trong Sub Worksheet_Change
Mã:
.......
Else
            If oldValue <> "" Then
                 Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If
.......
thành
Mã:
....
Else
            If oldValue <> "" Then
                 Target.Value = oldValue & delimiter & newValue
            Else
                Target.Value = newValue
            End If

Call AddLists1(Target.Column)
            .....

Nhưng, khi bạn muốn bỏ 1 lớp do chọn nhầm rồi thì bạn không thể chọn lại bởi : lớp đó không có trong Droplist nữa thì lấy đâu mà chọn.
Do vậy, để vẫn cho phép xóa bỏ lớp đã chọn nhầm và đảm bảo cho các giáo viên sẽ không chọn được lớp đã được chọn là dùng cảnh báo và Droplist vẫn có đủ các lớp (tức là vẫn nguyên từ dòng 4 đến dòng 35 của sheets Data: Nếu chọn 1 lớp mà trước đó đã phân công cho giáo viên khác rồi thì sẽ xuất hiện 1 thông báo "Lớp này đã được chọn-Hãy chọn lớp khác"
Hỏi thêm bạn là sao có đến 14 môn mà sao trong sh Phancong lại chỉ có 3 môn, sao bạn không làm cả 14 môn rồi dùng code để khi chọn tổ thì các môn của tổ đó được hiện còn các môn tổ khác bị ẩn.
Cảm ơn bạn rất nhiều. Nếu được bạn giúp mình nhé. Do mình cũng chỉ mới bắt đầu VBA nên đang dùng code trợ giúp.
 
Upvote 0
Cảm ơn bạn rất nhiều. Nếu được bạn giúp mình nhé. Do mình cũng chỉ mới bắt đầu VBA nên đang dùng code trợ giúp.
Bạn tham khảo theo hướng:
+Giữ nguyên Data Validation.
+Kiểm soát mã nhập vào :
===>khi chọn 1 mã nếu:
1. Nếu là mã duy nhất trong dòng 12:26 thì Nhập vào ô (ô dã có thì nhập thêm kiểu 10TN,11TN(2)3,...
2. Nếu mã đã xuất hiện (không phải là duy nhất) sẽ hiện thông báo: " Ma này đa chon-hay chon ma khác" ===> chon "OK"
2.1. Nếu mã đã chọn đã có trong ô thì xuất hiện thông báo: "Ma đươc chon tron ô may se bi xóa nêu chon Yes"
nếu chọn "No" ===> ô được chọn ấy nguyễn y vân.

Xem file đính kèm.

Như bài trên đã nói: nếu chọn phương án xóa mã đã trọn trong Drop List thì sẽ không thực hiện được chức năng xóa mã vừa chọn, Lúc mày bạn phải xóa bằng tay.
 

File đính kèm

Upvote 0

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

Back
Top Bottom