2016 - 2024

感恩一路有你

使用VBA实现在Excel中随机生成指定范围的时间

浏览量:3048 时间:2024-02-07 15:17:09 作者:采采

如下面的Excel表格所示,要在E列里面随机生成13:30-17:30范围内的时间,相邻单元格的时间差不超过30秒,且呈递增形式。要完成上述任务要求,Excel表格上的随机函数可能无法胜任,只能采用VBA程序来实现。

VBA程序思路解读:

1. 在时间显示中,时、分、秒都含有冒号":"间隔,如果随机生成时、分、秒之后再进行比对计算,显得比较复杂。

2. 在时间中,如果未达到24小时,其时间转换成的数值将会小于1。例如:在F2单元格里输入公式VALUE(E2),E2单元格里的时间将会转换成数值。因此,在VBA程序中也可以采用这种方式将时间转换成数值进行计算。

按下键盘上的【Alt F11】组合键或点击【开发工具】、【Visual Basic】调出VBA编辑器。

在VBA编辑器中插入代码模块:

点击【插入】、【模块】,在VBA模块的代码框中输入以下程序代码,然后按下【F5】键运行程序。

```vba

Sub RndTime()

Dim i1, i2, i3, i4, i5, i6, i7, i8

On Error Resume Next '忽略运行过程中可能出现的错误

Set mysheet1 ("Sheet1") '定义工作表Sheet1

i1 CDate("13:30:00") '把时间转换成数值

i2 CDate("17:30:00")

i3 CDate("13:30:30") - CDate("13:30:00") '相差30秒的数值

i4 0 '中间变量,用于记录循环的次数

i6 i1 '先把起始时间赋给i6

i8 1 '第几行

Do

i4 i4 1 '循环次数累计

i5 Rnd() '生成的随机数

i7 i5 - i6 '生成的随机数与上一次值的差

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列对应的单元格里面

End If

If i4 > 5000000 Or i8 > 200 Then '如果循环次数超过500万次或生成的随机时间达到200个

Exit Do '退出Do循环

End If

Loop

("E:E").NumberFormatLocal "h:mm:ss;@" '把E列设置成时间格式

End Sub

```

VBA程序函数解释说明:

1. `CDate`是将时间格式的字符转换为可运算的数值,便于后续计算。

2. `Rnd`随机函数的取值范围在大于等于0且小于1之间。

3. 使用`Do...Loop`循环时,应避免出现死循环。可以在循环中累计循环次数,在达到指定次数时强制退出`Do`循环。

4. 随机生成的数值都是小数,因此需要将单元格设置为时间格式,以正确显示所需的随机时间。

回到Excel表格界面,即可看到随机生成的时间。

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。