Hỏi. Kiểm tra điều kiện trùng trong Excel bằng VBA

  • Thread starter TinhLaJ
  • Ngày gửi
T

TinhLaJ

Guest
5/3/09
6
0
0
VN
Mình có bài tập này cần hỏi các bạn.
Yêu cầu như sau:
Lập lịch thi học kỳ cho 1 trường Đại học. Kiểm tra điều kiện nếu trong 1 ngày thi, giờ thi mà có tên 2 cán bộ coi thi trùng tên thì báo lỗi

(yêu cầu sử dụng VBA)

lichthi.JPG


Như trên hình, ngày 11/02/2009 vào lúc 8h có 2 môn thi khác nhau, nhưng người phân lịch thi đã điền tên của 1 cán bộ coi thi vào cả 2 môn thi. Chương trình phải đưa thông báo lỗi yêu cầu người dùng nhập lại.

Bạn nào biết chỉ dùm mình.

Cám ơn!
 
Khóa học Quản trị dòng tiền
HongViet

HongViet

Cao cấp
10/11/05
286
10
18
Đà nẵng
Mình có bài tập này cần hỏi các bạn.
Yêu cầu như sau:
Lập lịch thi học kỳ cho 1 trường Đại học. Kiểm tra điều kiện nếu trong 1 ngày thi, giờ thi mà có tên 2 cán bộ coi thi trùng tên thì báo lỗi
(yêu cầu sử dụng VBA)
trên hình, ngày 11/02/2009 vào lúc 8h có 2 môn thi khác nhau, nhưng người phân lịch thi đã điền tên của 1 cán bộ coi thi vào cả 2 môn thi. Chương trình phải đưa thông báo lỗi yêu cầu người dùng nhập lại.
Bạn nào biết chỉ dùm mình. Cám ơn!
Đúng là bạn chỉ biết yêu cầu thôi, chứ để thực thi thì số liệu ban đầu bạn không cung cấp gì cả, là sao vậy.
Để lập lịch thi cho 1 trường, cần biết số phòng thi, danh sách cán bộ coi thi; Số môn thi & phải thực hiện việc thi cữ trong vòng mấy ngày; Nếu thi tuyển sinh còn quy định môn nào thi trước, môn thi sau, . .
Nếu bạn đã có lịch thi rồi, thì việc kiểm tra trùng là chuyện bé xíu thôi.
Chờ tin bạn
 
T

TinhLaJ

Guest
5/3/09
6
0
0
VN
Cám ơn bạn đã trả lời!

Bài toán đặt ra là:
Trong 1 ngày thi, một giờ thi có nhiều môn thi khác nhau, tại các phòng khác nhau.
Khi một giáo viên đã được phân công coi thi rồi, nếu phát hiện thấy trong Ngày-Giờ đó, nếu giáo viên đó cũng được phân công coi thi ở 1 phòng khác/môn khác thì báo lỗi.
Yêu cầu ban đầu là kiểm tra tên cán bộ coi thi nhập vào có bị trùng hay ko

Bạn có thể kiểm tra ngay từ khi nhập dữ liệu vào ko? Hay phải sau khi phân lịch coi thi xong mới kiểm tra được?

Mong bạn giải thích cặn kẽ giúp mình!
 
Sửa lần cuối:
HongViet

HongViet

Cao cấp
10/11/05
286
10
18
Đà nẵng
Macrro sau sẽ giúp tìm trùng trong 'C' & 'D'

Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, sRng As Range
Set Rng = Columns("C:D")
If Not Intersect(Target, Rng) Is Nothing Then
Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing And sRng.Address <> Target.Address Then
sRng.Interior.ColorIndex = 35
Target.Value = ""
End If
End If
End Sub

Xem thêm trong file đính kèm; Một khi bạn thử nhập trùng xem sao.
 

Đính kèm

  • GPE.rar
    6.8 KB · Lượt xem: 520
T

TinhLaJ

Guest
5/3/09
6
0
0
VN
Yêu cầu chi tiết

Trước hết cám ơn bạn đã sớm gửi câu trả lời giúp mình. Mình đã test thử, có mấy vấn đề sau mong bạn hoàn thiện giúp :)

1.
+Trường hợp 1 - Khi 1 người đã được phân công ở cột CBCoiThi 1, nếu phân công cán bộ đó trong cột CBCoiThi 2 cũng vào ngày giờ đó ở hàng trên thì chương trình ko báo lỗi! - ko đúng yêu cầu bài toán (Mình đánh dấu màu vàng trên hình).
+TH2 - Khi nhập tên 1 người trong danh sách CBCoiThi 2, nếu cũng trong ngày giờ đó, nhập tên người đó trong danh sách CBCoiThi 1 ở hàng dưới chương trình cũng không báo lỗi (!)

Như vậy chương trình của bạn hiện tại chỉ kiểm tra trong vùng giới hạn từ ô ta đang làm việc tại cột D đến ô đầu tiên bên trái của cột C, và ô ta đang làm việc tại cột C đến ô đầu tiên của cột D, chứ ko kiểm tra, so sánh toàn bộ danh sách!

2 trường hợp trên ko đúng cho 1 lịch phân công coi thi.

Ví dụ trong hình cho Trường hợp 1:
Sau khi nhập xong cột CBCoiThi1, Nguyễn A 03 (ô C4) có lịch coi thi vào 8h ngày 12/3/2009. Chuyển sang cột 2, nếu nhập Nguyễn A 03 ở ô D3 (cũng coi thi vào 8h ngày 12/3/2009) chương trình ko báo lỗi. Như vậy chương trình chỉ kiểm tra vùng C2:D3 (D3 là ô đang nhập liệu, cần kiểm tra)

coithi02.JPG


2. Ngược lại, trong một ngày thi, một người đã được phân công vào 8h nhưng khi phân công vào buổi 14h ngày đó chương trình báo lỗi! (trên hình được đánh dấu màu xanh và hồng). Như vậy ko hợp lý.

Nhờ bạn viết giúp mình thủ tục kiểm tra điều kiện ngày giờ nữa:
+Nếu khác ngày, hoặc cùng ngày khác giờ coi thi thì bỏ qua.
+Nếu cùng ngày, cùng giờ thì mới xét điều kiện ko được trùng tên.
 
Sửa lần cuối:
T

TinhLaJ

Guest
5/3/09
6
0
0
VN
Trước hết cám ơn bạn đã sớm gửi câu trả lời giúp mình. Mình đã test thử, có mấy vấn đề sau mong bạn hoàn thiện giúp

1.
+Trường hợp 1 - Khi 1 người đã được phân công ở cột CBCoiThi 1, nếu phân công cán bộ đó trong cột CBCoiThi 2 cũng vào ngày giờ đó ở hàng trên thì chương trình ko báo lỗi! - ko đúng yêu cầu bài toán (Mình đánh dấu màu vàng trên hình).
+TH2 - Khi nhập tên 1 người trong danh sách CBCoiThi 2, nếu cũng trong ngày giờ đó, nhập tên người đó trong danh sách CBCoiThi 1 ở hàng dưới chương trình cũng không báo lỗi (!)

Như vậy chương trình của bạn hiện tại chỉ kiểm tra trong vùng giới hạn từ ô ta đang làm việc tại cột D đến ô đầu tiên bên trái của cột C, và ô ta đang làm việc tại cột C đến ô đầu tiên của cột D, chứ ko kiểm tra, so sánh toàn bộ danh sách!

2 trường hợp trên ko đúng cho 1 lịch phân công coi thi.

Ví dụ trong hình cho Trường hợp 1:
Sau khi nhập xong cột CBCoiThi1, Nguyễn A 03 (ô C4) có lịch coi thi vào 8h ngày 12/3/2009. Chuyển sang cột 2, nếu nhập Nguyễn A 03 ở ô D3 (cũng coi thi vào 8h ngày 12/3/2009) chương trình ko báo lỗi. Như vậy chương trình chỉ kiểm tra vùng C2:D3 (D3 là ô đang nhập liệu, cần kiểm tra)


2. Ngược lại, trong một ngày thi, một người đã được phân công vào 8h nhưng khi phân công vào buổi 14h ngày đó chương trình báo lỗi! (trên hình được đánh dấu màu xanh và hồng). Như vậy ko hợp lý.

Nhờ bạn viết giúp mình thủ tục kiểm tra điều kiện ngày giờ nữa:
+Nếu khác ngày, hoặc cùng ngày khác giờ coi thi thì bỏ qua.
+Nếu cùng ngày, cùng giờ thì mới xét điều kiện ko được trùng tên.
 
Sửa lần cuối:
B

bebe08

Guest
19/8/09
1
0
0
40
HN
Hỏi thêm về code

Xem thêm trong file đính kèm; Một khi bạn thử nhập trùng xem sao.
Bạn ơi, cho mình hỏi với.
Mình chạy đoạn code của bạn (Rất hay, đúng cái mình cần) nhưng mình viết thêm chút nữa, sao lại bị dừng luôn, không biết thực hiện vòng lặp kiểu gì mà không thể làm được nữa bạn à. Bạn góp ý giúp mình nhé, Cảm ơn bạn nhiều.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, sRng As Range
Set Rng = Columns("C:D")
If Not Intersect(Target, Rng) Is Nothing Then
Set sRng = Rng.Find(Target.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing And sRng.Address <> Target.Address Then
sRng.Interior.ColorIndex = 18
Target.Interior.ColorIndex = 18
MsgBox "Du lieu bi trung"
MsgBox "Ban co xoa khong"
Target.Value = ""
Target.Select
Selection.Interior.ColorIndex = xlNone
sRng.Select
Selection.Interior.ColorIndex = xlNone

End If
End If
End Sub
 

Xem nhiều