利用隨機數完成公司年會抽獎過程

2020-12-19 VBA語言專家

大家好,最近推出的內容是「VBA信息獲取與處理」中的部分內容,這套教程面向中高級人員,涉及範圍更廣,實用性更強,現在的內容是第二個專題「隨機數(Random)在EXCEL工作表及VBA中的應用」的內容。s

對於數據處理而言,隨機信息的處理是非常重要的一部分,什麼是隨機數呢?隨機數是專門的隨機試驗的結果。在統計學的不同技術中需要使用隨機數,比如在從統計總體中抽取有代表性的樣本的時候,或者在將實驗動物分配到不同的試驗組的過程中等等。

產生隨機數有多種不同的方法。這些方法被稱為隨機數發生器。隨機數最重要的特性是:它所產生的後面的那個數與前面的那個數毫無關係。真正的隨機數是使用物理現象產生的:比如擲錢幣、骰子、轉輪、使用電子元件的噪音、核裂變等等,這樣的隨機數發生器叫做物理性隨機數發生器,它們的缺點是技術要求比較高。

計算機或計算器產生的隨機數有很長的周期性。其實它們不是真正地隨機產生,因為它們實際上是可以計算出來的,但是它們具有類似於隨機數的統計特徵。這樣的發生器叫做偽隨機數發生器。在實際應用中往往使用偽隨機數就足夠了。

第五節 實際場景中隨機數的利用

這一講,我們講這個專題的具體應用,對於隨機數,雖然屬於非常抽象的一個個的數字,在專題的開始我已經講過隨機數的概念,就是根據之前的數據是無法推測出後續的數據的,正是有著這樣的原理,我們可以用於某些實際的場景,這裡主要給大家模擬一種抽獎的場景,再次之前,我們還要講一下在工作表中我們如何利用我們已經建立的MyRandomA函數。

1 工作表中MyRandomA自定義函數的利用

在代碼的講解中我們知道,MyRandomA函數有四個參數,這四個參數分別是產生隨機數的最小值、最大值、要求產生隨機數的個數,以及一個數組的下標(這個值不是必須的)。那麼我們就在工作表中看看如何利用這個函數。首先我們看看我們的工作表需求:

要求產生一個最大值是10,最小值是40的10個隨機數。

① 我們要首先選中10個(即產生隨機數的個數)橫向的單元格:

② 在編輯欄錄入公式:= MyRandomA(B2,B3,B4),然後同時按下數組的控制鍵CTRL+SHIFT+ENTER,就產生了10個我們要求的隨機數。為什麼要同時按下上面所說的三鍵呢?有興趣的朋友可以參考我的《VBA數組與字典解決方案》這套教程。

下面看看產生的隨機數截圖:

如果要縱向產生十個隨機數呢?可以利用公式:=TRANSPOSE(MyRandomA(B2,B3,B4)) 來獲得,為什麼要利用這個公式呢?同樣請朋友們參考我的《VBA數組與字典解決方案》這套教程:

2 利用隨機數完成公司年會抽獎過程

很多公司都用年會抽獎的傳統,為了達到公平,公正的原則,我們也可以利用隨機數進行操作,做一個簡單的小程序即可以實現抽獎的過程。這個程序同樣在本專題的程序文件中,大家可以利用,這裡只是對隨機函數部分做講解,其他的過程大家可以自己理解,比如,上面的抽獎界面,先要抽出的三等獎10名,在點擊準備後灰色區域將會出現所有參與抽獎人員的名單滾動,當點擊抽獎時將會在「中獎名單即時公示」欄出現此輪抽獎的10名人員名單;當下一輪抽獎時,這輪的人員會下移。

這個抽獎程序可以實現多輪抽獎,每輪抽獎的人數可以設定,中獎人員名單可以即時公布等等優點,非常的方便,可以作為大型及小型年會的娛樂應用。

當然,這其中的VBA代碼也很值得學習,很多函數過程利用的十分巧妙。可見VBA在適當的時候也是娛樂的高手。

在抽獎之前,我們要事先錄入參與人員的名單:

在每輪開始前,利用總人員名單與已經中獎人員的差集求出此輪參與抽獎人員的中人數。然後利用之前講解的Function MyRandomA 來完成我們抽獎過程,看下面的代碼:

Sub MYNZE() '開始抽獎

Sheets("sheet5").Select

TT = False

Set mydic = CreateObject("scripting.dictionary")

'求兩個人名單的差集

PCount = Cells(Rows.Count, "o").End(xlUp).Row

jCount = Cells(Rows.Count, "J").End(xlUp).Row

ARRA = Range("P2:P" & PCount)

ARRB = Range("J1:J" & jCount)

Arr = ARRE(ARRA, ARRB)

Range("C2") = UBound(Arr)

'將人名裝入字典

For i = 1 To UBound(Arr)

mydic(i) = Arr(i)

Next

'求第幾輪的抽獎

RRR = Cells(3, "h").Value

If RRR = "" Then

k = 1

Else

k = Mid(RRR, 2, Len(RRR) - 2) + 1

End If

'預填已經完成抽獎的數組

KONG = False

If Range("J3") <> "" Then ARRC = Range("H3:J" & Cells(2, "J").End(xlDown).Row): KONG = True

'開始抽獎

UU = MyRandomA(1, UBound(Arr), Range("B2"))

'回填數據

For i = 1 To Range("b2")

Cells(jCount + i, "h") = "第" & k & "輪"

Cells(jCount + i, "i") = Range("a2")

Cells(jCount + i, "j") = mydic(UU(i))

Next

Range("A6") = mydic(UU(i - 1))

Set mydic = Nothing

'新中獎名單

ARRD = Range("H" & jCount + 1 & ":J" & Cells(2, "J").End(xlDown).Row)

'重置中獎名單

Range("H3:J" & Cells(2, "J").End(xlDown).Row).ClearContents

j = 3

For i = UBound(ARRD) To 1 Step -1

Cells(j, "h") = ARRD(i, 1)

Cells(j, "i") = ARRD(i, 2)

Cells(j, "j") = ARRD(i, 3)

j = j + 1

Next

If KONG = True Then

For i = 1 To UBound(ARRC)

Cells(j, "h") = ARRC(i, 1)

Cells(j, "i") = ARRC(i, 2)

Cells(j, "j") = ARRC(i, 3)

j = j + 1

Next

End If

MsgBox "你已經完成第" & k & "輪的抽獎!"

End Sub

代碼截圖:

代碼講解:上述代碼完成任意輪次的抽獎過程。

① UU = MyRandomA(1, UBound(Arr), Range("B2")) 這個語句是整個代碼的核心部分,其中1是產生隨機數的最小值,UBound(Arr)是隨機數的最大值,Range("B2")是產生隨機數的個數。UU是返回的中獎的人員序號。

② '回填數據

For i = 1 To Range("b2")

Cells(jCount + i, "h") = "第" & k & "輪"

Cells(jCount + i, "i") = Range("a2")

Cells(jCount + i, "j") = mydic(UU(i))

Next

Range("A6") = mydic(UU(i - 1))

Set mydic = Nothing

'新中獎名單

ARRD = Range("H" & jCount + 1 & ":J" & Cells(2, "J").End(xlDown).Row)

'重置中獎名單

Range("H3:J" & Cells(2, "J").End(xlDown).Row).ClearContents

j = 3

For i = UBound(ARRD) To 1 Step -1

Cells(j, "h") = ARRD(i, 1)

Cells(j, "i") = ARRD(i, 2)

Cells(j, "j") = ARRD(i, 3)

j = j + 1

Next

If KONG = True Then

For i = 1 To UBound(ARRC)

Cells(j, "h") = ARRC(i, 1)

Cells(j, "i") = ARRC(i, 2)

Cells(j, "j") = ARRC(i, 3)

j = j + 1

Next

End If

上述過程是處理應產生的數據,首先是新產生的人員數據回填,這裡利用了字典的鍵值,然後將新產生的數據和已經產生的數據分別放到兩個數組中,之後清空數據,再次回填數據,先填新產生的中獎人員,然後再填入已經中獎的人員名單。

最後我們看看實際的截圖:

還是非常的漂亮的。在實際的動作中,人員的滾動會是動態的效果,非常的有視覺效果。好了,具體代碼還請大家參考本專題的程序文件。

本節知識點回向值工作表中如何利用VBA中已經定於的函數?隨機函數在抽獎過程中是如何利用的?在程序的開始部分,為什麼要講人員的名單放到字典中,這樣做的好處是什麼?

本節內容詳細代碼「參考002工作表.XLSM」

VBA是利用Office實現自己小型辦公自動化的有效手段,這是我對VBA的應用界定。在取代OFFICE新的辦公軟體沒有到來之前,誰能在數據處理方面做到極致,誰就是王者。其中登峰至極的技能非VBA莫屬!學習VBA是個過程,也需要經歷一種枯燥的感覺,如太白詩云:眾鳥高飛盡,孤雲獨去閒。相看兩不厭,只有敬亭山。

「水善利萬物而不爭」,綿綿密密,微則無聲,巨則洶湧。學習亦如此,知道什麼是自己所需要的,不要蜷縮在一小塊自認為天堂的世界裡,待到暮年時再去做自欺欺人的言論。要努力提高自己,用一顆充滿生機的心靈,把握現在,這才是進取。越是有意義的事情,困難會越多。願力決定始終,智慧決定成敗。不管遇到什麼,都是風景。看淡紛爭,看輕得失。茶,滿也好,少也好,不要計較;濃也好,淡也好,其中自有值得品的味道。去感悟真實的時間,靜下心,多學習,積累福報。而不是天天混日子,也不是天天熬日子。在後疫情更加嚴峻的存量殘殺世界中,為自己的生存進行知識的儲備,特別是新知識的儲備。學習時微而無聲,利用時則巨則洶湧。

我記得20年前自己初學VBA時,那時的資料甚少,只能看源碼自己琢磨,真的很難。20年過去了,為了不讓學習VBA的朋友重複我之前的經歷,我根據自己多年VBA實際利用經驗,推出了六部VBA專門教程。

第一VBA代碼解決方案是VBA中各個知識點的講解,覆蓋絕大多數的VBA知識點,初學必備;

第二VBA資料庫解決方案資料庫是數據處理的專業利器,教程中詳細介紹了利用ADO連接ACCDB和EXCEL的方法和實例操作,適合中級人員的學習。

第三VBA數組與字典解決方案數組和字典是VBA的精華,字典是VBA代碼水平提高的有效手段,值得深入的學習,是初級及中級人員代碼精進的手段。

第四VBA代碼解決方案之視頻是專門面向初學者的視頻講解,可以快速入門,更快的掌握這門技能。

第五VBA中類的解讀和利用是一部高級教程,講解類的虛無與肉身的度化,類的利用雖然較少,但仔細的學習可以促進自己VBA理論的提高。

第六套教程:《VBA信息獲取與處理》是一部高級教程,涉及範圍更廣,實用性更強,面向中高級人員。教程共二十個專題,包括:跨應用程式信息獲得、隨機信息的利用、電子郵件的發送、VBA網際網路數據抓取、VBA延時操作,剪切板應用、Split函數擴展、工作表信息與其他應用交互,FSO對象的利用、工作表及文件夾信息的獲取、圖形信息的獲取以及定製工作表信息函數等等內容。如需要可以可以WeChat: NZ9668

學習的過程也是修心的過程,修一個平靜的心。在代碼的世界中,心平靜了,心情好了,身體自然而然就好。心靜則正,內心裡沒有那麼多邪知邪見,也就沒有那麼多妄想。利人就是利己。這些教程也是為幫助大家起航,助上我自己之力,我的上述教程是我多的經驗的傳遞,大家可以根據以上資料1,3,2,6,5或者是4,3,2,6,5的順序逐漸深入的逐漸學習。

每一分收穫都是成長的記錄,怎無憑,正是這種執著,成就了朝霞的燦爛。最後將一闕詞送給致力於VBA學習的朋友,讓大家感受一下學習過程的枯燥與執著:

浮雲掠過,暗語無聲,

唯有清風,驚了夢中啼鶯。

望星,疏移北鬥,

奈將往事雁同行。

阡陌人,昏燈明暗,

忍顧長亭。

多少VBA人,

暗夜中,悄聲尋夢,盼卻天明。

怎無憑!

分享成果,隨喜正能量

相關焦點

  • 最全最實用的的抽獎動畫,帶你玩轉年會抽獎~
    今天,我們選擇了最近熱度很高的一個詞:年會抽獎。歲末年底,無論是大企小社,都會有一個或大或小的慶祝聚會,全員同聚,至此一刻,同總結、共慶祝,同歡同望,我們統謂之為「年會」。抽獎動畫,作為年會PPT中非常受矚目的一個動畫板塊,我們必須要高度的重視,今天口袋君就帶你捋捋「PPT史(未)上(知)最(統)全(計)」的抽獎動畫。
  • 年會還在用紙箱子抽獎?NO NO NO,抽獎小程序了解一下
    年會用什麼做抽獎道具?紙箱子?抽獎券?NO NO  NO,現在都用抽獎小程序啦!方便快捷,功能強大,綠色環保(略過一萬字優點),而且還免費使用,oh my god,  一起來了解一下抽獎小程序。
  • 介紹幾種年會使用的抽獎軟體
    年會一個讓HR頭疼的,喜歡的員工把它當作年終福利發放場,不喜歡的當作今年最後的屠宰場,咱們官方點說吧,年會是企業和組織一年一度的「家庭盛會」,主要目的是客戶答謝,激揚士氣,營造組織氣氛、深化內部溝通、促進戰略分享、增進目標認同,並制定第二年的目標,為新一年度的工作奏響序曲。
  • 年會上抽獎,有什麼好的抽獎軟體推薦?
    有人說,年會好比單位的春晚。但是事實證明我們都是不看春晚的,或者說只期待春晚的某幾個節目。如果說春晚最期待的是小品,那年會最期待的莫過於抽獎活動了。抽獎活動這麼振奮人心,那抽獎方式呢?年會策劃什麼樣的抽獎活動才有意思?手動的紙條抽獎?
  • 你會用Excel製作公司年會的抽獎系統嗎?
    在年會中,抽獎環節是重頭戲,那你知道如何用Excel製作帶有照片的抽獎系統嗎?今天與大家分享一下有關製作技巧。操作步驟第一步:設置隨機數值在空單元格中,這裡是在F1單元格中輸入公式=INDEX($A$1:$A$8,RANDBETWEEN
  • 金數據年會抽獎軟體使用教程
    【每日科技網】   公司年會往往是春節前公司最後一件大事,而在所有年會環節的準備中,「抽獎」一直是個實現起來不怎麼簡單的事。  很多情況下,「現場抽獎」工具都是找公司裡的比較「閒」的程式設計師來開發。但你也肯定知道,開發一個程序哪有那麼簡單?抽獎頁面要做的足夠好看?
  • Excel 年會抽獎工具,源碼下載,收藏備用
    文/江覓易見公司年會,為了活躍氣氛,基本上都有一個抽獎環節,為了顯示相對的公平公正,一般通過隨機的方式來取得人員名單。就像黑箱摸人一樣,看上去不被人知道的事情,就應該是公平的一樣。事實上也是如此,對於辛苦一年之後,給大家找點快樂,也不能浪費了公司的一片好意。如何讓這樣的好意不被誤解為暗箱操作,那麼就用聽天由命來解決吧!這是一個隨機獲取人員名單的功能,分別可以抽取一二三等獎共六人。當然了,如果你懂vba,也可以增加很多人。
  • 活動抽獎如何保證公平性?Excel輔助列+隨機數來幫忙
    Excel中,隨機生成一列隨機數是很常見的問題,比如說我們要隨機生成大於等於0小於1的隨機數,我們就可以在目標單元格輸入函數公式「=RAND()」。由上圖可見,我們用RAND函數生成出來的隨機數都是小數的,可是在很多時候,我們希望生成的隨機數不要小數,而是正數。比如說我們要隨機生成大於1小於1000這個範圍之內的整數,我們就可以在目標單元格中輸入函數公式「=RANDBETWEEN(1,1000)」。
  • 禮品定製|企業年會抽獎禮品優選攻略,提升年會逼格
    又到了準備年會選抽獎禮的時節,年終獎發的是紅利,抽獎禮抽的是快樂,新意與心意都要具備,這場年會才具備津津樂道的談資,而獎品的選擇很大程度上決定吃瓜群眾對公司年會的評價,也關係著員工留存的問題,獎品選的好,才能讓年會規模更上檔次,領導看著滿意,員工也玩的開心,但是準備一份抽獎禮品清單是十分耗時又耗神的
  • 公司年會抽獎,獎品是「春節加班,有加班費」
    昨晚公司年會抽獎,設置了4個獎項:一等獎是「提前5天回家過年」,二等獎是提前3天,三等獎提前1天,四等獎是「春節加班,有加班費」,後來才發現,一二三等獎各只有一個,其餘全是四等獎……哈哈哈這套路,就說你服不服吧?
  • 公司年會抽獎,90後員工抽到萬元大獎,一個月後他遞交辭職信!
    每到年底,很多公司都會舉辦年會,一是利用年會對全年工作的回顧及總結,二是對公司員工進行表揚與獎勵。很多公司會設置幾個獎項,大到一等獎,小到安慰獎都有,員工辛苦一年,在年會抽獎上,無論抽到那個獎,相信對很多員工來說都會很開心。
  • 年會抽獎專題:大家都想要的年會抽獎禮品清單
    人們對抽獎總是抱有極大的熱情和期待,這種拼運氣的錦鯉活動總是讓人念念不忘,年會的員工福利品人人有份,雖有一定的期待感,但關注度遠沒有量少質高的抽獎禮品高。要想成為朋友圈裡別人家的年會,讓員工開心,領導滿意,精彩的晚會節目,貼心的員工福利禮品以及高逼格,上檔次的抽獎禮品不能少。
  • 怎樣才能做好年會活動策劃抽獎環節?
    年會、晚會吃喝玩樂要到位,年末員工福利也要到位,那麼怎麼才能做好年會抽獎環節呢,一起來思考以下問題吧~年會活動策劃的抽獎環節怎麼做?傳統的紙箱抽獎、砸金蛋等抽獎方式費時費力,採購物料和保存物料都十分麻煩。
  • 適合年會上玩的抽獎遊戲有哪些?
    年會就要到了,在年會上最令人期待的環節就是抽獎環節!但是年會抽獎環節到底要怎麼玩才能有逼格,有創意,不會讓現場觀眾感覺到形式老套呢?在這裡,小編給大家介紹一款抽獎遊戲——3D抽獎,這款抽獎遊戲作為年會中的年會創意節目,能夠提升年會現場逼格,讓現場觀眾在看到抽獎環節時瞬間感覺到眼前一亮!
  • 盤點另類年會抽獎 跟老闆共進晚餐成最無奈獎
    盤點另類年會抽獎 跟老闆共進晚餐成最無奈獎(來源成都商報)1月11日晚,成都某貿易公司年會的抽獎環節正在熱鬧地進行著,隨著300元、500元,甚至千元現金大獎的出爐,現場已是一片沸騰如果家太遠,中獎員工可選擇公司提供的機票。有效期:2012年1月22日之前報送往返時間年會抽獎抽到「遲到30次」據毛夢雲介紹,1月11日晚上,她所在的成都某貿易公司舉行了熱鬧喜慶的年會。年會中有抽獎環節,事先並沒有說是什麼獎品,只說會有「驚喜」。
  • 2020年末 公司年會尾牙活動應該如何策劃執行?
    又到一年尾牙季,正是歲末歡聚好時節,公司領導把酒言歡,舉杯同慶,同事們家長裡短,細數點滴。一年歡聚時刻,不來場宴會也太說不過去。那麼問題來了,怎樣的年會策劃才能讓公司領導還有一眾員工滿意呢?眾口難調,策劃一場尾牙宴除了場地選址難以抉擇以外,宴會的節目流程也令大家頭疼。
  • 如何用excel製作年會抽獎滾動工具,原來一個公式就搞定了
    抽獎是年會中的重要一環,那麼可以滾動的抽獎工具該怎麼做呢?抽獎工具,還是可以滾動的,看似很複雜,其實在excel裡用一個公式就搞定了,想要在年會上秀一手嘛,那就趕快來學習吧~一個公式搞定抽獎工具只需在需要輸出中獎名單的單元格內填如以下公式:=index(人總名單所在列/行,randbetween(總名單起始行數,總名單結束行數)),如圖中所示數據就是用公式
  • 年會策劃中,年會執行時間你安排妥當了嗎?
    年會策劃中,年會執行時間你安排妥當了嗎?年會執行起來一點都不同意,事多還雜亂,是整個年會過程中最勞神傷腦的一個過程了,需要團隊緊密合作及後勤同事們細心付出,這還不夠。在這裡奧廷小編就要說下年會的執行時間順序真的很重要,你要是第一步做不好,接下來有很多無用功等著你做呢。
  • 曬公司年會各種獎品:遲到券年假券及專車接送券
    臨近春節,各個單位的年會正進行得如火如荼,很多年會都設置了抽獎活動。日前,有網友發帖稱,自己所在的成都某貿易公司的年會上,獎品有「遲到券」「年假券」「專車接送券」等等,抽到「遲到券」的員工可憑這張小紙條遲到不受罰,抽到年假券的員工可多休幾天年假。
  • MIT提出了用隨機數生成隨機數的計算機算法
    多年來,有些公司開發出新穎的算法,儘管它們本身不會生成隨機數,但卻提供了巧妙而有效的方式來使用和操縱隨機性。8月份,在線國際人工智慧與統計會議上,麻省理工學院的Mansinghka小組公布了他們的最新成果之一:提出了被稱為「快速加載的骰子滾輪」(FLDR)的算法。 簡而言之,FLDR使用隨機序列完美地模擬了加載模具的滾動。