2012年5月4日 星期五

【VBA】Excel隨機分配名單

主要是因為當TA的關係,
期中考的時候總是要將修課學生亂數名單分配,
還要分配座位表,實在很麻煩,
所以就想寫個小程式讓Excel自動化完成名單分配還有分配座位表。
但因為目前實際上修課126人,所以只要使用兩間教室就夠用。
因此設計的程式也是以兩間教室為準。

Excel工作表介紹
Sheets(1):一開始的修課名單,第一欄是學號,第二欄是姓名
Sheets(2):第一間教室名單 ←VBA程式自動產生
Sheets(3):第二間教室名單 ←VBA程式自動產生
Sheets(4):根據第一個工作表亂數產生的名單,接下來也用來分配座位表。

Private Sub CommandButton1_Click()
    ClassRoomOne = TextBox1.Text //第一間教室名稱
    ClassRoomTwo = TextBox2.Text //第二間教室名稱
    RoomOnePeople = TextBox3.Text //第一間教室人數
    CountPeople = TextBox4.Text //修課人數
 
    Module1.初始化巨集
    Module1.亂數工作表 //把名單先複製到新的工作表,然後亂數排序新工作表的名單
 
    //把亂數過後的名單依據第一間教室人數複製到該教室名單的工作表
    For i = 2 To RoomOnePeople + 1
    Sheets(2).Cells(i, 1) = Sheets(4).Cells(i, 1)
    Sheets(2).Cells(i, 2) = Sheets(4).Cells(i, 2)
    Next
    //把亂數的名單按照學號由小到大重新排列,若要由大至小排列則把最後的1改成2即可
    Sheets(2).Range("A2", "B" & RoomOnePeople + 1).Sort Sheets(2).Range("A1"), 1
    Sheets(2).Range("A1", "B" & RoomOnePeople + 1).Borders.LineStyle = 1 //畫上框線
 
    //把剩餘的名單複製到第二間教室名單的工作表
    For i = RoomOnePeople + 2 To CountPeople + 1
    Sheets(3).Cells(i - RoomOnePeople, 1) = Sheets(4).Cells(i, 1)
    Sheets(3).Cells(i - RoomOnePeople, 2) = Sheets(4).Cells(i, 2)
    Next
    //把亂數的名單按照學號由小到大重新排列
    Sheets(3).Range("A2", "B" & CountPeople - RoomOnePeople + 1).Sort Sheets(3).Range("A1"), 1
    Sheets(3).Range("A1", "B" & CountPeople - RoomOnePeople + 1).Borders.LineStyle = 1
End Sub

然後我建了一個UserForm以及四個TextBox來接收使用者輸入的參數
還有一個CommandButton來讓使用者按下之後開始亂數分配教室名單
程式執行完成後,就會有兩張工作表來儲存兩間亂數過後的教室名單。
至於 Module1.亂數工作表的演算法部分,我打算另寫一篇文章來介紹^_^


沒有留言:

張貼留言