這段程式碼我放在"Module1"模組裡面
第一個For迴圈把原始修課名單複製到第四張工作表
第二個For迴圈則進行亂數分配名單
演算法的部分非常簡單
使用變數 i 來記錄第幾位學生( i 會遞增)
使用變數randNum 來取得修課人數之間的一個隨機整數
然後就把第 i 位學生與第randNum位學生做交換
For 迴圈只進行三分之一修課人數的次數
Sub 亂數工作表() Dim TempNumber As Long Dim TempName As String For i = 1 To UserForm1.CountPeople + 1 Sheets(4).Cells(i, 1) = Sheets(1).Cells(i, 1) Sheets(4).Cells(i, 2) = Sheets(1).Cells(i, 2) Next For i = 2 To UserForm1.CountPeople / 3 Randomize randNum = Int(Rnd * (UserForm1.CountPeople)) + 2 TempNumber = Sheets(4).Cells(i, 1) TempName = Sheets(4).Cells(i, 2) Sheets(4).Cells(i, 1) = Sheets(4).Cells(randNum, 1) Sheets(4).Cells(i, 2) = Sheets(4).Cells(randNum, 2) Sheets(4).Cells(randNum, 1) = TempNumber Sheets(4).Cells(randNum, 2) = TempName Next End Sub
這段演算法我學習使用VBA的Rnd 方法來幫助我取隨機數
簡單介紹一下這個方法
Int ((upperbound - lowerbound + 1) * Rnd + lowerbound)
Int ((upperbound - lowerbound + 1) * Rnd + lowerbound)
upperbound顧名思義就是範圍的上限
lowerbound 顧名思義就是範圍的下限
舉例而言
Int ((6 - 1 + 1) * Rnd + 1) 就會回傳給我們1~6之間的整數
或是也可以這樣理解
Int(Rnd * range) + InitialValue
也就是說,回傳從InitialValue值開始落在range範圍的一個數
例如:
Int(Rnd * 501) + 200那就會回傳給我們200~700之間的整數
200就是起始值,而200~700之間剛好共501個整數(包含200跟700)
最後補充幾個VBA的基礎控制流程跟迴圈
1.If-Then
If 條件 Then
敘述
End If
2.If-Then-Else
If 條件 Then
敘述
ElseIf 條件
敘述
End If
敘述
End If
3.If-Then-ElseIf-Else
If 條件 Then
敘述
ElseIf 條件
敘述
ElseIf 條件
敘述
Else
敘述
End If
4.Do While ...Loop
Do While 條件
敘述
Loop
5.Do
...Loop While
Do
敘述
Loop While 條件
6.For ... Next
For 數值變數=初始值 To 終止值 [Step增量]
敘述
Next [數值變數]
* [Statements]表示可以省略!
7.跳離指令
Exit Do:強制離開Do Loop迴圈
Exit For:強制離開For Loop迴圈
Exit Sub:強制跳離Sub程序
沒有留言:
張貼留言