神奇的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》插件


分享到:


相關文章: