神奇的Excel VBA系列之:数据段内选择随机数

神奇的Excel VBA系列之:数据段内选择随机数

头条用户在悟空问答中提的问题:在1至30中1到10选2个,11到20选3个,21到30选1个,用Excel如何编程?

神奇的Excel VBA系列之:数据段内选择随机数

题主的意图应该是数据段随机选择2个数字的意思。

从1~10; 11~20;20~30选择2个数字。 可以使用VBA函数Rnd函数进行, 这是一个随机数函数,返回一个小于1但是大于等于0的随机数。 有关Rnd函数的详细说明和示例,请参考《神奇的VBA》插件(自行头条搜索该插件)进行学习和阅读。

神奇的Excel VBA系列之:数据段内选择随机数

运用该函数,我们可以这样编程:

神奇的Excel VBA系列之:数据段内选择随机数

Sub 从1至10之间取2个随机数()
Dim n1 As Long
Dim n2 As Long
n1 = Int(((10 - 1 + 1) * Rnd) + 1)
n2 = Int(((10 - 1 + 1) * Rnd) + 1)
MsgBox "随机数1:" & n1 & Chr(10) & "随机数2:" & n2
End Sub
神奇的Excel VBA系列之:数据段内选择随机数

其中的Int(((10 - 1 + 1) * Rnd) + 1)结构,我有意写的这么复杂, 这是为了更方便的重复运用该结构, 例如从21到30 的随机数,可以写作Int(((30 - 21 + 1) * Rnd) + 21). 这样就非常便于理解。 其中Int函数将最终随机数做了求整处理。 如果你目前基础不够,暂时还不能吃透整个一句的含义的话,没有任何关系,你就先这么用着。以后就明白了。

好了, 上面的VBA程序中写了个最基本的随机数程序。 举一反三,11~20数据段中取3个数以及21~30数据段中任取1个数。 就很简单了,见下面示例:

神奇的Excel VBA系列之:数据段内选择随机数

Sub 从11至20之间取3个随机数()
Dim n1 As Long
Dim n2 As Long
Dim n3 As Long
n1 = Int(((20 - 11 + 1) * Rnd) + 11)
n2 = Int(((20 - 11 + 1) * Rnd) + 11)
n3 = Int(((20 - 11 + 1) * Rnd) + 11)
MsgBox "随机数1:" & n1 & Chr(10) & "随机数2:" & n2 & Chr(10) & "随机数3:" & n3
End Sub

Sub 从21至30之间取1个随机数()
Dim n1 As Long
n1 = Int(((30 - 21 + 1) * Rnd) + 21)
MsgBox "随机数1:" & n1
End Sub

好了, 看到现在,可能你会提出疑问了。我想要的是随机但又不重复的两个数怎么办? 很好办, 我们可以在程序中添加循环语句, 通过循环将本次产生的随机数跟上次进行对比, 如果不相同就采用该随机数并结束循环,否则继续循环生成随机数直至不相同。我们使用Do...Loop循环结构进行判断。有关Do..Loop循环结构,请参考《神奇的VBA》插件(自行头条搜索该插件)进行学习和阅读。

神奇的Excel VBA系列之:数据段内选择随机数

Sub 从1至10之间取2个随机数_不允许重复()
Dim n1 As Long
Dim n2 As Long
n1 = Int(((10 - 1 + 1) * Rnd) + 1)
Do
n2 = Int(((10 - 1 + 1) * Rnd) + 1)
Loop Until n2 <> n1
MsgBox "随机数1:" & n1 & Chr(10) & "随机数2:" & n2
End Sub

上面的示例很好的满足了题主的需求。 21~30任取一个随机数,我们就不看了。 因为只需要1个,就不需要使用循环了,下面我们看看11~20数据段获取3个不重复的随机数。 该怎么操作呢? 方法可能很多,但是我脑子的第一反应是继续使用循环喽。好的我继续编程:

神奇的Excel VBA系列之:数据段内选择随机数

Sub 从11至20之间取3个随机数_不允许重复()
Dim n1 As Long
Dim n2 As Long
Dim n3 As Long
n1 = Int(((20 - 11 + 1) * Rnd) + 11)

Do
n2 = Int(((20 - 11 + 1) * Rnd) + 11)
Loop Until n2 <> n1

Do
n3 = Int(((20 - 1 + 1) * Rnd) + 11)
Loop Until n3 <> n1 And n3 <> n2

MsgBox "随机数1:" & n1 & Chr(10) & "随机数2:" & n2 & Chr(10) & "随机数3:" & n3
End Sub

好了,上面的代码应该已经很好的满足我们对于指定数据段任选不重复的数据要求了。

不过看完之后是不是觉得代码看上去一点都不简洁 ? 我也这么觉得, 我们可以将生成随机数的代码段抽象做一个通用的函数。

Int(((20 - 11 + 1) * Rnd) + 11)

我们使用Function函数进行改写,我将函数名称随便地设置为GetRndNumber:

有关Function自定义函数的知识,请参考《神奇的VBA》插件(自行百度或者头条搜索该插件的下载地址)进行学习和阅读。

Function GetRndNumber(x1 As Long, x2 As Long) As Long
GetNumber = Int(((x2 - x1 + 1) * Rnd) + x1)
End Function

这个自定义GetRndNumber函数对照我开头针对Int(((10 - 1 + 1) * Rnd) + 1)结构进行的说明,是不是清晰了很多?

下面我使用GetRndNumber()函数改写1~10数据段任选2个不重复数的代码示例

神奇的Excel VBA系列之:数据段内选择随机数

Sub 从1至10之间取2个随机数()
Dim n1 As Long
Dim n2 As Long

n1 =GetRndNumber(1,10)
Do
n2 =GetRndNumber(1,10)
Loop Until n2 <> n1
MsgBox "随机数1:" & n1 & Chr(10) & "随机数2:" & n2
End Sub

动手试一试, 复制代码运行下吧~~!

有关Excel VBA编程知识(超多职场牛人的必备秘技),可下载安装使用一款优秀职场人必备的工具《神奇的VBA》插件,一款嵌入进Excel Ribbon界面,打开任意Excel工作簿就能随时查阅学习VBA编程的Excel 插件。

插件下载地址戳下面链接:

神奇的Excel VBA系列之:数据段内选择随机数

《神奇的VBA》插件


分享到:


相關文章: