Dùng Excel để sắp xếp giám thị trông thi (1 người xem)

Liên hệ QC

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

nmhungcncm

Thành viên hoạt động
Tham gia
20/10/06
Bài viết
182
Được thích
80
Lần đầu tiên tôi vào diễn đàn, tôi không biết bắt đầu từ đâu.Gửi thế nào cho đúng địa chỉ, nếu bài viết này sai địa chỉ, tôi nhờ các admin chuyển hộ.
Hôm nay tôi nhờ các anh chị trong diễn đàn giúp đỡ dùm việc viết hàm phân công coi thi trong excel, cụ thể như sau. Khi coi thi, kiểm tra yêu cầu :
- giám thị không coi thi quá 1 lần tại 1 phòng thi bất kì.(buổi này coi phòng này thì buổi sau phải coi phòng khác)
- giám thị không được phép cùng nhau coi thi quá 1 lần tại 1 phòng thi bất kì.(2 giám thi đã cùng nhau coi phòng này thì sẽ không cùng nhau coi phòng khác)
- trong mỗi phòng thi có 2 cán bộ coi thi GT1 và GT2.
- mỗi cán bộ coi thi làm giám thị hành lang(GT3) ít nhất 1 lần- số lượng giám thị 3 có thể ít hơn số phòng thi.
VÍ DỤ: lập phương án coi thi cho hội đồng thi có 40 phòng thi, số giám thị tham gia là 100 người
Cám ơn các Anh Chị.
 
Bạn cho biết thêm:
Mỗi phòng thi có 02 giám thị (GT1 và GT2) + 01 giám thị hành lang = 03 giám thị.
Một hội đồng thi gồm 40 phòng thi thì số giám thị = 40*3=120 giám thị.
Vậy nếu số giám thị tham gia < số giám thị cần thì thế nào?
 
nvson đã viết:
Bạn cho biết thêm:
Mỗi phòng thi có 02 giám thị (GT1 và GT2) + 01 giám thị hành lang = 03 giám thị.
Một hội đồng thi gồm 40 phòng thi thì số giám thị = 40*3=120 giám thị.
Vậy nếu số giám thị tham gia < số giám thị cần thì thế nào?

Đúng vậy, đầu vào của bạn phải cụ thể hơn nữa. Tốt nhất là gửi file ví dụ mẫu lên.
 
Cám ơn các Bạn, hôm qua buồn quá vì không thấy ai giúp cả. Hôm nay quá vui.
Thực tế địa phương tôi ít khi nào có đủ giám thị theo kiểu 2 giám thị trong(GT 1 và GT2) và 1 giám thị ngoài (GT3) cho 1 phòng thi ( không biết quê các bạn như thế nào).
Số liệu tôi đưa ra là số thực tế năm vừa rồi tại hội đồng coi thi của tôi đấy. thức gần trọn đêm trên Excel để cắt, dán, sắp xếp- khổ quá.
Yêu cầu :
1. 2 giám thị bất kỳ "gặp nhau" không quá 1 lần trong suốt kỳ thi
2. giám thị không coi thi quá 1 lần tại 1 phòng thi bất kỳ
3. mỗi giám thị làm giám thị 3 từ 1 đến 2 lần
4. mỗi giám thị phải vào coi trong phòng thi ít nhất 4 lần(4 môn)
5.Phân công giám thị cho 6 môn thi
Dữ liệu:
- Số lượng phòng thi: 40
- Số giám thị coi thi: 100

Không quan trọng việc phân công giám thị 3 vì phòng thi không liên tục,( do có nhiều dãy nhà, mỗi dãy số phòng lại không như nhau) cứ đế Gt 3 được phân công ngẫu nhiên mỗi phòng 1 GT, các phòng không có giám thị 3 thì để trống sau đó điều chỉnh thủ công
Xin các anh chị hướng dãn bằng excel để tôi gõ theo chứ theo ngôn ngữ VBA thì tôi đành chịu chết.
Mong được các chuyên gia giúp đỡ.Xin cám ơn.
 
Bạn thử làm gia công bằng cách xây dựng các cặp GT1-GT2, cụ thể 001-002; 001-003...,001-100=> sẽ có 4950 cặp GT(vd số GT là 001-100, tạo một DS 100 GT có mã là 001-100)
 
Cám ơn Bạn ThuNghi.
Theo hướng dẫn của bạn tôi hiểu nhưng thế này thì cách nào biết được có giám thị nào đó coi 2,3, 4 lần trong 1 phòng thi bất kì không?
 
Theo tôi nghỉ, nhưng chưa nghỉ ra!
- Bạn nên tạo 4950 cắp GT, và cứ cut dần khi nào hết... (thủ công tôi)
- Ta có left(CapGT,3) và right(CapGT,3) là GT1 và GT2, làm 6 môn thành 12 cột. Tại dòng 2 (Phòng 2) ta dùng conditional format với hàm countif, nếu nó >1 =countif($B2:C2,B2)>1 (ie có GT trùng) thì tô màu gì đó và next
- Bạn thử tiếp tục xem, tôi cũng mò thôi. Hy vọng bạn thành công
 
Bạn ThuNghi bạn ghi "- Ta có left(CapGT,3) và right(CapGT,3) là GT1 và GT2, làm 6 môn thành 12 cột" tôi không hiểu.
Lệnh"conditional format" tôi cũng làm vài lần để tìm hs có điểm TB dưới 2.0 và 3.5 nên cũng biết chút chút.
Bạn đừng tự ti, tôi còn tệ hại hơn bạn nhiều nhiều nữa kia
 
Tôi cũng thường sắp xếp giám thị trong các kỳ thi, cũng bằng tay thôi vì không rành tin lắm và trường cung nhiều giáo viên. Nhưng khi chia phòng thi cho giám thị thì cũng nên cần 1 trong 2 giám thị là GT1 hoặc GT2 là người có thể phát hiện, hoặc thông báo cho thí sinh khi có sai sót về đề thi từ Hội đồng coi thi. Ví dụ khi coi thi môn Tóan thì GT1 hoặc GT2 là giáo viên thuộcc tổ chuyên môn Tóan - Lý Hóa.
 
Theo tôi, bạn có thể sắp xếp như sau:
- Mỗi một loại giám thị 1, 2, 3 được chia thành 3 nhóm. GT1: A,B,C; GT2: D,E,F; GT3: G,H,K.
- Các nhóm này nằm sát nhau trên cột giám thị để tiện theo dõi và sao chép.
- Sau đó bạn tiến hành lắp ghép bằng copy thôi. Ví dụ:
Môn 1: A với D và G. Chỉ cần bôi đen và copy thôi,....
Môn 2: đảo B với E và K,...
Môn 3: C với F và H chẳng hạn,...

Như vậy vừa đáp ứng được yêu cầu, vừa đơn giản (chỉ cần copy thôi)

Không hiểu như vậy có vừa ý bạn không?
 
Mọi góp ý của các bạn đều có cái hay của nó, tôi nghĩ ít nhất cũng có vài nghìn bạn có nhu cầu như tôi (thi tốt nghiệp, kiểm tra học kì các môn ở các trường PT đặc biệt là các hội đồng thi có qui mô lớn rất cần thiết). Xin các bạn cứ đề xuất phương án của mình sau đó chọn phương án tối ưu phù hợp với khả năng ứng dụng tin học của từng người.
Bản thân tôi do mới biết tí ti về excel và thấy nhiều hàm quá nên tôi nghĩ nếu có hàm thì tiện dụng biết bao. Sự hỗ trợ quí báu của các bạn sẽ giúp không chỉ mình tôi mà còn giúp cho bao đồng nghiệp khác trong đó có cả những người đã dạy các bạn( thường là già và ít biết tin học), và chắc chắn trang web này có nhiều khách viếng thăm hơn và nó ngày một lớn mạnh hơn.
Năm ngoái khi sắp xếp tôi làm thủ công trên máy như một số bạn đã hướng dẫn nhưng cách làm hơi khác, cụ thể như sau
Ở cột A tôi đánh số thứ tự, cột B tôi nhập danh sách giám thị( 100 giám thị), các cột c,d,e,f,g,h,i,j,k,l,m,n tôi chọn lần lượt là tên các môn thi từ buổi 1 đến buổi 6(mỗi buổi 2 cột liên tiếp nhau, 1 cột để ghi GT 1, 1 cột để ghi GT2)
Sau đó tôi lần lượt đánh số vào các cột c,d,e,f,g,h,i,j,k,l,m,n từ 1 đến 40 (có 40 phòng thi ứng với số thứ tự này),các GT3 tôi chỉ ghi là GT3,giám thị hội đồng ghi là GTHĐ.Như vậy trên bảng tổng hợp này có thể biết GT nào coi buổi thi nào ở phòng nào, làm nhiệm vụ trong phòng hay ngoài phòng,( nhưng nhược điểm là khó kiểm tra xem 2 GT bất kì nào đó cùng coi thi trong 1 phòng có quá 1 lần không)
Sau đó tôi cóp pi sang 6 "Set" khác và xóa 5 môn không cần thiết và dùng làm cơ sở để in phân công mỗi buổi thi trên giấy A3. khi giám thị nhìn vào bảng này dễ nhận nhiệm vụ của mình hơn(cách làm này để khắc phục thời gian ghi phân công coi thi trên bảng quá lâu và giám thị cũng không phải mất thời gian tìm trong 40 phòng thi xem mình coi phòng nào- giám thị chỉ cần nhớ trong danh sách giám thị mình ở số thứ tự bao nhiêu để tìm nhiệm vụ của mình)
 
Lần chỉnh sửa cuối:
Yêu cầu của bạn nhìn chung là khá phức tạp, hàm số không thể giải quyết triệt để đâu. Bạn cứ gửi file mẫu lên diễn đàn (nhớ là nén vào) thì mọi người có thể giúp cho. Dễ phải dùng đến anh Visual Basic lắm đấy.
 
Bạn PhanTuHuong ơi, xin bạn thông cảm, tôi chi biết gõ vớ vẩn thôi,chưa gửi file bao giờ cả, tôi cũng muốn gửi lắm nhưng chưa biết làm, tiếng Anh lại không biết chữ nào (tôi cũng đã đọc hướng dẫn nhưng chậm hiểu).Tôi nghĩ đề tài cũng đơn giản mà:Trong excel ta lập một bảng có 102 dòng,15 cột
- Dòng 1 ghi tiêu đề : số thứ tự, tên giám thị, tên các môn thi.
- Dòng 2(cũng là dòng tiêu đề) : dưới tên từng môn thi ta ghi GT1, GT2
- Từ dòng 3 đến dòng 102 : ghi tên 100 giám thị ( ta bịa ra : a,b, c...gì đó)
Trong 15 cột tại dòng 1(tiêu đề):
- Cột A : số thứ tự
- Cột B : Họ tên giám thị
- Cột C : Đơn vị công tác
- Cột D&E: Môn Văn
- Cột F&G: Môn Lý
- Cột H&I: Môn Toán
- Cột J&K: Môn Địa
- Cột L&M: Môn Hóa
- Cột N&O :Môn Tiếng Anh
Trong dòng 2 (tiêu đề)
- Cột A,B,C để trống
- dưới cột từng môn thi ghi GT1, GT2
Tôi ghi vậy hơi dài chắc bạn hiểu, đây là cái tôi đã làm ở bản tổng hợp. Tùy bạn có thể thêm cột giám thị 3 trong từng môn thi và đương nhiên sẽ thêm lên 6 cột nữa, hoặc lập bảng kiểu khác tùy ý bạn.
Nếu phải dùng VBA, tôi xin bạn chi tiết hộ để tôi học mò vậy( theo kiểu: vào đâu->chọn thẻ..->kích chuột vào...-> nhập...vào ô thứ...trong ô...nhập...kích OK..). Xin bạn đừng cười nhé.
 
Bạn coi file kèm, kiểm tra lại phần condition format, thử đáng trùng thì thế nào
Và quan trọng là những cặp giám thị GT1-GT2 có bị 2 lần trong 4950 cặp GT
Còn 1 vài cặp GT bạn hòan thiện nhé!
Chỉ là mò thôi, không có VB gì cả, co bản là kiểm tra GT(x) có bị 2 lần trong 1 hàng ngang (theo Ph) hay cột dọc (Theo môn) và GT(x) và GT(xI) có bị >2 lần.
 
Lần chỉnh sửa cuối:
Cảm phục, cảm phục bạn ThuNghi
Bạn bảo mò mà được như vậy, nhìn lại mình thấy xấu hổ quá, tôi cám ơn bạn.
Khi xem bảng của bạn cho,tôi xin hỏi bạn: tôi hiểu vậy có đúng không nhé?:
- Ta có thể thay số 1,2,3...100 bằng tên các giám thị?
- Không được gõ vào các ô đã có sẵn công thức?
- Ta có thể sử dụng bảng này để xếp cho hội đồng thi có số phòng ít hơn 40 và giám thị ít hơn 100?
Theo các số bạn đã nhập tôi thấy hình như có giám thị có mặt trong phòng thi liên tục 6 buổi ( không khéo bị kỉ luật trước tiêu cực thi hiện nay mất-hì hì), có giám thị làm giám thị 3 dài dài ( sướng quá - chơi dài dài), đương nhiên sẽ khắc phục được khi các số luân phiên nhau trong phòng thi đúng không bạn?
Phương án của bạn đưa ra thật tuyệt vời để hạn chế tuyệt đối tình trạng coi quá 1 lần trong 1 phòng thi, 2 Gt bất kì không cùng nhau coi thi quá 1 lần.
Tuy nhiên phương án này sẽ khó cho giám thị theo dõi nhiệm vụ của mình vì các lí do sau:
- Giám thị chỉ được biết nhiệm vụ của mình ít phút trước khi học sinh vào phòng thi ( bảo mật để hạn chế tiêu cực)
- Với hội đồng thi quá đông không thể dùng phấn viết danh sách GT trên bảng được, lúc đó phải phô tô trên giấy A 3 làm nhiều bản dán lên cho Gt theo dõi, lúc này sẽ rắc rối vì bạn tưởng tượng cả trăm con người phải tìm tên của mình xem ở phòng nào, làm nhiệm vụ gì?(nếu lãnh đạo hội đồng có đọc tên từng giám thị cũng mất thời gian)
- Thời gian thi là bắt buộc thống nhất toàn quốc, không thể thay đổi.
Xuất phát từ khó khăn trên, theo bạn có cách nào dựa vào giám thị để phân công phòng thi không? (cách của bạn là phổ biến hiện nay - dựa vào phòng thi để phân công giám thị - nó thích hợp cho phòng thi nhỏ, thuận lợi cho lãnh đạo H Đ). Nếu được thì thật dễ cho GT vì trong danh sách giám thị là cố định, khi xem phân công người ta đã biết là ở vị trí nào trong danh sách từ đó tìm nhiệm vụ ở cột kế bên dễ hơn.
Bạn đừng chửi mình là " có Voi đòi Tiên" nhé. HÌ HÌ.
 
Lần chỉnh sửa cuối:
Hãy bố trí thêm công việc cho các GT 41->54 trong sh GT, và xem kết quả tại Sh PCGT, tùy bạn muốn thêm ai thì thêm (những gt đánh dấu X)
 
Lần chỉnh sửa cuối:
Không biết nói gì hơn ngoài sự cám ơn chân thành của tôi đến các bạn. Hi vọng các hiệp sĩ tiếp tục giúp tôi và những người như tôi.
 
Trong DS GT, bạn có thể thay đổi thứ tự tên GT, nhưng mã GT (TT GT) không thay đổi, GT NV1 có thể là TT 1 và có thể là TT99...
Và bạn nên mua 1 bộ lô tô để có thể tượng hình hơn.
File tôi gởi bạn OK? có yêu cầu thêm? Thân!
 
Chào Bạn ThuNghi
File lần 2 bạn gửi tôi đã tải về từ chiều qua, đang làm thử nghiệm, có thể nói File thứ 2 đã khắc phục được khó khăn mà tôi nêu ra khi xem File thứ nhất. Tôi thấy như vậy là ổn lắm rồi. Cảm ơn bạn nhiều lắm.
Tuy nhiên đề tài này bạn có thể phát triển hơn (nếu bạn có thời gian), xã hội ngày một văn minh hơn, việc ứng dụng thông tin ngày một nhiều hơn, tôi nghĩ sản phẩm của bạn không chỉ cho tôi mà còn nhiều người khác sử dụng sản phẩm của bạn. Bạn thử nghiên cứu tạo phần mềm này theo hướng giống như kiểu sắp xếp thời khoá biểu xem có được không? ý mình là : chỉ cung cấp danh sách giám thị, số buổi làm GT1, số buổi làm giám thị 2, còn lại là GT3 của từng giám thị, sau đó lệnh cho Chương trình xếp và tạo bản in: phân công giám thị theo phòng thi, phân công giám thị theo danh sách giám thị. Đương nhiên phần mềm này Bạn có thể viết bằng ngôn ngữ khác
Thú thực với Bạn mình nghĩ thế này, để có được sản phẩm ai cũng phải đổ mồ hôi, phải tốn kém thời gian và tiền bạc, vì vậy sản phẩm lao động phải có giá trị của nó, tôi sử dụng sản phẩm của bạn mà tôi áy náy, có thể bạn cho là nhỏ nhưng với người khác thì không nhỏ chút nào, tôi trân trọng sự giúp đỡ vô tư của bạn và các bạn khác trong diễn đàn này. Tôi muốn bạn hoàn thiện sản phẩm của mình và được quyền hưởng thành quả lao động của mình làm ra.
Một lần nữa bạn cho tôi được cảm ơn bạn. Chúc bạn thành công.
 
Cám ơn bạn, chỉ làm cho vui và giúp bạn là tôi đã học thêm 1 chút, còn mà nâng tầm lên thì tôi không đủ sức. Tôi đang học trong phần Chập chửng VBA của GPE, rất hay và bổ ích.
Và bạn hãy tìm và nghiên cứu trong phần giải đáp theo PC world của bạn Skyonline đưa lên có [FONT=&quot]Sub CreateRandom(), nó sẽ đưa 4950 cặp GT1-GT2 ngẫu nhiên vào 6 môn và 40 phòng. Chào!
[/FONT]
 
Gửi Bạn ThuNghi
"Và bạn hãy tìm và nghiên cứu trong phần giải đáp theo PC world của bạn Skyonline đưa lên có [FONT=&quot]Sub CreateRandom(), nó sẽ đưa 4950 cặp GT1-GT2 ngẫu nhiên vào 6 môn và 40 phòng" Bạn cho mình địa chỉ này đi sao tìm không thấy.[/FONT]
[FONT=&quot]Cám ơn bạn.[/FONT]
Đính chính:
[FONT=&quot]Mình đã thấy rồi, mình cứ tưởng là bên PCworld nên mò mãi.|||||

[/FONT]
 
Lần chỉnh sửa cuối:
Rất cám ơn các bác (đặc biệt là anh/ chi ThuNghi), từ những thảo luận trên mà em học được nhiều thứ.
 
BS thêm Sub Create Random

Tôi gởi thêm file đính kèm có BS thêm Sub Create Random và kiểm tra cặp GT1-GT2 đã trùng nhau >1 lần, trong phần đếm
Và xin ghi nhớ rằng, "ngẫu nhiên" là ngẫu nhiên, có thể 1,2...100, hay là 2,4,6...100 hay là 1,3,5,7...99, hay là 100,96,92...4 đầu là ngẫu nhiên cả. Vậy không nhất thiết phải cần Macro. Có Macro cho "ngẫu nhiên" hơn thôi, nhiều lúc ngẫu của ngẫu là cố đó. Chúc bạn thành công, vì tương lai con em mai sau!
 
Bổ sung

Do file trước thiếu phần kiểm tra 2 GT có gặp >2 lần nay BS
 
Lần chỉnh sửa cuối:
Gửi Bạn ThuNghi.
Tôi đã tải chuong trình của bạn về, theo hướng dẫn của bạn là " bôi đen từ dòng...đến dòng..sau đó chạy Ran.." tôi không hiểu (vì dốt quá), xin bạn chỉ từng bước 1 được không? ví dụ: bôi đen từ ô..đến ô..sau đó kic vào..chọn...xuất hiện bảng...chọn..và OK"
Một điều nữa bạn cho tôi hỏi nhũng con số 001,002..100 điền trong bảng(bạn hướng dẫn bôi đen)là ngẫu nhiên sau khi sắp xếp hay mình tự nhập từng số 001,001...100 sau đó cho chương trình sắp xếp nó ra như vậy?
Chương trình lần 2 bạn cho lần trước, tôi tự thêm 6 "sét" nữa mỗi "sét" 1 môn và tạo "đường dẫn" từ "GT" qua 6 "sét" từ đây sẽ chỉnh sửa lại và làm cơ sở in cho từng buổi thi.
Xin bạn có ý kiến giúp mình.
Thân ái.
 
Lần chỉnh sửa cuối:
Bạn nên dùng file tôi up ngày 31/10/06, tôi đã BS thêm kiểm tra, bạn test lại nhé.
Còn chọn ngẫu nhiên thì thôi, bạn cứ nhập theo ý bạn từ 1-100, sao cũng được, nghỉ thêm cho mệt.
Còn tạo ra 6 sh (6 môn) thì bạn cứ thế mà link sang, cố gắng đừng thay đổi các sh có sẵn.
Do những hàm dùng trong đó không giống ai nên phải kiểm tra thêm nhé. Copy thêm vài file và thay đổi thử thế nào, và test chọn mẫu coi có phù hợp?
Chúc bạn thành công! Hình như con lâu mới tổ chức thi mà, dư "petrol"!
 
Hì hì. Cám ơn bạn.
Mình không dám đụng đến chỗ có công thức đâu, sợ lắm.
Cón lâu mới thi nhưng mình lo xa vậy mà, vả lại mình thuộc loại" nhàn cư vi có thiện"
Chúc bạn mãi là người của công chúng.
 
Bạn ThuNghi ơi, tôi chạy Macro kiểm tra không được.
Trình tự tôi làm như sau: bôi đen hàng bạn hướng dẫn sau đó vào Tools/Macro/macros../Run. Sau đó con trỏ chuột biến thành hình chiếc đồng hồ cát, ô có chữ OK màu đỏ thông báo có 2 cặp Gt coi trùng nhau nhưng chờ mãi chỏ chuột vẫn là chiếc đồng hồ cát(10 phút).Tôi phải khởi động lại và làm nhiều lần vẫn vậy.
Máy của tôi sử dụng "xê ron 1,7Ghi-Ram 512-Ổ cứng 40G- WinXP-Offis 2003"( Bạn thông cảm tôi không biết tiếng Anh)
 
- Cột B : Họ tên giám thị

- Cột D&E: Môn Văn ; - Cột F&G: Môn Lý
- Cột H&I: Môn Toán; - Cột J&K: Môn Địa
- Cột L&M: Môn Hóa; - Cột N&O :Môn Tiếng Anh
Cột A STT của giám thị
D2:D42: 1-> 40 ; E2:E42: 41->80;
F2: F42: 81-100-1-20; G2:G42: 21->60;
H2:H42: 61->100; I2:I42: 11->50
J2:J42: 51-> 90; K2:K42: 91-100-11->30;
L2:L42: 31->70; M2:M42: 71->100-1->10
Như vậy trong mười cột được bắt đầu từ các chục [0], [40], [80], [20], [60], [10], [50], [90], [30] & [70]
Còn một môn nữa bạn có cách mà?
Và việc xếp theo qui luật này ta khõi kiểm tra sự trùng lặp hay không!
 
Thực tình các bạn nói tôi không hiểu gì cả, giống như đưa cuốn sách tiếng Anh cho tôi đọc vậy.May mắn làm sao, tôi làm liều lại được thì phải.(Vì lỡ hỏng thì bản gốc còn trên mạng mà). Cảm tạ các Bạn.
 
Dear,
Bạn SA_DQ chỉ bạn như vậy là OK rồi, nếu bạn muốn thay đổi môn thì bạn xáo trộn.
Cột A STT của giám thị
D2:D42: 1-> 40 ; E2:E42: 41->80;
F2: F42: 81-100-1-20; G2:G42: 21->60;
H2:H42: 61->100; I2:I42: 11->50
J2:J42: 51-> 90; K2:K42: 91-100-11->30;
L2:L42: 31->70; M2:M42: 71->100-1->10
Như vậy trong mười cột được bắt đầu từ các chục [0], [40], [80], [20], [60], [10], [50], [90], [30] & [70]
Còn một môn nữa bạn có cách mà?
Còn sub ngaunhien chẳng qua là chọn ra 100GT sẽ xếp vào 40 phòng thi. ie bãn phải chọn 40 phòng từ D5:D44 và chạy macro. Khuyến cáo không nên dùng, vì không cần thiết lắm. Bạn cứ theo bạn SA_DQ là OK.
Còn phần báo trùng thì sẽ tô màu: xanh, đỏ, vàng
Vấn đề cốt lõi của bài tòan này là xếp 100 GT vào 40 Phòng (2GT) và 6 môn có thể hiểu:
Các GT sẽ không lặp lại trong một dòng 12 cột
Các GT sẽ không lặp lại trong một Cột 40 dòng
Các GT sẽ không gặp nhau lần thứ hai (trong phần kiểm tra cặp GT) nó phải là cặp GT1-GT2 (GT2-GT1) duy nhất trong 4950 cặp GT
Trước mắt làm vậy tốt rồi, có cách khác là dùng VBA, nhưng nó sẽ o chạy nỗi, gán vào 1 ô với gt 1-100 và kiểm tra 3 chiều, nếu OK thì tiếp (khó lắm) không bằng cách tự gán
Chúc bạn thành công
 
Đúng rồi đấy, tôi làm theo kiểu của bạn( phiên bản cũ cũng vậy).Tôi chỉ làm khác bạn ở chỗ tôi gán giám thị 001 đến 100(nối đuôi nhau) theo hình chữ chi từ trên xuống bắt đầu từ ô D2, sang ô E2 bắt đầu từ dưới lên,sang ô F2 lại từ trên xuống....cứ như vậy đến cột thứ 10, cột thứ 11 không bắt đầu bằng 001 được (vì bị trùng với cột thứ nhất), tôi bắt đầu bằng số 005. kết quả OK luôn. Tôi đang định làm thử trong tình huống số giám thị ít hơn và số phong ít hơn xem thế nào, có lẽ cung được.
Xin cám ơn sự tận tâm của các bạn.
 
Bạn đã viết :
nmhungcncm đã viết:
Lần đầu tiên tôi vào diễn đàn, tôi không biết bắt đầu từ đâu.Gửi thế nào cho đúng địa chỉ, nếu bài viết này sai địa chỉ, tôi nhờ các admin chuyển hộ.
Hôm nay tôi nhờ các anh chị trong diễn đàn giúp đỡ dùm việc viết hàm phân công coi thi trong excel, cụ thể như sau. Khi coi thi, kiểm tra yêu cầu :
- giám thị không coi thi quá 1 lần tại 1 phòng thi bất kì.(buổi này coi phòng này thì buổi sau phải coi phòng khác)
- giám thị không được phép cùng nhau coi thi quá 1 lần tại 1 phòng thi bất kì.(2 giám thi đã cùng nhau coi phòng này thì sẽ không cùng nhau coi phòng khác)
- trong mỗi phòng thi có 2 cán bộ coi thi GT1 và GT2.
- mỗi cán bộ coi thi làm giám thị hành lang(GT3) ít nhất 1 lần- số lượng giám thị 3 có thể ít hơn số phòng thi.
VÍ DỤ: lập phương án coi thi cho hội đồng thi có 40 phòng thi, số giám thị tham gia là 100 người
Cám ơn các Anh Chị.
Tôi xin bổ sung thêm một điều kiện nữa : ( chắc bạn quên )
- 2 GT trong một phòng thi phải không cùng công tác trong một trường ( số trường bao giờ cũng nhỏ hơn số GT )
 
anhtucd đã viết:
Bạn đã viết :

Tôi xin bổ sung thêm một điều kiện nữa : ( chắc bạn quên )
- 2 GT trong một phòng thi phải không cùng công tác trong một trường ( số trường bao giờ cũng nhỏ hơn số GT )

Cám ơn bạn ThuNghi đã giải bài toán trên. Nếu có thể, bạn giải nốt cho hoàn thiện.
 
Nguyên văn bởi anhtucd
Tôi xin bổ sung thêm một điều kiện nữa : ( chắc bạn quên )
- 2 GT trong một phòng thi phải không cùng công tác trong một trường ( số trường bao giờ cũng nhỏ hơn số GT )

- số trường < số GT, nếu số trường = số GT thì OK
Trong 100 GT nếu cùng 1 trường ta có 4950 cặp GT
Vậy nếu 2 trường thì ta sẽ có từ 4950 cặp trên và lọai bỏ những cặp chung trường, từ 1-50: tr 1, 51-100:tr2, trong bài tóan trên ta xd lại số cặp GT theo yêu cầu phân trường.
Cụ thể sẽ tính sau
 
ThuNghi đã viết:
Nguyên văn bởi anhtucd
Tôi xin bổ sung thêm một điều kiện nữa : ( chắc bạn quên )
- 2 GT trong một phòng thi phải không cùng công tác trong một trường ( số trường bao giờ cũng nhỏ hơn số GT )

- số trường < số GT, nếu số trường = số GT thì OK
Trong 100 GT nếu cùng 1 trường ta có 4950 cặp GT
Vậy nếu 2 trường thì ta sẽ có từ 4950 cặp trên và lọai bỏ những cặp chung trường, từ 1-50: tr 1, 51-100:tr2, trong bài tóan trên ta xd lại số cặp GT theo yêu cầu phân trường.
Cụ thể sẽ tính sau
Đúng rồi, phải có điều kiện đó nữa, mình tệ nhỉ.+-+-+-+
Tỉnh tôi GV của 8 đơn vị trường cùng coi trong 1 HĐ thi đó bạn ThuNghi ạ.
"Một cây làm chẳng nên non..có bạn ThuNghi chụm lại..."//**/
 
Theo tôi nghỉ, vấn đề là tìm những cặp GT không phù hợp (chung trường) và so sánh với 4950 cặp GT và trừ ra
VD trường 1 số GT từ 20 - 28 tức là ta sẽ lọai trừ những cặp GT 20-21, 20-22,...20-28 trong 4950 cặp GT
Khi phân công GT thì ta nên phân công theo từng môn và theo từng trường làm sao thỏa DK thuộc về cặp GT đã lọai trùng.
Tôi gởi file loaitrucapGT bạn nghiên cứu. Chưa test lại, bạn test đi.

Theo tôi nghỉ, vấn đề là tìm những cặp GT không phù hợp (chung trường) và so sánh với 4950 cặp GTKhi phân công GT thì ta nên phân công theo từng môn và theo từng trường làm sao thỏa DK thuộc về cặp GT đã lọai trùng.Tôi gởi BS file bạn nghiên cứu. Chưa test lại, bạn test đi.Trong Sh CapGT tôi đã tạo thử 100 GT chia 8 tr ngẫu nhiên, tr nhiều, trường ít,nếu cùng trường thì không lấy, và có dùng VBA, bạn nhấn Alt F8 để chạy nhé, sau đó copy Cặp GT và Sh GT, nếu ta có xếp GT cùng trường thì sẽ có thông báo
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Bạn TN ơi kiểm tra lại hộ trong Sh: PCGT hình như không đúng, tôi kiểm tra thủ công thì thấy trong buổi thi môn 1 chỉ có 62 GT trong phòng thi thôi( GT1 và GT2).Đúng ra thì phải có 80 giám thị mới phải chứ!
Đường line để tải chương trình phân công GT ở đâu rồi bạn TN?
 
Lần chỉnh sửa cuối:
Sắp phải làm thi rồi, các bạn gửi file mẫu lên đi để mọi người tham khảo.
 
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!!$@!!
 
Lần chỉnh sửa cuối:
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.
 
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
 
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 đỡ.
 
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

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

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
 
Chào các Anh/Chị
Các Anh Chị hướng dẫn mình tính hàm if với, file mình làm không biết lỗi gì mà làm hoài không được, nhờ các Anh /Chị hướng dẫn ạ.
Cám ơn các Anh/Chị.
 

File đính kèm

Chào các Anh/Chị
Các Anh Chị hướng dẫn mình tính hàm if với, file mình làm không biết lỗi gì mà làm hoài không được, nhờ các Anh /Chị hướng dẫn ạ.
Cám ơn các Anh/Chị.
Bạn phải lập một chủ đề khác sau đó nêu vấn đề mình cần sẽ được giúp đỡ.
 
Chào Bạn ThuNghi
File lần 2 bạn gửi tôi đã tải về từ chiều qua, đang làm thử nghiệm, có thể nói File thứ 2 đã khắc phục được khó khăn mà tôi nêu ra khi xem File thứ nhất. Tôi thấy như vậy là ổn lắm rồi. Cảm ơn bạn nhiều lắm.
Tuy nhiên đề tài này bạn có thể phát triển hơn (nếu bạn có thời gian), xã hội ngày một văn minh hơn, việc ứng dụng thông tin ngày một nhiều hơn, tôi nghĩ sản phẩm của bạn không chỉ cho tôi mà còn nhiều người khác sử dụng sản phẩm của bạn. Bạn thử nghiên cứu tạo phần mềm này theo hướng giống như kiểu sắp xếp thời khoá biểu xem có được không? ý mình là : chỉ cung cấp danh sách giám thị, số buổi làm GT1, số buổi làm giám thị 2, còn lại là GT3 của từng giám thị, sau đó lệnh cho Chương trình xếp và tạo bản in: phân công giám thị theo phòng thi, phân công giám thị theo danh sách giám thị. Đương nhiên phần mềm này Bạn có thể viết bằng ngôn ngữ khác
Thú thực với Bạn mình nghĩ thế này, để có được sản phẩm ai cũng phải đổ mồ hôi, phải tốn kém thời gian và tiền bạc, vì vậy sản phẩm lao động phải có giá trị của nó, tôi sử dụng sản phẩm của bạn mà tôi áy náy, có thể bạn cho là nhỏ nhưng với người khác thì không nhỏ chút nào, tôi trân trọng sự giúp đỡ vô tư của bạn và các bạn khác trong diễn đàn này. Tôi muốn bạn hoàn thiện sản phẩm của mình và được quyền hưởng thành quả lao động của mình làm ra.
Một lần nữa bạn cho tôi được cảm ơn bạn. Chúc bạn thành công.
Chào bạn, mình cũng đang rất quan tâm về công việc sắp xếp lịch coi thi, kiểm tra. Bạn có thể cho mình xin FILE xếp lịch coi thi để sử dụng được không
Chào bạn, mình cũng đang rất quan tâm về công việc sắp xếp lịch coi thi, kiểm tra. Bạn có thể cho mình xin FILE xếp lịch coi thi để sử dụng được không
Bài đã được tự động gộp:

Chào bạn, mình cũng đang rất quan tâm về công việc sắp xếp lịch coi thi, kiểm tra. Bạn có thể cho mình xin FILE xếp lịch coi thi để sử dụng được không
gmail của mình sigmaandxi@gmail.com
 

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

Back
Top Bottom