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