亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        EXCEL VBA在考場編排中的設(shè)計(jì)與實(shí)現(xiàn)

        2014-09-25 09:53:28錢建明

        錢建明

        摘 要:為保證考試的公平、公正及其嚴(yán)肅性,科學(xué)的考場座位編排是一個(gè)重要手段。文章介紹的是利用EXCEL VBA編寫考場編排軟件的設(shè)計(jì)和實(shí)現(xiàn),利用此軟件,可輕松實(shí)現(xiàn)學(xué)??荚囍蟹爆嵉目紙鼍幣?、座位表、桌貼、班級考生分布等的一次性生成及打印。經(jīng)實(shí)際應(yīng)用,操作簡單,方便實(shí)用。

        關(guān)鍵詞:隨機(jī);試場編排;座位表;桌貼

        中圖分類號:TP393 文獻(xiàn)標(biāo)志碼:B 文章編號:1673-8454(2014)14-0065-05

        現(xiàn)今中學(xué)階段的學(xué)校教務(wù)工作中,考務(wù)工作占了很大的比重,而考場座位編排是考務(wù)信息化管理中一項(xiàng)十分重要的工作??紕?wù)工作主要分為考前的考場編排和考后的成績統(tǒng)計(jì)與分析,這里專門就考前的考場編排展開分析和討論。隨著學(xué)校辦學(xué)規(guī)模逐漸擴(kuò)大和學(xué)生人數(shù)的增加,考場安排的工作量不斷加大。因此,筆者決定編寫基于 Excel VBA的考場編排系統(tǒng),希望通過本系統(tǒng)能實(shí)現(xiàn)對考場教室進(jìn)行合理有效的管理。

        我們采用Excel作為系統(tǒng)編寫工具。Excel不僅具有強(qiáng)大的制表功能,同時(shí)還內(nèi)置了系統(tǒng)開發(fā)工具VBA。VBA是指Visual Basic for Application,它是在Office中廣泛應(yīng)用的宏語言,可以直接對Excel對象進(jìn)行編程,從而提高Excel的利用效率。使用它可以增強(qiáng)Excel的自動(dòng)化能力,使用戶更高效地完成特定任務(wù)。

        軟件分為試場編排、座位表生成、桌貼的制作三大模塊。設(shè)計(jì)完成后,工作人員將基本數(shù)據(jù),如考生名冊(含班級)、考場基本信息(考場名稱、每考場人數(shù)等)錄入到軟件中,軟件自動(dòng)對考生進(jìn)行考場隨機(jī)編排,編排完成后,要使學(xué)生能基本均勻地分布在各考場,同時(shí),實(shí)現(xiàn)同考場中前后座位不同班,各考場人數(shù)可以不同,每列人數(shù)可以不同。另外,根據(jù)實(shí)際生成座位表、各班考生座位分布表、考生桌貼等。

        一、考場編排

        在中考或高考中,考場人數(shù)一般是30人,但基于學(xué)校實(shí)際在實(shí)際操作中很難做到,一般會(huì)出現(xiàn)各考場人數(shù)各異。有鑒于此,考場編排系統(tǒng)需具備很大的靈活性,因此軟件必須取得以下信息:學(xué)生名冊,考場名稱,各考場人數(shù),各考場每列人數(shù)。

        在編排試場時(shí),要盡量保證學(xué)生座位的隨機(jī)性。對此每個(gè)學(xué)校都有自己的做法,有的按前一次考試成績進(jìn)行排座位,有的按姓氏筆畫排座位,有的采用Excel隨機(jī)函數(shù)來排座位。對于這些排座位的方式,雖在一定程度上實(shí)現(xiàn)了隨機(jī)性,但都存在前后同班情況的出現(xiàn)。網(wǎng)上也有采用VBA編寫的考場編排軟件,但班級分布上還是存在多種問題,如5班考生大量出現(xiàn)在某個(gè)考場,但隔壁考場卻沒有一個(gè)5班考生,另外也出現(xiàn)了類似班級分布是固定的,如座位上考生班級按1班、2班、3班……順序排列,表面上實(shí)現(xiàn)了前后無同班,但容易被閱卷老師發(fā)現(xiàn)規(guī)律而引起其他的不公。在這種情況下,如果采用簡單的方式編排座位,勢必造成大量的前述問題。

        為保證考生既要隨機(jī)分布,又要均勻分布,因此,在設(shè)計(jì)上,要多次用到隨機(jī)編排。首先是班級內(nèi)部考生的隨機(jī)編排,由于得到的原始數(shù)據(jù)并非按班排列,所以軟件首先對全年級數(shù)據(jù)進(jìn)行一次按班排序,然后在第五列對學(xué)生生成一次隨機(jī)數(shù),再以班為單位將這些隨機(jī)數(shù)進(jìn)行排序,這樣進(jìn)行了考生第一次隨機(jī),實(shí)現(xiàn)班級內(nèi)學(xué)生順序的隨機(jī)性。(注:在最終座位表排定前,考號列(D列)、考場列(E列)均作為輔助列,考場號首先都是用數(shù)字編號標(biāo)示。)

        ……

        banji = Cells(30, 22) //班級數(shù)

        Cells(i + 1, 5) = Rnd

        For i = 1 To banji

        Range("A" & renshu1 & ":e" & renshu2).Sort Key1:=Range("e" & renshu1), Order1:=xlAscending

        Next

        ……

        注:由于Value屬性是Cells集合的默認(rèn)屬性,所以省略不寫,下同。

        系統(tǒng)自動(dòng)獲取班級數(shù)及考場數(shù)后,計(jì)算各班在各考場可以設(shè)置的最多人數(shù),如14個(gè)班,某考場人數(shù)是34人,則每班提供給該考場的人數(shù)應(yīng)該是int(34/14),但這樣會(huì)出現(xiàn)有的班人數(shù)還不足以按要求分布到各考場,為解決這個(gè)問題,程序會(huì)對各考場對要求每班提供的人數(shù)進(jìn)行累加,并與班級人數(shù)進(jìn)行比對,當(dāng)班級人數(shù)不足以滿足要求時(shí),則順減1人,直至滿足提供給各試場人數(shù)之和小于等于實(shí)際人數(shù)為止,比如某班人數(shù)27,按前面試場要求,應(yīng)分配給各試場2人,總計(jì)28人,但該班不足以提供這么多考生,則分配到各試場的人數(shù)都減1人,余下考生作二次分配。

        ……

        For j = 1 To Cells(30, 7) //試場數(shù)

        For i = 1 To Cells(30, 22) //班級數(shù)

        fenpei = Int(Cells(j + 1, 8) / Cells(30, 22))

        If fenpei = 0 Then

        arr(j, i) = 0

        Else

        If Cells(i + 1, 23) / fenpei >= Cells(30, 7) Then

        arr(j, i) = fenpei

        Else

        Do While Cells(i + 1, 23) / fenpei < Cells(30, 7)

        fenpei = fenpei - 1

        arr(j, i) = fenpei

        If fenpei = 0 Then

        arr(j, i) = 0

        Exit Do

        End If

        Loop

        End If

        End If

        Next

        Next

        ……

        獲得各班在各試場的人數(shù)后,對各班每考生進(jìn)行編號,即考場號(數(shù)字表示)。如按考場人數(shù)34計(jì),int(34/14)=2,即則從上往下對學(xué)生編號,多余的都編上100,運(yùn)行結(jié)果如圖1。

        接下來按初排的考場進(jìn)行排序,這樣每班余下人數(shù)都匯集到一起,初排完成。程序接著對剩余部分考生進(jìn)行考場分配,采用循環(huán)語句,分配到每考場,如果該考場人數(shù)已滿,則分給下一考場。這樣使得剩余考生還是能盡可能的均勻分布到各考場。

        ……

        k = Application.WorksheetFunction.CountIf(Columns(5), 100)

        k = Cells(30, 23) + 2 - k

        Do While l = last

        If j Mod m <> 0 Then

        j = j Mod m

        Else

        j = m

        End If

        tongji = Application.WorksheetFunction.CountIf(Columns(5), j)

        If tongji < Cells(1 + j, 8) Then

        Cells(k + i, 5) = j

        i = i + 1

        j = j + 1

        l = Cells(n, 5)

        Else

        j = j + 1

        l = Cells(n, 5)

        End If

        Loop

        ……

        運(yùn)行結(jié)果如圖2。

        完成后,各班考生基本均勻分布在各考場,下面要對各考場的考生進(jìn)行既隨機(jī)又均勻的分配。首先按考場和班級進(jìn)行多條件排序,完成后,每考場內(nèi)考生按班級順序排列,接下來分別對同班每生編上有序號碼。

        ……

        Do While j <= p

        For i = 1 To n

        ar(i) = Application.WorksheetFunction.CountIf(Range("d" & 2 + renshu1 & ":d" & 1 + renshu2 & ""), i)

        For m = 1 To ar(i)

        Cells(1 + renshu1 + m + k, 6) = m

        Next

        k = k + ar(i)

        Next

        k = 0

        renshu1 = renshu1 + Cells(j + 1, 8)

        renshu2 = renshu1 + Cells(j + 2, 8)

        j = j + 1

        Loop

        ……

        運(yùn)行結(jié)果如圖3。

        在第六列,每個(gè)考生對應(yīng)產(chǎn)生一個(gè)隨機(jī)數(shù),與前面第五列的數(shù)求和,并按考場號及所求和進(jìn)行多條件排序,如1、2、3班在某試場均有3名考生,則與隨機(jī)數(shù)字相加后,各班考生對應(yīng)的和數(shù)都是1.xxx,2.xxx,3.xxx樣式,對數(shù)據(jù)按考場及所求和進(jìn)行多條件排序后,初步實(shí)現(xiàn)前后無同班。但問題也隨之而來,假設(shè)14個(gè)班,同考場每14個(gè)考生前后無同班,但第14和15考生可能會(huì)出現(xiàn)同班。于是再加一段代碼,防止同考場前后同班,方法是采用Do語句,如果遇到前后同班同考場,前一個(gè)考生往前挪2~12位,2~12隨機(jī)產(chǎn)生,這樣就有效地避免了前后同考場,也防止把該考生往前移動(dòng)后,與前一組最后考生同考場同班的情況,完成后,程序再從第一個(gè)考生開始檢查。

        ……

        i = 1 //前后同班處理

        Do While Not IsEmpty(Cells(i, 1))

        If Cells(i, 1) = Cells(i + 1, 1) And Cells(i, 5) = Cells(i + 1, 5) Then

        temp = Int(Rnd() * (p - 2) + 2)

        Range("A" & i & ":c" & i & "").Cut

        Range("A" & i - temp).Insert Shift:=xlDown

        i = 0

        End If

        i = i + 1

        Loop

        ……

        對于一些相對重大的考試,一般均采用S型排列(也稱蛇形排列),對于這個(gè)要求,系統(tǒng)可以按要求完成排列,代碼如下(a,,b,c,d,e為設(shè)置的每列人數(shù)):

        ……

        m = 0

        For i = 1 To IIf(k - m > a, a, k - m)

        Cells(m + i + 1, 6) = Cells(m + i + 1, 4)

        Next

        m = m + a

        n = IIf(k - m > b, b, k - m)

        For i = 1 To n

        Cells(m + i + 1, 6) = Cells(m + n + 2 - i, 4)

        Next

        m = m + b

        ……

        If e <> 0 Then

        For i = 1 To IIf(k - m > e, e, k - m)

        Cells(m + i + 1, 6) = Cells(m + i + 1, 4)

        Next

        m = m + e

        End If

        ……

        End If

        Next

        ……

        最后對所有考生編上考場名稱,考生試場編排完成。對于編排的容錯(cuò)處理,這里不再累述。

        二、座位表的生成

        學(xué)生考場編排完成后,接著就是座位表的制作??忌槐硪话銖堎N于考場門口,需要直觀地反應(yīng)考場布置情況。座位表制作總體上講是個(gè)對單元格的填充過程,因此代碼比較簡單。但由于存在各考場人數(shù)不同,列數(shù)不同,以及同考場不同列人數(shù)不同的情況,因此在算法上,利用考場人數(shù)及列數(shù),采用for語句進(jìn)行填充。每考場按4~6列設(shè)置,預(yù)先制作好模板,再將數(shù)據(jù)填入模板即可。

        模板的選擇:

        ……

        Select Case n

        Case Is = 4

        Sheets("四列").Copy Before:=Sheets(Sheets.Count)

        Sheets("四列 (2)").Name = Sheets("試場編排").Cells(j + 1, 7)

        ……

        End Select

        試場座位的填充:

        Cells(1, 1) = Sheets("試場編排").Cells(j + 1, 7) & " 試場座位示意圖"

        For i = 1 To a

        Cells(2 * i + 5, 1) = "考號"

        Cells(2 * i + 5, 2) = Sheets("試場編排").Cells(m + i + 1, 4)

        Cells(2 * i + 6, 1) = Sheets("試場編排").Cells(m + i + 1, 2)

        Next

        m = m + a

        ……

        桌位表生成完畢后,由于是每個(gè)考場一張表,需要將這些表作為一個(gè)組才能一次性打印,否則操作比較麻煩,有違簡潔高效的目的,因此,在座位表的打印和預(yù)覽上,對這些表利用數(shù)組進(jìn)行一次性選擇。

        ……

        temp = Cells(30, 22)

        For i = 1 To temp

        ReDim Preserve ar(1 To i)

        ar(i) = Cells(i + 1, 7) //座位表名稱賦值到數(shù)組

        Next

        Sheets(ar).PrintOut

        ……

        三、桌貼的制作

        桌貼制作與座位表類似,首先制作一張桌貼的空白模板,再將數(shù)據(jù)填充上去即可。桌貼是按考場分發(fā),不能將所有考生以連續(xù)分布的方式打印在紙上,因此這里采用for語句,將循環(huán)次數(shù)定義為試場數(shù),每一試場考生都打印在一張A4紙上(40人以內(nèi))。另外考慮到有的試場名稱較長,系統(tǒng)對此作出判斷,如果試場名稱長度數(shù)字超過9位,漢字超過6個(gè),將縮小字體,以使得在桌貼上放下試場名稱:

        ……

        Sheets("桌貼").Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n). = Sheets("考生名冊").Cells(m + 1, 5)

        If Application.WorksheetFunction.IsNumber(Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n).) And Len(Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n).) > 11 Then

        Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n).Font.Size = 9

        ElseIf Not Application.WorksheetFunction.IsNumber

        (Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n).) And Len

        (Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n). > 6) Then

        Cells(1 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n).Font.Size = 9

        End If

        Sheets("桌貼").Cells(2 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n). = Sheets("考生名冊").Cells(m + 1, 6).

        Sheets("桌貼").Cells(3 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n). = Sheets("考生名冊").Cells(m + 1, 4).

        Sheets("桌貼").Cells(4 + 5 * (j - 1) + 50 * (i - 1), 2 + 3 * n). = Sheets("考生名冊").Cells(m + 1, 3).

        ……

        對于人數(shù)超過40的試場,在右側(cè)增加一頁:

        ……

        If k > 40 Then

        If Sheets("桌貼").Range("l" & 1 + 50 * (i - 1)) = "" Then

        Sheets("桌標(biāo)").Range("A1:k50").Copy Sheets("桌貼").Range("l" & 1 + 50 * (i - 1))

        End If

        ……

        由于剛才右側(cè)增加一頁,會(huì)導(dǎo)致桌貼在打印時(shí)產(chǎn)生大量的空白頁,為解決此問題,采用打印設(shè)置,使得只打印有數(shù)據(jù)的頁面,有數(shù)據(jù)的頁面的判斷:

        ……

        For i = 1 To j Step 50

        If Sheets("桌貼").Range("l" & i).Value <> "" Then

        k = k & "l" & i & ":v" & i + 49 & ","

        End If

        Next

        ……

        四、各班座位表的生成

        各班座位表是考前下發(fā)給班主任,由班主任告知考生被安排在哪個(gè)試場。各班座位表的生成按每張A4紙49人設(shè)置(默認(rèn)班級人數(shù)不超過49,如果超過,可以和桌貼超40人方法一致)。接下來只需將各班學(xué)生填充即可,數(shù)據(jù)的填充,首先是對班級的識別,先從考生名冊表(考生名冊表在生成考場座位表后自動(dòng)生成,因?yàn)樵O(shè)計(jì)和算法都比較簡單,不再累述)提取班級:

        ……

        Do While Not IsEmpty(Sheets("考生名冊").Cells(i, 1))

        Sheets("考生名冊").Cells(i, 7) = Right(Sheets("考生名冊").Cells(i, 1), 2)

        i = i + 1

        Loop

        ……

        再按49循環(huán),對單元格進(jìn)行填充,得到各班考生座位分布表:

        ……

        Do While Not IsEmpty(Sheets("考生名冊").Cells(j, 1))

        If Sheets("考生名冊").Cells(j, 7) = k Then

        Sheets("各班座位表").Cells(i + 1 + 49 * (k - 1), 1) = Sheets("考生名冊").Cells(j, 1)

        Sheets("各班座位表").Cells(i + 1 + 49 * (k - 1), 2) = Sheets("考生名冊").Cells(j, 3)

        Sheets("各班座位表").Cells(i + 1 + 49 * (k - 1), 3) = Sheets("考生名冊").Cells(j, 4)

        Sheets("各班座位表").Cells(i + 1 + 49 * (k - 1), 4) = Sheets("考生名冊").Cells(j, 5)

        Sheets("各班座位表").Cells(i + 1 + 49 * (k - 1), 5) = Sheets("考生名冊").Cells(j, 6)

        i = i + 1

        End If

        j = j + 1

        Loop

        ……

        至此,VBA編寫的考場編排系統(tǒng)初步完成,加上稍許美化和容錯(cuò)處理,一個(gè)高效簡潔的考場編排系統(tǒng)就完成了。

        此軟件是在Excel 2003上開發(fā)的,結(jié)合VBA所編寫的程序,使用門檻低,操作方便,極大地減輕了考務(wù)工作者的負(fù)擔(dān),提高了工作效率,取得了預(yù)期效果。

        參考文獻(xiàn):

        [1]王曉東.計(jì)算機(jī)算法設(shè)計(jì)與分析(第3版)[M].北京:電子工業(yè)出版社,2007.

        [2]楊章偉,張婉婉.Excel VBA語法辭典[M].北京:機(jī)械工業(yè)出版社,2010.(編輯:魯利瑞)

        gg55gg国产成人影院| 国产又黄又爽又无遮挡的视频| 日韩肥熟妇无码一区二区三区| 久久久国产熟女综合一区二区三区| 亚洲成a∨人片在线观看无码| 国产亚洲午夜高清国产拍精品 | 麻豆国产成人AV网| 日韩精品国产精品亚洲毛片| 少妇高潮av久久久久久| 三年片免费观看大全国语| 综合色天天久久| 亚洲国产精品成人一区二区三区| 成人影片麻豆国产影片免费观看| 亚洲第一无码xxxxxx| a级福利毛片| 一区二区在线观看日本免费 | 日本xxxx色视频在线观看| 久久丫精品国产亚洲av不卡| 免费无码又爽又刺激高潮的视频网站| 一区二区三区国产大片| 色欲一区二区三区精品a片| 国产天美传媒性色av| 亚洲αⅴ无码乱码在线观看性色| 国产91大片在线观看| 大地资源网在线观看免费官网| 国产熟人av一二三区| 五月婷婷影视| 久久久黄色大片免费看| 亚洲精品久久久久久久蜜桃| √天堂中文官网8在线| 国产盗摄XXXX视频XXXX| 手机在线观看av资源| 狠狠色综合7777久夜色撩人ⅰ| 欧美日韩中文制服有码| 久久久国产精品五月天伊人| 美女露出自己的性感大胸一尤内衣| 久久不见久久见免费影院www| 精品九九视频| 国产成人精品久久二区二区91| 色费女人18毛片a级毛片视频| 国产av日韩a∨亚洲av电影|