使用VBA實(shí)現(xiàn)在Excel中隨機(jī)生成指定范圍的時(shí)間
如下面的Excel表格所示,要在E列里面隨機(jī)生成13:30-17:30范圍內(nèi)的時(shí)間,相鄰單元格的時(shí)間差不超過(guò)30秒,且呈遞增形式。要完成上述任務(wù)要求,Excel表格上的隨機(jī)函數(shù)可能無(wú)法勝任,只能采用V
如下面的Excel表格所示,要在E列里面隨機(jī)生成13:30-17:30范圍內(nèi)的時(shí)間,相鄰單元格的時(shí)間差不超過(guò)30秒,且呈遞增形式。要完成上述任務(wù)要求,Excel表格上的隨機(jī)函數(shù)可能無(wú)法勝任,只能采用VBA程序來(lái)實(shí)現(xiàn)。
VBA程序思路解讀:
1. 在時(shí)間顯示中,時(shí)、分、秒都含有冒號(hào)":"間隔,如果隨機(jī)生成時(shí)、分、秒之后再進(jìn)行比對(duì)計(jì)算,顯得比較復(fù)雜。
2. 在時(shí)間中,如果未達(dá)到24小時(shí),其時(shí)間轉(zhuǎn)換成的數(shù)值將會(huì)小于1。例如:在F2單元格里輸入公式VALUE(E2),E2單元格里的時(shí)間將會(huì)轉(zhuǎn)換成數(shù)值。因此,在VBA程序中也可以采用這種方式將時(shí)間轉(zhuǎn)換成數(shù)值進(jìn)行計(jì)算。
按下鍵盤上的【Alt F11】組合鍵或點(diǎn)擊【開發(fā)工具】、【Visual Basic】調(diào)出VBA編輯器。
在VBA編輯器中插入代碼模塊:
點(diǎn)擊【插入】、【模塊】,在VBA模塊的代碼框中輸入以下程序代碼,然后按下【F5】鍵運(yùn)行程序。
```vba
Sub RndTime()
Dim i1, i2, i3, i4, i5, i6, i7, i8
On Error Resume Next '忽略運(yùn)行過(guò)程中可能出現(xiàn)的錯(cuò)誤
Set mysheet1 ("Sheet1") '定義工作表Sheet1
i1 CDate("13:30:00") '把時(shí)間轉(zhuǎn)換成數(shù)值
i2 CDate("17:30:00")
i3 CDate("13:30:30") - CDate("13:30:00") '相差30秒的數(shù)值
i4 0 '中間變量,用于記錄循環(huán)的次數(shù)
i6 i1 '先把起始時(shí)間賦給i6
i8 1 '第幾行
Do
i4 i4 1 '循環(huán)次數(shù)累計(jì)
i5 Rnd() '生成的隨機(jī)數(shù)
i7 i5 - i6 '生成的隨機(jī)數(shù)與上一次值的差
If i5 > i1 And i5 < i2 And i7 < i3 And i7 > 0 Then '如果在指定的時(shí)間范圍里面
i6 i5 '把滿足條件的i5的值賦給i6
i8 i8 1 '從第二行開始
mysheet1.Cells(i8, 5) i5 '把i5的值寫到第5列對(duì)應(yīng)的單元格里面
End If
If i4 > 5000000 Or i8 > 200 Then '如果循環(huán)次數(shù)超過(guò)500萬(wàn)次或生成的隨機(jī)時(shí)間達(dá)到200個(gè)
Exit Do '退出Do循環(huán)
End If
Loop
("E:E").NumberFormatLocal "h:mm:ss;@" '把E列設(shè)置成時(shí)間格式
End Sub
```
VBA程序函數(shù)解釋說(shuō)明:
1. `CDate`是將時(shí)間格式的字符轉(zhuǎn)換為可運(yùn)算的數(shù)值,便于后續(xù)計(jì)算。
2. `Rnd`隨機(jī)函數(shù)的取值范圍在大于等于0且小于1之間。
3. 使用`Do...Loop`循環(huán)時(shí),應(yīng)避免出現(xiàn)死循環(huán)??梢栽谘h(huán)中累計(jì)循環(huán)次數(shù),在達(dá)到指定次數(shù)時(shí)強(qiáng)制退出`Do`循環(huán)。
4. 隨機(jī)生成的數(shù)值都是小數(shù),因此需要將單元格設(shè)置為時(shí)間格式,以正確顯示所需的隨機(jī)時(shí)間。