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

2020-12-04 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人,

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

怎無憑!

分享成果,隨喜正能量

相關焦點

  • 大公司年會都在用的Excel抽獎模板,姓名和照片都會隨機跳動...
    值此年會季,教大家做一個隨機滾動出現人名和照片的抽獎器。寫了這麼多抽獎模板的做法,這一款是絕對是為年會量身定製的剛需品。案例:製作如下圖所示的年會抽獎模板:按住 F9,姓名和照片開始隨機跳動;放開 F9,得到抽獎結果。
  • 年會還在用紙箱子抽獎?NO NO NO,抽獎小程序了解一下
    年會用什麼做抽獎道具?紙箱子?抽獎券?NO NO NO,現在都用抽獎小程序啦!方便快捷,功能強大,綠色環保(略過一萬字優點),而且還免費使用,oh my god, 一起來了解一下抽獎小程序。
  • 年會上抽獎,有什麼好的抽獎軟體推薦?
    有人說,年會好比單位的春晚。但是事實證明我們都是不看春晚的,或者說只期待春晚的某幾個節目。如果說春晚最期待的是小品,那年會最期待的莫過於抽獎活動了。抽獎活動這麼振奮人心,那抽獎方式呢?年會策劃什麼樣的抽獎活動才有意思?手動的紙條抽獎?
  • 介紹幾種年會使用的抽獎軟體
    年會一個讓HR頭疼的,喜歡的員工把它當作年終福利發放場,不喜歡的當作今年最後的屠宰場,咱們官方點說吧,年會是企業和組織一年一度的「家庭盛會」,主要目的是客戶答謝,激揚士氣,營造組織氣氛、深化內部溝通、促進戰略分享、增進目標認同,並制定第二年的目標,為新一年度的工作奏響序曲。
  • 還在為公司抽獎、分組而煩惱嗎?用Excel的隨機函數可以輕鬆解決
    今天和大家分享的是如何利用函數產生隨機的數字,並且將這個功能應用在抽獎活動,以及課堂分組這兩個常見的情景,下面我們一起來看看怎麼操作吧。我們假設今天公司舉辦了一個摸彩活動,以上圖為例,要從這12位員工之中,抽出一名幸運得主。那麼這時,我們可以用上一個很實用的函數,叫做RANDBETWEEN。
  • Excel 年會抽獎工具,源碼下載,收藏備用
    文/江覓易見公司年會,為了活躍氣氛,基本上都有一個抽獎環節,為了顯示相對的公平公正,一般通過隨機的方式來取得人員名單。就像黑箱摸人一樣,看上去不被人知道的事情,就應該是公平的一樣。事實上也是如此,對於辛苦一年之後,給大家找點快樂,也不能浪費了公司的一片好意。如何讓這樣的好意不被誤解為暗箱操作,那麼就用聽天由命來解決吧!這是一個隨機獲取人員名單的功能,分別可以抽取一二三等獎共六人。當然了,如果你懂vba,也可以增加很多人。
  • 公司年會抽獎,兼職員工抽到2000元的手機,隔天大家
    導語:公司年會抽獎,兼職員工抽到2000元的手機,隔天讓大家愣了 現如今,馬上就要過年了,很多公司也是在紛紛舉行大大小小的年會來犒賞員工,在舉行年會的時候,相信很多員工都會發現公司會設置一些抽獎的環節,讓大家來抽獎,只是抽獎的時候,很多員工也會發現,公司在對待管理人員或者是普通員工的時候有所區別
  • 隨機抽獎,一種讓用戶上癮的激勵方式
    今天我和你分享一下抽獎的形式,也是隨機獎勵的設計。本文看點:抽獎,決定未來的一種力量;抽獎的產品如何設計更有效;抽獎產品的風控設計。一、抽獎,決定未來的一種力量用戶激勵對於產品設計是很重要的環境,很多產品都是號稱以用戶為中心,為用戶設計產品。
  • 如何利用Excel製作抽獎小程序?
    今天和大家聊一個有趣的課題,利用Excel中的RANDBETWEEN函數實現抽獎功能。首先看成果,按鍵盤上的F9,發現中獎者的姓名都會隨機發生變化,如下圖。成果本文就通過Excel中的RANDBETWEEN函數來實現抽獎的功能。
  • 網際網路公司2019年初年會Java程式設計師編寫抽獎代碼思維邏輯
    我有一個徒弟在一家公司做Java,小組在做一個抽獎系統,現在給我分配到了抽獎邏輯這方面的實現。EMMM,拿到分配的時候是懵B的。抽獎池信息表dd_annual_meeting_prize,這張表看來是獲取抽獎信息的來源。人員信息表dd_annual_meeting_user,這個就是用來得到抽獎人集合的表了。分析下抽獎的過程:抽獎池信息表裡面信息已經定好了不用我管 ,假設人員信息表有100個人參與活動。第一次抽獎(一等獎) 從100人中抽5個人來中獎,但是要分5次抽完,每次抽1人。
  • 公司年會獎品推薦
    公司年會基本上都少不了一個環節,那就是年會抽獎。無論大獎小獎,一方面為了提升年會氣氛,一方面也是公司對員工除了年終獎以外的物質獎勵,當然這還是需要拼運氣的。目前已經是一月份了,中國的傳統春節將近,小部分公司比較趕早的已經開好了年會,對於年會抽獎前陣子還報出了上海某公司年會特等獎一年帶薪年休假的趣聞,不過有效期竟然是2018年年末。但不論真假,我們也都可以借鑑一下,雖然有點不地道,但我們可以給他改成真正落實的一年年休假,當然也不能真的讓員工一下休一年吧,可以折算成工資作為獎勵也是很不錯的。
  • PPT教學:隨機抽獎動畫 part1
    學完本課程你將會知道:1、如何中斷循環動畫2、利用中斷動畫來製作隨機抽獎
  • 抽獎、隨機點名,用EXCEL這麼操作分分鐘就能搞定,值得收藏!
    鍵不放,此時隨機數及中獎人會不斷變化,倒數幾秒,放開F9鍵時則隨機生成一個中獎人。=RANDBETWEEN(bottom,top),返回一個介於指定的數字bottom,top之間的隨機數,表示隨機抽取產生約定的2個數之間(包括這2個數)的任意數。
  • 如何用excel製作年會抽獎滾動工具,原來一個公式就搞定了
    抽獎是年會中的重要一環,那麼可以滾動的抽獎工具該怎麼做呢?抽獎工具,還是可以滾動的,看似很複雜,其實在excel裡用一個公式就搞定了,想要在年會上秀一手嘛,那就趕快來學習吧~一個公式搞定抽獎工具人總名單所在列/行,randbetween(總名單起始行數,總名單結束行數)),如圖中所示數據就是用公式:=index(A:A,between(2,8))按住F9,抽獎滾動起來
  • 抽獎這件事真的是隨機的嗎?
    抽獎這種隨機發生的事情,為啥放到自己身上來說就等於 「 絕對不可能發生 」 呢。計算機產生的隨機數,其實是偽隨機 「 pseudorandom 」 ,或者說是模擬出來的隨機數。但現在有很多場景確實需要計算機 「 隨機 」 點兒啥,比如遊戲,抽獎。。。於是。。。就有了各種各樣的,用來讓計算機生成隨機數的偽隨機算法。
  • 用EXCEL製作隨機抽獎小程序
    今天教大家用EXCEL製作隨機抽獎小程序。方法其實很簡單,只需要兩個函數組合成一個公式!
  • 微信小程序抽獎轉盤組件怎麼做?
    微信小程序轉盤抽獎組件的實現思路1.界面樣式實現從抽獎轉盤的圖中我們可以看出,抽獎轉盤由外圓、扇面抽獎選項、抽獎按鈕組成,其中外圓不難實現,大家在處理微信小程序頭像的時候估計都已經用過了,那就是利用border-radius:50%來將一個正方形變成圓,這是外圓實現的關鍵
  • 2019年會主持詞新穎 公司企業年會主持串詞開場白結束語
    2019年會主持詞該怎麼寫?年尾公司企業都會舉辦年會,年會上節目表演串詞主持稿模板範文。  尊敬的各位領導、  親愛的各位來賓、  各位朋友  大家晚上好!  (女)今晚我們--公司的全體同仁在這裡歡聚一堂,喜慶昨日的輝煌業績,展望  公司的美好未來!
  • 年會,年會,小公司的滑稽之舞
    慢慢的變成了所有公司的固定項目,現在公司只要超過五十人,必定會有年會。即使沒有年會表演,也會有固定的聚餐活動。很不幸的是,我們公司剛剛超過了年會需求的人數。所以年會也變成了我們公司年底的固定活動,出年會節目也成了我們公司員工頭疼項目。這簡直是跟休息日搞團建一樣,讓人深惡痛疾。
  • 年會來了,如何用Dynamo 幫HR 做一個抽獎器?/ 李呈偉
    快到農曆新年了,陸陸續續大家可能已經在安排年會活動。藉此機會介紹一個用Dynamo 做的抽獎器,也許可以在年會上應用一番以體現我們BIM行業的本色,現在介紹如下。先用dynamo的沙盒模式打開,也就是說不配套打開Revit,因此打開界面是沒有「Revit」節點庫的,如圖:前期做好整備工作將抽獎名單先輸入到Excel表格內,工作表的名稱為「Sheet1」,輸入完畢後保存,如圖:然後在dynamo工作空間編寫抽獎程序。