Dùng Excel để sắp xếp giám thị trông thi

Liên hệ QC
Về cơ bản công việc này phải thực hiện thủ công thôi, sau đó dùng Excel để kiểm tra việc phân công có lặp lại cặp, lặp lại phòng, và còn nữa là 2gv cùng trường có cùng 1 cặp hay không ? (tôi có làm công việc này rồi)
 
Cách Phan cong giam thi

Thưa các bạn, cách phân công giám thị không có gì phải cần đến công cụ máy tính
vì tôi chỉ cần xếp đơn giản bằng tay mà vẫn đảm bảo được yêu cầu của các bạn, mà trong đó của bạn còn thiếu yêu cầu là 2 giám thị cùng đơn vị thì không coi chung 1 phòng
Xin giới thiệu với bạn như sau :
- thứ nhất, tôi cố định giám thị 3 (giám thị hành lang) và sẽ luân phiên là từ hành lang 1 đến hàng lang 6 cho 6 buổi thi
- thứ hai, bạn phân số giám thị còn lại ra làm 2 nhóm (nhóm 1 có các giám thị khác đơn vị với nhóm 2)
- thứ ba
+ ở buổi thi đầu tiên bạn phân công giám thị 1 cho 1 nhóm từ phòng 1 cho đến hết và phân giám thị 2 cho nhóm còn lại
+ ở buổi thi thứ hai và các buổi tiếp theo
* bạn đổi giám thị 1 thành giám thị 2 và ngược lại
* bạn phân phòng bằng cách cộng thêm 1 số n nào đó cho giám thị 1, và cộng thêm 1 số nào đó khác n cho giám thị 2. Như vậy sẽ không bao giờ trùng phòng và trùng giám thị
Ví dụ : buổi 1 Thầy A làm GT1 phòng 1, Cô B làm GT2 phòng 1
buổi 2 Thầy A làm GT2 phòng 1 + 2, Cô B làm GT1 phòng 1+3
buổi 3 Thầy A làm GT1 phòng (1 + 2)+4, Cô B làm GT2 phòng (1+3)+5
và ...
* lưu ý, khi phân công đến phòng lớn nhất thì nhớ trở lại phòng đầu tiên nhé!
Như vậy tôi không cần tới máy tính và thực sự tới giờ thi tôi mới phân công trực tiếp trên bảng thì cũng vẫn không sai được
 
Thưa các bạn, cách phân công giám thị không có gì phải cần đến công cụ máy tính
vì tôi chỉ cần xếp đơn giản bằng tay mà vẫn đảm bảo được yêu cầu của các bạn, mà trong đó của bạn còn thiếu yêu cầu là 2 giám thị cùng đơn vị thì không coi chung 1 phòng
.........
- thứ ba
.........
buổi 3 Thầy A làm GT1 phòng (1 + 2)+4, Cô B làm GT2 phòng (1+3)+5
và ...
* lưu ý, khi phân công đến phòng lớn nhất thì nhớ trở lại phòng đầu tiên nhé!
Như vậy tôi không cần tới máy tính và thực sự tới giờ thi tôi mới phân công trực tiếp trên bảng thì cũng vẫn không sai được
______
Tất nhiên là bác nói đúng. Các cụ nhà ta xưa có cần đến cần cẩu, ô-tô đâu mà vẫn xây nhà, vận chuyển hàng hóa, đi lại được, cũng không cần máy cày, máy gặt... mà vẫn trồng ra lúa, ngô, khoai, sắn... vẫn sống đó thôi!
Thế nhưng ngày nay, bác thử nghĩ đến kiến nghị với Nhà Nước và các công ty, ban, ngành ... vứt hết máy tính, điện thoại cùng các phương tiện "tư bản chủ nghĩa" khác đi rồi quay về làm việc như ngày xưa xem sao(?)
Tôi nghĩ, mọi người trao đổi phương pháp, thuật toán ở đây không chỉ là tìm cách làm cho một trường hợp phân công giám thị này, mà còn có thể vận dụng sang những tình huống khác - tùy từng người.
Tôi rất cảm ơn các bác đã tham gia xây dựng chủ đề này và cũng học được nhiều kinh nghiệm hay từ các bác.
 
đây nầy

có dùng đươc cam ơn nhau câu nhé!
 

File đính kèm

  • Phan mem phan cong coi thi.rar
    195.5 KB · Đọc: 978
các bạn tải vè dùng nhé

mình dùng nhiều rồi OK
 

File đính kèm

  • Phan mem phan cong coi thi.rar
    64.8 KB · Đọc: 424
phần mêm phân công giám thị

phần mềm phân công giam thị mình vùa mới kiếm được dây nhưng dùng không tiện cho di chuyển vi đi dến đâu phải cài ở đó không như mình dã tạo ra EXE như phần trước thầy cô tải về dùng nhé
các thầy cô tải thêo linh này: http://tinyurl.com/sapxep-01
 
Lần chỉnh sửa cuối:
CÔNG CỤ PHÂN CÔNG GIÁM THỊ COI THI BẰNG EXCEL

Công cụ này tôi đã viết và sử dụng hiệu quả nhiều năm rồi, bạn có thể vảo địa chỉ sau để download và sử dụng:
http://hhtham.khanhhoa.edu.vn/?ModuleId=4&TopicId=7
Trong quá trình sử dụng, nếu có gì thắc mắc, bạn có thể liên lạc cho tôi theo email:
thuyendachuynh@gmail.com
 
Option Explicit

Function KtTrung(L1_, L2_, L3_, L4_, L5_, L6_)

Dim dem_ngoai As Integer
Dim dem_trong As Integer
Dim a As Variant
a = Array(L1_, L2_, L3_, L4_, L5_, L6_)

Dim trung As Integer
trung = 0
dem_ngoai = 0

While trung = 0 And dem_ngoai < 6

dem_trong = dem_ngoai + 1
If a(dem_ngoai) <> "" Then
While trung = 0 And dem_trong < 6
If a(dem_ngoai) = a(dem_trong) Then
trung = 1
Else
End If
dem_trong = dem_trong + 1
Wend
Else
End If
dem_ngoai = dem_ngoai + 1
Wend
KtTrung = trung
End Function

Function KtTrungPhong_1(L1_, L2_, L3_, L4_, L5_, L6_, La_, Lb_, Lc_, Ld_, Le_, Lf_)

Dim a As Variant

a = Array(L1_, L2_, L3_, L4_, L5_, L6_, La_, Lb_, Lc_, Ld_, Le_, Lf_)


Dim i As Integer
Dim j As Integer
Dim x As Integer

Dim temp

'mang temp chua cac vitri coi thi
temp = Array(0, 1, 2, 3, 4, 5, 6)
j = 0
i = 0
While i < 12

If IsNumeric(a(i)) And a(i) <> 0 Then ' khac khong de tru truong hop cho do la lien ket cho gia tri 0
temp(j) = a(i)
If j < 5 Then
j = j + 1
Else
End If
Else
End If

i = i + 1
Wend
KtTrungPhong_1 = KtTrung(temp(0), temp(1), temp(2), temp(3), temp(4), temp(5))
End Function

Function Kt_doc(dayKiemTra As Variant, maSoPhongDau As Integer, soLuongPhongThi As Integer)

Dim dem_ngoai As Integer
Dim dem_trong As Integer

Dim aDayKt As Variant
aDayKt = dayKiemTra.Value2 ' adayKT la mang 2 chieu


'loc ra cac o co phong thi
Dim aDayPhongThi(40) As Integer ' toi da 40 phong thi cho mot hoi dong
Dim i, j, k As Integer
' quet aDayKt lay ra cac phan tu la so <>0
j = i
For i = 1 To dayKiemTra.Count
If IsNumeric(aDayKt(i, 1)) And aDayKt(i, 1) <> 0 And (Not IsEmpty(aDayKt(i, 1))) Then
aDayPhongThi(j) = aDayKt(i, 1)
j = j + 1
Else
End If
Next i
'xep giam dan day cac phong thu duoc
Dim temp As Integer
For i = 0 To soLuongPhongThi - 2
For j = i + 1 To soLuongPhongThi - 1
If aDayPhongThi(j) > aDayPhongThi(i) Then
temp = aDayPhongThi(j)
aDayPhongThi(j) = aDayPhongThi(i)
aDayPhongThi(i) = temp
Else
End If
Next j
Next i

' kt doc khong loi thoa 2 dieu kien : aDayPhongthi co phan tu dau la ma so phong lon nhat,
' phan tu thu soluongphong -1 la ma so phong dau tien
Dim ketQua As Integer
ketQua = 1
Dim p, q As Boolean
p = (aDayPhongThi(0) = (maSoPhongDau + soLuongPhongThi - 1))
q = (aDayPhongThi(soLuongPhongThi - 1) = maSoPhongDau)
If p And q Then
ketQua = 0
Else
End If

Dim m, n As Integer
For m = 0 To soLuongPhongThi - 2
For n = m + 1 To soLuongPhongThi - 1
If aDayPhongThi(n) = aDayPhongThi(m) Then
Kt_doc = 1
Exit Function
Else
End If

Next n
Next m

Kt_doc = ketQua
End Function

Function KtTrung2(L1_, L2_, L3_)

Dim dem_ngoai As Integer
Dim dem_trong As Integer
Dim a As Variant
a = Array(L1_, L2_, L3_)

Dim trung As Integer
trung = 0
dem_ngoai = 0

While trung = 0 And dem_ngoai < 3

dem_trong = dem_ngoai + 1
If a(dem_ngoai) <> "" Then
While trung = 0 And dem_trong < 3
If a(dem_ngoai) = a(dem_trong) Then
trung = 1
Else
End If
dem_trong = dem_trong + 1
Wend
Else
End If
dem_ngoai = dem_ngoai + 1
Wend
KtTrung2 = trung
End Function

Function KtTrungPhong_2(L1_, L2_, L3_, La_, Lb_, Lc_)

Dim a As Variant

a = Array(L1_, L2_, L3_, La_, Lb_, Lc_)


Dim i As Integer
Dim j As Integer
Dim x As Integer

Dim temp

'mang temp chua cac vitri coi thi
temp = Array(0, 0, 0, 0, 0, 0, 0)
j = 0
i = 0
'gan cho temp
While i < 6

If IsNumeric(a(i)) And a(i) <> 0 Then ' khac khong de tru truong hop cho do la lien ket cho gia tri 0
temp(j) = a(i)
If j < 2 Then
j = j + 1
Else
End If
Else
End If

i = i + 1
Wend
KtTrungPhong_2 = KtTrung2(temp(0), temp(1), temp(2))
End Function

Function KtTrung3(L1_, L2_, L3_, L4_)

Dim dem_ngoai As Integer
Dim dem_trong As Integer
Dim a As Variant
a = Array(L1_, L2_, L3_, L4_)

Dim trung As Integer
trung = 0
dem_ngoai = 0

While trung = 0 And dem_ngoai < 4

dem_trong = dem_ngoai + 1
If a(dem_ngoai) <> "" Then
While trung = 0 And dem_trong < 4
If a(dem_ngoai) = a(dem_trong) Then
trung = 1
Else
End If
dem_trong = dem_trong + 1
Wend
Else
End If
dem_ngoai = dem_ngoai + 1
Wend
KtTrung3 = trung
End Function

Function KtTrungPhong_3(L1_, L2_, L3_, L4_, La_, Lb_, Lc_, Ld_) ' 10 chuyen 4 mon

Dim a As Variant

a = Array(L1_, L2_, L3_, L4_, La_, Lb_, Lc_, Ld_)


Dim i As Integer
Dim j As Integer
Dim x As Integer

Dim temp

'mang temp chua cac vitri coi thi
temp = Array(0, 0, 0, 0, 0, 0, 0)
j = 0
i = 0
'gan cho temp
While i < 8

If IsNumeric(a(i)) And a(i) <> 0 Then ' khac khong de tru truong hop cho do la lien ket cho gia tri 0
temp(j) = a(i)
If j < 3 Then
j = j + 1
Else
End If
Else
End If

i = i + 1
Wend
KtTrungPhong_3 = KtTrung3(temp(0), temp(1), temp(2), temp(3))
End Function
 
CÔNG CỤ PHÂN CÔNG GIÁM THỊ COI THI BẰNG EXCEL

Công cụ này tôi đã viết và sử dụng hiệu quả nhiều năm rồi, bạn có thể vảo địa chỉ sau để download và sử dụng:
http://hhtham.khanhhoa.edu.vn/?ModuleId=4&TopicId=7
Trong quá trình sử dụng, nếu có gì thắc mắc, bạn có thể liên lạc cho tôi theo email:
thuyendachuynh@gmail.com

Function KTra_trung_cap(maGV1 As Variant, ma_truong1 As Variant, mon1 As Variant, maGV2 As Variant, ma_truong2 As Variant, mon2 As Variant, maGV3 As Variant, ma_truong3 As Variant, mon3 As Variant, maGV4 As Variant, ma_truong4 As Variant, mon4 As Variant, maGV5 As Variant, ma_truong5 As Variant, mon5 As Variant, maGV6 As Variant, ma_truong6 As Variant, mon6 As Variant, maPhongDauTien As Integer, soLuongPhong As Integer) As Variant
' gia thuat:
' quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong
'rut ra mang gvcocoithi
' quet mang gvcocoithi nay , moi phan tu
' quet tung buoi thi lay ra cap GV luu vo mang 2 capGV voiGV thi i
' kiem tra mang 2 co trung 2 phan tu hay khong. Do la ket qua tra ve cua ham
Dim aMaGV, aMaTruong, aMon1, aMon2, aMon3, aMon4, aMon5, aMon6 As Variant





aMon1 = mon1.Value2 ' bat dau tu 1
aMon2 = mon2.Value2
aMon3 = mon3.Value2
aMon4 = mon4.Value2
aMon5 = mon5.Value2
aMon6 = mon6.Value2
' kiem tra hop le du llieu nhap
' so phong thi khop voi day o quet vao hay khong
Dim aGvGhepCap(7) As Variant ' bat dau tu 0
If (mon1.Count / 4) <> soLuongPhong Or maGV1.Count <> soLuongPhong * 2 Or ma_truong1.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon2.Count / 4) <> soLuongPhong Or maGV2.Count <> soLuongPhong * 2 Or ma_truong2.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon3.Count / 4) <> soLuongPhong Or maGV3.Count <> soLuongPhong * 2 Or ma_truong3.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon4.Count / 4) <> soLuongPhong Or maGV4.Count <> soLuongPhong * 2 Or ma_truong4.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon5.Count / 4) <> soLuongPhong Or maGV5.Count <> soLuongPhong * 2 Or ma_truong5.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon6.Count / 4) <> soLuongPhong Or maGV6.Count <> soLuongPhong * 2 Or ma_truong6.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap = " Day o ban chon khong hop le. "
Exit Function
Else
End If
Dim i, j, k As Integer
Dim soDongQuet As Integer
soDongQuet = mon1.Count / 2

' Buoc 1 : quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong



Dim aGVCoCoiThi(150), aTempGVCoCoiThi(901) As Integer
Dim aMaTruongGVCoCoiThi(150), aTempMaTruongGVCoCoiThi(901) As Variant
Dim aMonj As Variant 'bat dau tu 1
k = 1
For i = 1 To 6
Select Case i
Case 1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2
Case 4
aMaGV = maGV4.Value2
aMaTruong = ma_truong4.Value2
Case 5
aMaGV = maGV5.Value2
aMaTruong = ma_truong5.Value2
Case 6
aMaGV = maGV6.Value2
aMaTruong = ma_truong6.Value2

Case Else
' thong bao
'KTra_trung_cap = 2 ' thoat ly do khac
'Exit Function
End Select

' kiem tra coi 2 phong trong 1 buoi thi tuc co trung gv trong 1 cot
Dim t As Integer
t = Kt_Coi_1_luc_nhieu_phong(aMaGV, soLuongPhong)
If t <> 0 Then
'MsgBox "Loi : GV " & t & " Coi thi mot luc nhieu phong "
KTra_trung_cap = "Loi : GV " & t & " Coi thi mot luc nhieu phong "
Exit Function
Else
End If

'queet aMaGV cho ket qua vao aTempGVCoCoiThi
For j = 1 To maGV1.Count

aTempGVCoCoiThi(k) = aMaGV(j, 1)
aTempMaTruongGVCoCoiThi(k) = aMaTruong(j, 1)
k = k + 1
Next j
Next i
'tu mang aTempGVCoCoiThi bo bot phan tu trung ra mang aGVCoCoiThi
'dong thoi kien tra gv coi thi qua 5 buoi
' sort theo thu tu tang dan truoc
Dim temp, dem As Integer
Dim tempMaTruong As Variant
For i = 1 To 900
For j = i + 1 To 899
If aTempGVCoCoiThi(j) > aTempGVCoCoiThi(i) Then
temp = aTempGVCoCoiThi(j)
aTempGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aTempGVCoCoiThi(i) = temp

tempMaTruong = aTempMaTruongGVCoCoiThi(j)
aTempMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
aTempMaTruongGVCoCoiThi(i) = tempMaTruong

Else
End If
Next j
Next i

'tao mang aGVCoCoiThi dong thoi kiem tr coi qua 6 buoi tuc la phan cong 2 phong 1 luc
j = 1
For i = 1 To 900
' debug i=246
If i = 246 Then
k = 1
Else
End If
If aTempGVCoCoiThi(i) <> 0 Then
' neu trung thi bo bot dem tang 1
' else thi lay vao aGVcocoithi
If i > 1 Then
If aTempGVCoCoiThi(i) = aTempGVCoCoiThi(i - 1) Then
dem = dem + 1
'If dem = 6 Then
' MsgBox "Phan cong GV " & aTempGVCoCoiThi(i) & "qua 6 lan"
' KTra_trung_cap = 4
' Exit Function
'Else
'End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
dem = 0
End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
End If
Else
End If
Next i

Dim soGVCoiThi As Integer
soGVCoiThi = 0
' dem so gv co coi thi
For i = 1 To 600

If IsEmpty(aGVCoCoiThi(i)) Then
Exit For
End If
soGVCoiThi = soGVCoiThi + 1

Next i
'dang lam

Dim aMaGVCoiCap(7) As Integer
Dim aMaTruongGVCoiCap(7) As Variant
Dim aMonCoiCap(7) As Integer
'Dim aMonCoPhong(7) As Integer

Dim chiSoHienHanhGVCap As Integer ' la chi so hien hanh cua con tro trong hai mang tren danh quet
chiSoHienHanhGVCap = 1 ' het mot gv reset mot lan
' quet tren danh sach gv coi thi
For i = 1 To soGVCoiThi
For j = 1 To 6 ' quet tung cot gv de tim gv thu i
' tim xem i la gt 1 hay gt 2
' chuyen j tuong ung aMon
' Dim aMonj As Variant 'bat dau tu 1
Select Case j
Case 1
aMonj = aMon1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMonj = aMon2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMonj = aMon3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2
Case 4
aMonj = aMon4
aMaGV = maGV4.Value2
aMaTruong = ma_truong4.Value2
Case 5
aMonj = aMon5
aMaGV = maGV5.Value2
aMaTruong = ma_truong5.Value2
Case 6
aMonj = aMon6
aMaGV = maGV6.Value2
aMaTruong = ma_truong6.Value2

' Case Else
' thong bao
' KTra_trung_cap = 2 ' thoat ly do khac
' Exit Function
End Select
' trong tung mon quet tu tren xuong
Dim m As Integer ' m dung de debug
For k = 1 To soLuongPhong * 2 ' quet tung cot gv trong tung buoi thi de tim gv thu i
If aGVCoCoiThi(i) = aMaGV(k, 1) Then
' lay ma phong coi thi va vi tri coi thi la gt 1 hay 2
Dim giamThiGVThuk As Integer
If aMonj(k, 1) <> "" Then
giamThiGVThuk = 1
Else
giamThiGVThuk = 2
End If

Dim phongCoiThiCuaGtThuk As Integer
phongCoiThiCuaGtThuk = aMonj(k, giamThiGVThuk)
'___________________________

' den day gv coi thi dang xet la gv thu k chinh la gv thu i
' phong coi thi la phongCoiThiCuaGtThuk
' va la giam thi giamThiGVThuk
'______________________________


' vong lap k xet tung dong tu tren xuong de lay ra GV di cap voi gv thu k
'neu k la gt 1 thi quet cot gt 2
Dim cotQuet As Integer
If giamThiGVThuk = 1 Then
cotQuet = 2
Else
cotQuet = 1
End If
' sau do quet lai mon hien hanh de tim gv cap aGvGhepCap(n)= chi so k
'quet vao mon co cot la cotQuet va noi dung tim la phongcoi thi cua gv thu k
Dim n As Integer
For n = 1 To soLuongPhong * 2
If aMonj(n, cotQuet) = phongCoiThiCuaGtThuk Then
' lay ma gv va ma truong cua gv thu n vao luu vao mang gv cap
aGvGhepCap(chiSoHienHanhGVCap) = aMaGV(n, 1)
aMaTruongGVCoiCap(chiSoHienHanhGVCap) = aMaTruong(n, 1)

aMonCoiCap(chiSoHienHanhGVCap) = j

chiSoHienHanhGVCap = chiSoHienHanhGVCap + 1


Else
End If
Next n



m = 1

Else
End If
Next k
Next j
' kiem tra xem co trung cap , trung truong hay khong
'quet mang aGvGhepCap xem co ghep lai cap cu khong tuc la co 2 phan tu giong nhau khong

Dim p, q As Integer
For p = 1 To 6
For q = p + 1 To 6
If aGvGhepCap(q) = aGvGhepCap(p) And aGvGhepCap(q) <> 0 Then
Dim gv_trung As Variant
gv_trung = aGvGhepCap(p)
KTra_trung_cap = "Trung cap : GV " & aGVCoCoiThi(i) & " bi gap lai voi gv " & gv_trung & " vao buoi thu " & aMonCoiCap(q)
Exit Function
Else
End If

Next q
Next p

' KIEM TRA TRUNG TRUONG
For p = 1 To 6

If Trim(aMaTruongGVCoCoiThi(i)) = Trim(aMaTruongGVCoiCap(p)) And aMaTruongGVCoiCap(p) <> "" Then
KTra_trung_cap = "Trung truong cua GV " & aGVCoCoiThi(i) & " o mon thu " & p
Exit Function
Else
End If


Next p

' reset aGvGhepCap va aMonCoiCap va aMaTruongGVCoiCap
For p = 1 To 6
aGvGhepCap(p) = 0
aMonCoiCap(p) = 0
aMaTruongGVCoiCap(p) = ""
Next p
chiSoHienHanhGVCap = 1
Next i












KTra_trung_cap = " 0 "
End Function
 
CÔNG CỤ PHÂN CÔNG GIÁM THỊ COI THI BẰNG EXCEL

Công cụ này tôi đã viết và sử dụng hiệu quả nhiều năm rồi, bạn có thể vảo địa chỉ sau để download và sử dụng:
http://hhtham.khanhhoa.edu.vn/?ModuleId=4&TopicId=7
Trong quá trình sử dụng, nếu có gì thắc mắc, bạn có thể liên lạc cho tôi theo email:
thuyendachuynh@gmail.com

Function Kt_Coi_1_luc_nhieu_phong(dayKiemTra As Variant, soLuongPhongThi As Integer) As Integer
' tra ve ma gv cooi thi nhieu phong

'xep giam dan day cac phong thu duoc
Dim temp, i, j As Integer
Dim dayKiemTraTemp As Variant
dayKiemTraTemp = dayKiemTra
For i = 1 To soLuongPhongThi * 2
For j = i + 1 To (soLuongPhongThi * 2)
If dayKiemTraTemp(j, 1) < dayKiemTraTemp(i, 1) Then
temp = dayKiemTraTemp(j, 1)
dayKiemTraTemp(j, 1) = dayKiemTraTemp(i, 1)
dayKiemTraTemp(i, 1) = temp
Else
End If
Next j
Next i



' quet day neu co trung thi exit va bao ket qua
For i = 1 To soLuongPhongThi * 2
If i > 1 Then
If dayKiemTraTemp(i, 1) = dayKiemTraTemp(i - 1, 1) Then
Kt_Coi_1_luc_nhieu_phong = dayKiemTraTemp(i, 1)
Exit Function
Else
End If
Else

End If
Next i

Kt_Coi_1_luc_nhieu_phong = 0
End Function

Function KTra_trung_cap2(maGV1 As Variant, ma_truong1 As Variant, mon1 As Variant, maGV2 As Variant, ma_truong2 As Variant, mon2 As Variant, maGV3 As Variant, ma_truong3 As Variant, mon3 As Variant, maPhongDauTien As Integer, soLuongPhong As Integer) As Variant
' gia thuat:
' quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong
'rut ra mang gvcocoithi
' quet mang gvcocoithi nay , moi phan tu
' quet tung buoi thi lay ra cap GV luu vo mang 2 capGV voiGV thi i
' kiem tra mang 2 co trung 2 phan tu hay khong. Do la ket qua tra ve cua ham
Dim aMaGV, aMaTruong, aMon1, aMon2, aMon3, aMon4, aMon5, aMon6 As Variant





aMon1 = mon1.Value2 ' bat dau tu 1
aMon2 = mon2.Value2
aMon3 = mon3.Value2

' kiem tra hop le du llieu nhap
' so phong thi khop voi day o quet vao hay khong
Dim aGvGhepCap(7) As Variant ' bat dau tu 0
If (mon1.Count / 4) <> soLuongPhong Or maGV1.Count <> soLuongPhong * 2 Or ma_truong1.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon2.Count / 4) <> soLuongPhong Or maGV2.Count <> soLuongPhong * 2 Or ma_truong2.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon3.Count / 4) <> soLuongPhong Or maGV3.Count <> soLuongPhong * 2 Or ma_truong3.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If

Dim i, j, k As Integer
Dim soDongQuet As Integer
soDongQuet = mon1.Count / 2

' Buoc 1 : quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong



Dim aGVCoCoiThi(150), aTempGVCoCoiThi(901) As Integer
Dim aMaTruongGVCoCoiThi(150), aTempMaTruongGVCoCoiThi(901) As Variant
Dim aMonj As Variant 'bat dau tu 1
k = 1
For i = 1 To 3
Select Case i
Case 1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2


Case Else
' thong bao
'KTra_trung_cap = 2 ' thoat ly do khac
'Exit Function
End Select

' kiem tra coi 2 phong trong 1 buoi thi tuc co trung gv trong 1 cot
Dim t As Integer
t = Kt_Coi_1_luc_nhieu_phong(aMaGV, soLuongPhong)
If t <> 0 Then
'MsgBox "Loi : GV " & t & " Coi thi mot luc nhieu phong "
KTra_trung_cap2 = "Loi : GV " & t & " Coi thi mot luc nhieu phong "
Exit Function
Else
End If

'queet aMaGV cho ket qua vao aTempGVCoCoiThi
For j = 1 To maGV1.Count

aTempGVCoCoiThi(k) = aMaGV(j, 1)
aTempMaTruongGVCoCoiThi(k) = aMaTruong(j, 1)
k = k + 1
Next j
Next i
'tu mang aTempGVCoCoiThi bo bot phan tu trung ra mang aGVCoCoiThi
'dong thoi kien tra gv coi thi qua 5 buoi
' sort theo thu tu tang dan truoc
Dim temp, dem As Integer
Dim tempMaTruong As Variant
For i = 1 To 900
For j = i + 1 To 899
If aTempGVCoCoiThi(j) > aTempGVCoCoiThi(i) Then
temp = aTempGVCoCoiThi(j)
aTempGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aTempGVCoCoiThi(i) = temp

tempMaTruong = aTempMaTruongGVCoCoiThi(j)
aTempMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
aTempMaTruongGVCoCoiThi(i) = tempMaTruong

Else
End If
Next j
Next i

'tao mang aGVCoCoiThi dong thoi kiem tr coi qua 6 buoi tuc la phan cong 2 phong 1 luc
j = 1
For i = 1 To 900
' debug i=246
If i = 246 Then
k = 1
Else
End If
If aTempGVCoCoiThi(i) <> 0 Then
' neu trung thi bo bot dem tang 1
' else thi lay vao aGVcocoithi
If i > 1 Then
If aTempGVCoCoiThi(i) = aTempGVCoCoiThi(i - 1) Then
dem = dem + 1
'If dem = 6 Then
' MsgBox "Phan cong GV " & aTempGVCoCoiThi(i) & "qua 6 lan"
' KTra_trung_cap = 4
' Exit Function
'Else
'End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
dem = 0
End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
End If
Else
End If
Next i

Dim soGVCoiThi As Integer
soGVCoiThi = 0
' dem so gv co coi thi
For i = 1 To 600

If IsEmpty(aGVCoCoiThi(i)) Then
Exit For
End If
soGVCoiThi = soGVCoiThi + 1

Next i
'dang lam

Dim aMaGVCoiCap(7) As Integer
Dim aMaTruongGVCoiCap(7) As Variant
Dim aMonCoiCap(7) As Integer
'Dim aMonCoPhong(7) As Integer

Dim chiSoHienHanhGVCap As Integer ' la chi so hien hanh cua con tro trong hai mang tren danh quet
chiSoHienHanhGVCap = 1 ' het mot gv reset mot lan
' quet tren danh sach gv coi thi
For i = 1 To soGVCoiThi
For j = 1 To 3 ' quet tung cot gv de tim gv thu i
' tim xem i la gt 1 hay gt 2
' chuyen j tuong ung aMon
' Dim aMonj As Variant 'bat dau tu 1
Select Case j
Case 1
aMonj = aMon1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMonj = aMon2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMonj = aMon3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2


' Case Else
' thong bao
' KTra_trung_cap = 2 ' thoat ly do khac
' Exit Function
End Select
' trong tung mon quet tu tren xuong
Dim m As Integer ' m dung de debug
For k = 1 To soLuongPhong * 2 ' quet tung cot gv trong tung buoi thi de tim gv thu i
If aGVCoCoiThi(i) = aMaGV(k, 1) Then
' lay ma phong coi thi va vi tri coi thi la gt 1 hay 2
Dim giamThiGVThuk As Integer
If aMonj(k, 1) <> "" Then
giamThiGVThuk = 1
Else
giamThiGVThuk = 2
End If

Dim phongCoiThiCuaGtThuk As Integer
phongCoiThiCuaGtThuk = aMonj(k, giamThiGVThuk)
'___________________________

' den day gv coi thi dang xet la gv thu k chinh la gv thu i
' phong coi thi la phongCoiThiCuaGtThuk
' va la giam thi giamThiGVThuk
'______________________________


' vong lap k xet tung dong tu tren xuong de lay ra GV di cap voi gv thu k
'neu k la gt 1 thi quet cot gt 2
Dim cotQuet As Integer
If giamThiGVThuk = 1 Then
cotQuet = 2
Else
cotQuet = 1
End If
' sau do quet lai mon hien hanh de tim gv cap aGvGhepCap(n)= chi so k
'quet vao mon co cot la cotQuet va noi dung tim la phongcoi thi cua gv thu k
Dim n As Integer
For n = 1 To soLuongPhong * 2
If aMonj(n, cotQuet) = phongCoiThiCuaGtThuk Then
' lay ma gv va ma truong cua gv thu n vao luu vao mang gv cap
aGvGhepCap(chiSoHienHanhGVCap) = aMaGV(n, 1)
aMaTruongGVCoiCap(chiSoHienHanhGVCap) = aMaTruong(n, 1)

aMonCoiCap(chiSoHienHanhGVCap) = j

chiSoHienHanhGVCap = chiSoHienHanhGVCap + 1


Else
End If
Next n



m = 1

Else
End If
Next k
Next j
' kiem tra xem co trung cap , trung truong hay khong
'quet mang aGvGhepCap xem co ghep lai cap cu khong tuc la co 2 phan tu giong nhau khong

Dim p, q As Integer
For p = 1 To 3
For q = p + 1 To 3
If aGvGhepCap(q) = aGvGhepCap(p) And aGvGhepCap(q) <> 0 Then
Dim gv_trung As Variant
gv_trung = aGvGhepCap(p)
KTra_trung_cap2 = "Trung Cap GV : GV " & aGVCoCoiThi(i) & " bi gap lai voi gv " & gv_trung & " vao buoi thu " & aMonCoiCap(q)
Exit Function
Else
End If

Next q
Next p

' KIEM TRA TRUNG TRUONG
For p = 1 To 3

If Trim(aMaTruongGVCoCoiThi(i)) = Trim(aMaTruongGVCoiCap(p)) And aMaTruongGVCoiCap(p) <> "" Then
KTra_trung_cap2 = "Trung truong : GV " & aGVCoCoiThi(i) & " o mon thu " & p
Exit Function
Else
End If


Next p

' reset aGvGhepCap va aMonCoiCap va aMaTruongGVCoiCap
For p = 1 To 3
aGvGhepCap(p) = 0
aMonCoiCap(p) = 0
aMaTruongGVCoiCap(p) = ""
Next p
chiSoHienHanhGVCap = 1
Next i












KTra_trung_cap2 = " 0 "
End Function
 
Về cơ bản công việc này phải thực hiện thủ công thôi, sau đó dùng Excel để kiểm tra việc phân công có lặp lại cặp, lặp lại phòng, và còn nữa là 2gv cùng trường có cùng 1 cặp hay không ? (tôi có làm công việc này rồi)

Function Kt_Coi_1_luc_nhieu_phong(dayKiemTra As Variant, soLuongPhongThi As Integer) As Integer
' tra ve ma gv cooi thi nhieu phong

'xep giam dan day cac phong thu duoc
Dim temp, i, j As Integer
Dim dayKiemTraTemp As Variant
dayKiemTraTemp = dayKiemTra
For i = 1 To soLuongPhongThi * 2
For j = i + 1 To (soLuongPhongThi * 2)
If dayKiemTraTemp(j, 1) < dayKiemTraTemp(i, 1) Then
temp = dayKiemTraTemp(j, 1)
dayKiemTraTemp(j, 1) = dayKiemTraTemp(i, 1)
dayKiemTraTemp(i, 1) = temp
Else
End If
Next j
Next i



' quet day neu co trung thi exit va bao ket qua
For i = 1 To soLuongPhongThi * 2
If i > 1 Then
If dayKiemTraTemp(i, 1) = dayKiemTraTemp(i - 1, 1) Then
Kt_Coi_1_luc_nhieu_phong = dayKiemTraTemp(i, 1)
Exit Function
Else
End If
Else

End If
Next i

Kt_Coi_1_luc_nhieu_phong = 0
End Function

Function KTra_trung_cap2(maGV1 As Variant, ma_truong1 As Variant, mon1 As Variant, maGV2 As Variant, ma_truong2 As Variant, mon2 As Variant, maGV3 As Variant, ma_truong3 As Variant, mon3 As Variant, maPhongDauTien As Integer, soLuongPhong As Integer) As Variant
' gia thuat:
' quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong
'rut ra mang gvcocoithi
' quet mang gvcocoithi nay , moi phan tu
' quet tung buoi thi lay ra cap GV luu vo mang 2 capGV voiGV thi i
' kiem tra mang 2 co trung 2 phan tu hay khong. Do la ket qua tra ve cua ham
Dim aMaGV, aMaTruong, aMon1, aMon2, aMon3, aMon4, aMon5, aMon6 As Variant





aMon1 = mon1.Value2 ' bat dau tu 1
aMon2 = mon2.Value2
aMon3 = mon3.Value2

' kiem tra hop le du llieu nhap
' so phong thi khop voi day o quet vao hay khong
Dim aGvGhepCap(7) As Variant ' bat dau tu 0
If (mon1.Count / 4) <> soLuongPhong Or maGV1.Count <> soLuongPhong * 2 Or ma_truong1.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon2.Count / 4) <> soLuongPhong Or maGV2.Count <> soLuongPhong * 2 Or ma_truong2.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong hop le. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If
If (mon3.Count / 4) <> soLuongPhong Or maGV3.Count <> soLuongPhong * 2 Or ma_truong3.Count <> soLuongPhong * 2 Then
MsgBox " Day o ban chon khong khop. "
KTra_trung_cap2 = " Day o ban chon khong hop le. "
Exit Function
Else
End If

Dim i, j, k As Integer
Dim soDongQuet As Integer
soDongQuet = mon1.Count / 2

' Buoc 1 : quet cac cot magv rut ra da cac gv co coi thi luu vao mang 1 phu
'dong thoi kiem tra qua 6 lan hay khong



Dim aGVCoCoiThi(150), aTempGVCoCoiThi(901) As Integer
Dim aMaTruongGVCoCoiThi(150), aTempMaTruongGVCoCoiThi(901) As Variant
Dim aMonj As Variant 'bat dau tu 1
k = 1
For i = 1 To 3
Select Case i
Case 1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2


Case Else
' thong bao
'KTra_trung_cap = 2 ' thoat ly do khac
'Exit Function
End Select

' kiem tra coi 2 phong trong 1 buoi thi tuc co trung gv trong 1 cot
Dim t As Integer
t = Kt_Coi_1_luc_nhieu_phong(aMaGV, soLuongPhong)
If t <> 0 Then
'MsgBox "Loi : GV " & t & " Coi thi mot luc nhieu phong "
KTra_trung_cap2 = "Loi : GV " & t & " Coi thi mot luc nhieu phong "
Exit Function
Else
End If

'queet aMaGV cho ket qua vao aTempGVCoCoiThi
For j = 1 To maGV1.Count

aTempGVCoCoiThi(k) = aMaGV(j, 1)
aTempMaTruongGVCoCoiThi(k) = aMaTruong(j, 1)
k = k + 1
Next j
Next i
'tu mang aTempGVCoCoiThi bo bot phan tu trung ra mang aGVCoCoiThi
'dong thoi kien tra gv coi thi qua 5 buoi
' sort theo thu tu tang dan truoc
Dim temp, dem As Integer
Dim tempMaTruong As Variant
For i = 1 To 900
For j = i + 1 To 899
If aTempGVCoCoiThi(j) > aTempGVCoCoiThi(i) Then
temp = aTempGVCoCoiThi(j)
aTempGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aTempGVCoCoiThi(i) = temp

tempMaTruong = aTempMaTruongGVCoCoiThi(j)
aTempMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
aTempMaTruongGVCoCoiThi(i) = tempMaTruong

Else
End If
Next j
Next i

'tao mang aGVCoCoiThi dong thoi kiem tr coi qua 6 buoi tuc la phan cong 2 phong 1 luc
j = 1
For i = 1 To 900
' debug i=246
If i = 246 Then
k = 1
Else
End If
If aTempGVCoCoiThi(i) <> 0 Then
' neu trung thi bo bot dem tang 1
' else thi lay vao aGVcocoithi
If i > 1 Then
If aTempGVCoCoiThi(i) = aTempGVCoCoiThi(i - 1) Then
dem = dem + 1
'If dem = 6 Then
' MsgBox "Phan cong GV " & aTempGVCoCoiThi(i) & "qua 6 lan"
' KTra_trung_cap = 4
' Exit Function
'Else
'End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
dem = 0
End If
Else
aGVCoCoiThi(j) = aTempGVCoCoiThi(i)
aMaTruongGVCoCoiThi(j) = aTempMaTruongGVCoCoiThi(i)
j = j + 1
End If
Else
End If
Next i

Dim soGVCoiThi As Integer
soGVCoiThi = 0
' dem so gv co coi thi
For i = 1 To 600

If IsEmpty(aGVCoCoiThi(i)) Then
Exit For
End If
soGVCoiThi = soGVCoiThi + 1

Next i
'dang lam

Dim aMaGVCoiCap(7) As Integer
Dim aMaTruongGVCoiCap(7) As Variant
Dim aMonCoiCap(7) As Integer
'Dim aMonCoPhong(7) As Integer

Dim chiSoHienHanhGVCap As Integer ' la chi so hien hanh cua con tro trong hai mang tren danh quet
chiSoHienHanhGVCap = 1 ' het mot gv reset mot lan
' quet tren danh sach gv coi thi
For i = 1 To soGVCoiThi
For j = 1 To 3 ' quet tung cot gv de tim gv thu i
' tim xem i la gt 1 hay gt 2
' chuyen j tuong ung aMon
' Dim aMonj As Variant 'bat dau tu 1
Select Case j
Case 1
aMonj = aMon1
aMaGV = maGV1.Value2
aMaTruong = ma_truong1.Value2
Case 2
aMonj = aMon2
aMaGV = maGV2.Value2
aMaTruong = ma_truong2.Value2
Case 3
aMonj = aMon3
aMaGV = maGV3.Value2
aMaTruong = ma_truong3.Value2


' Case Else
' thong bao
' KTra_trung_cap = 2 ' thoat ly do khac
' Exit Function
End Select
' trong tung mon quet tu tren xuong
Dim m As Integer ' m dung de debug
For k = 1 To soLuongPhong * 2 ' quet tung cot gv trong tung buoi thi de tim gv thu i
If aGVCoCoiThi(i) = aMaGV(k, 1) Then
' lay ma phong coi thi va vi tri coi thi la gt 1 hay 2
Dim giamThiGVThuk As Integer
If aMonj(k, 1) <> "" Then
giamThiGVThuk = 1
Else
giamThiGVThuk = 2
End If

Dim phongCoiThiCuaGtThuk As Integer
phongCoiThiCuaGtThuk = aMonj(k, giamThiGVThuk)
'___________________________

' den day gv coi thi dang xet la gv thu k chinh la gv thu i
' phong coi thi la phongCoiThiCuaGtThuk
' va la giam thi giamThiGVThuk
'______________________________


' vong lap k xet tung dong tu tren xuong de lay ra GV di cap voi gv thu k
'neu k la gt 1 thi quet cot gt 2
Dim cotQuet As Integer
If giamThiGVThuk = 1 Then
cotQuet = 2
Else
cotQuet = 1
End If
' sau do quet lai mon hien hanh de tim gv cap aGvGhepCap(n)= chi so k
'quet vao mon co cot la cotQuet va noi dung tim la phongcoi thi cua gv thu k
Dim n As Integer
For n = 1 To soLuongPhong * 2
If aMonj(n, cotQuet) = phongCoiThiCuaGtThuk Then
' lay ma gv va ma truong cua gv thu n vao luu vao mang gv cap
aGvGhepCap(chiSoHienHanhGVCap) = aMaGV(n, 1)
aMaTruongGVCoiCap(chiSoHienHanhGVCap) = aMaTruong(n, 1)

aMonCoiCap(chiSoHienHanhGVCap) = j

chiSoHienHanhGVCap = chiSoHienHanhGVCap + 1


Else
End If
Next n



m = 1

Else
End If
Next k
Next j
' kiem tra xem co trung cap , trung truong hay khong
'quet mang aGvGhepCap xem co ghep lai cap cu khong tuc la co 2 phan tu giong nhau khong

Dim p, q As Integer
For p = 1 To 3
For q = p + 1 To 3
If aGvGhepCap(q) = aGvGhepCap(p) And aGvGhepCap(q) <> 0 Then
Dim gv_trung As Variant
gv_trung = aGvGhepCap(p)
KTra_trung_cap2 = "Trung Cap GV : GV " & aGVCoCoiThi(i) & " bi gap lai voi gv " & gv_trung & " vao buoi thu " & aMonCoiCap(q)
Exit Function
Else
End If

Next q
Next p

' KIEM TRA TRUNG TRUONG
For p = 1 To 3

If Trim(aMaTruongGVCoCoiThi(i)) = Trim(aMaTruongGVCoiCap(p)) And aMaTruongGVCoiCap(p) <> "" Then
KTra_trung_cap2 = "Trung truong : GV " & aGVCoCoiThi(i) & " o mon thu " & p
Exit Function
Else
End If


Next p

' reset aGvGhepCap va aMonCoiCap va aMaTruongGVCoiCap
For p = 1 To 3
aGvGhepCap(p) = 0
aMonCoiCap(p) = 0
aMaTruongGVCoiCap(p) = ""
Next p
chiSoHienHanhGVCap = 1
Next i












KTra_trung_cap2 = " 0 "
End Function
 

File đính kèm

  • PCGT 240614 - Unviewable.rar
    208.3 KB · Đọc: 42
Lần chỉnh sửa cuối:
không biết bạn nào có thuật toán rõ ràng về bài toán phân chia này không. Nếu sắp xếp thỏa các điều kiện :
- Giáo viên không coi lại phòng thi.
- hai giáo viên không coi cùng nhau quá 1 lần.
- Hai giáo viên không cùng trường.
- Không coi môn đang dạy.
Mình làm phần mềm phân chia bằng c# mà chưa nghĩ được thuật toán đúng,
Mong giúp đỡ.
 
phân công giám thị

Bạn tải về dùng phần này mình dùng mấy năm roi
 

File đính kèm

  • Phan mem phan cong coi thi.rar
    72 KB · Đọc: 93
không biết bạn nào có thuật toán rõ ràng về bài toán phân chia này không. Nếu sắp xếp thỏa các điều kiện :
- Giáo viên không coi lại phòng thi.
- hai giáo viên không coi cùng nhau quá 1 lần.
- Hai giáo viên không cùng trường.
- Không coi môn đang dạy.
Mình làm phần mềm phân chia bằng c# mà chưa nghĩ được thuật toán đúng,
Mong giúp đỡ.
Nếu thêm điều kiện không coi môn cùng dạy nữa thì chưa biết có thoả mãn được hết không. Nếu mà chỉ có 3 điều kiện kia thì OK. Mình đã thiết kế phần này (bằng VBA) và thấy là làm được với điều kiện số phòng thi lớn hơn hoặc bằng số buổi thi còn nếu nhỏ hơn thì khả năng xếp được là rất ít. Cách làm như sau: Đầu tiên ta ghép tất cả các cặp giám thị không cùng đơn vị với nhau để thành một ngân hàng cặp giám thị sau đó "thả" các cặp đó vào các phòng trong các buổi và kiểm tra các điều kiện còn lại nếu không thoả mãn thì chuyển qua cặp khác.
Bạn có thể vào https://sites.google.com/site/xuanhoa7604/ để tham khảo tiện ích do mình viết.
 
Lần chỉnh sửa cuối:
Nếu thêm điều kiện không coi môn cùng dạy nữa thì chưa biết có thoả mãn được hết không. Nếu mà chỉ có 3 điều kiện kia thì OK. Mình đã thiết kế phần này (bằng VBA) và thấy là làm được với điều kiện số phòng thi lớn hơn hoặc bằng số buổi thi còn nếu nhỏ hơn thì khả năng xếp được là rất ít. Cách làm như sau: Đầu tiên ta ghép tất cả các cặp giám thị không cùng đơn vị với nhau để thành một ngân hàng cặp giám thị sau đó "thả" các cặp đó vào các phòng trong các buổi và kiểm tra các điều kiện còn lại nếu không thoả mãn thì chuyển qua cặp khác.
Bạn có thể vào https://sites.google.com/site/xuanhoa7604/ để tham khảo tiện ích do mình viết.
thấy nhiều file của các bác rất hay. Nhưng để áp dụng vào phân công giáo viên xem thi thì thấy hơi cầu kì. Theo em việc phân công giám thị hiện nay tại các trường thpt, kể cả thi thpt qg thì em thấy khác quá. Hiện nay thực hiện việc bốc thăm ngãu nhiên.
1- thường thì một hội đồng thi huy động 3 đơn vị tham gia
2- Yêu cầu :
a- 1 giám thị không canh lại phòng đã canh trước đó ( kể cả làm gt1 hay gt2 - 1 giám thi có thể làm gt 1 ở môn 1, môn 2 làm gt 2... nhưng tránh trường hợp chỉ làm 1 nhiệm vụ mất công bằng giữa các giám thị )- không trùng phòng.
b- 2 giám thị cùng 1 đơn vị không canh cùng nhau 1 phòng - không trùng đơn vị
c- 2 gíam thị chỉ gác cùng nhau 1 lần - không trùng cặp
d- thường các hội đồng cố định bộ phận GT3 ( chỉ thay đổi phòng giám sát. vd Môn 1 giám sát từ P1 đến P3, Môn 2 : P4-6....) và GT văn phòng ( GTVP thường không bốc thăm,cố định)
Việc phân công chỉ được tiến hành trước khi thi môn đó 30 phút và công khai, không được phân công trước.
vì vậy em nghĩ sau khi phân công môn gác môn thứ 1 thì lưu lại, khi phân công môn tiếp theo thì phải tự động kiểm tra dữ liệu của môn trước, nếu không trùng theo yêu cầu thì mới chấp nhận phương án và lưu lại.
Bác nào có cách tối ưu nhất không ạ? em có làm file dữ liệu demo phía dưới
 

File đính kèm

  • PCGT- DA CHINH LAI.xlsx
    27.6 KB · Đọc: 38
Lần chỉnh sửa cuối:
thấy nhiều file của các bác rất hay. Nhưng để áp dụng vào phân công giáo viên xem thi thì thấy hơi cầu kì. Theo em việc phân công giám thị hiện nay tại các trường thpt, kể cả thi thpt qg thì em thấy khác quá. Hiện nay thực hiện việc bốc thăm ngãu nhiên.
1- thường thì một hội đồng thi huy động 3 đơn vị tham gia
2- Yêu cầu :
a- 1 giám thị không canh lại phòng đã canh trước đó ( kể cả làm gt1 hay gt2 - 1 giám thi có thể làm gt 1 ở môn 1, môn 2 làm gt 2... nhưng tránh trường hợp chỉ làm 1 nhiệm vụ mất công bằng giữa các giám thị )- không trùng phòng.
b- 2 giám thị cùng 1 đơn vị không canh cùng nhau 1 phòng - không trùng đơn vị
c- 2 gíam thị chỉ gác cùng nhau 1 lần - không trùng cặp
d- thường các hội đồng cố định bộ phận GT3 ( chỉ thay đổi phòng giám sát. vd Môn 1 giám sát từ P1 đến P3, Môn 2 : P4-6....) và GT văn phòng ( GTVP thường không bốc thăm,cố định)
Việc phân công chỉ được tiến hành trước khi thi môn đó 30 phút và công khai, không được phân công trước.
vì vậy em nghĩ sau khi phân công môn gác môn thứ 1 thì lưu lại, khi phân công môn tiếp theo thì phải tự động kiểm tra dữ liệu của môn trước, nếu không trùng theo yêu cầu thì mới chấp nhận phương án và lưu lại.
Bác nào có cách tối ưu nhất không ạ? em có làm file dữ liệu demo phía dưới
Nói về phân công giám thị, em thấy có cái này hay nè, đảm bảo các yêu cầu của bác Huutinh85, em đã dùng nó được một thời gian, thấy rất ổn, tiếc là tác giả không phát triển thêm.
Cách sử dụng: Nhập thông tin về giám thị => chọn ""Thực hiện" => Chọn các yêu cầu (không trùng cặp/phòng, đơn vị...)
 

File đính kèm

  • GiamThi.rar
    184.9 KB · Đọc: 61
Nói về phân công giám thị, em thấy có cái này hay nè, đảm bảo các yêu cầu của bác Huutinh85, em đã dùng nó được một thời gian, thấy rất ổn, tiếc là tác giả không phát triển thêm.
Cách sử dụng: Nhập thông tin về giám thị => chọn ""Thực hiện" => Chọn các yêu cầu (không trùng cặp/phòng, đơn vị...)
Phương án của bác này thì ok nhưng có một điều là mình thi từng buổi, từng môn, nên nếu chọn số lượng môn cùng lúc thì kết quả phân công này sẽ biết trước, điều đó mất tính bảo mật. vì vậy nếu biến đổi được 1 lần thì sẽ chọn phân công, lưu lại, môn tiếp theo lại chọn phân công tiếp, khi đó sẽ kiểm tra các điều kiện trùng.
 
Phân công giám thị hiệu quả nhất(đíng quy định)

Giải pháp trên Excel thì hơi phức tạp, cảm ơn các đóng góp bổ ích, nếu mà đc quản lý chuyên môn nào không biết lập trình thì có thể vào đây để tải phần mềm trên cả tuyệt vời: http://hoanggia.org/Products/PCGT.aspx
đây là bản miễn phí về dùng, để thời gian tập chung chuyên môn mà đào tạo ra những học trò như chủ nhân của phần mềm trên. Nhớ là hãy cảm ơn chủ nhân pm đó nhé...Chúc vui!!$@!!
link chết rồi bạn ơi.
Bài đã được tự động gộp:

Tham khảo cái này xem (phân công thỏa mãn 100% các yêu cầu trong quy chế thi TN)
Tải bản mới nhất tại http://sites.google.com/site/xuanhoa7604/
mình làm thế nào để đăng ký sử dụng được vậy ah
 
Web KT
Back
Top Bottom