2012-07-18 104 views
1

我需要翻譯一個在AS/400上工作的舊程序,該程序正在挑選隨機學生爲我的城市工作。只要它有效,我可以使用任何程序。爲了簡單和快速,我選擇了excel。沒有重複和不固定數據的隨機Excel函數

不過,我過來了一個小問題。我不需要重複,因爲同一個學生在一個夏天不能做2份工作。另外,我需要靈活一些,因爲每年都會增加新學生,有些會被刪除。

此功能幾乎一樣多,因爲我想要的: = INDEX($ A:$ A,RANDBETWEEN(1,COUNTA($ A:$ A)),1)

指數$ A:$ A獲得列A中的所有行。因此,即使我添加了20個名稱,也會考慮到它們。然後,它隨機選擇第1行和$ A列中的總行數(COUNTA)之間的值(名稱)。這種方法的問題是它允許重複。

我發現的另一個功能是創建一個滿= ALEA()的柱子,然後按數字對這些柱子進行排序。這不是很漂亮,但至少,沒有重複。的問題來自我的公式,即是靜態的,並且我不能使柔性:

= INDEX($ A $ 2:$ A $ 74 RANK(B2,$ B $ 2:$ B $ 74))

我的名字在colum $ A和我的隨機值colum $ B中。我說的是,排列B2中的值(然後B3,然後B4等),在列B中找到。

我想將COUNTA集成到第二個函數中,並且(如果POSSIBLE)採取RANDBETWEEN而不是排名功能,以便我沒有醜陋的數字。

我打開使用某種重複檢查的第一個功能。只要祕書不必進行大量的操縱,它應該沒問題。

非常感謝您的幫助XOX

回答

1

我創建的東西在VBA是做什麼,我想你想要的。現在請記住,我對VBA非常新,所以它可能不是最漂亮的東西。需要明確的是,我在A列10名從行1到10,然後簡單地跑了這個子程序,它產生在列獨特的名單F.這裏是我的代碼:

Sub getRandom() 
    Do While Application.WorksheetFunction.CountA(Range("A:A")) > 0 
     Dim count As Integer 
     count = Application.WorksheetFunction.CountA(Range("A:A")) 
     Dim name As String 
     name = Application.WorksheetFunction.Index(Range("A:A"), Application.WorksheetFunction.RandBetween(1, count)) 
     Dim row As Integer 
     row = Application.WorksheetFunction.Match(name, Range("A:A"), 0) 
     Range("F11").Select 
     Selection = name 
     Rows(row).EntireRow.Delete 
    Loop 
End Sub 

如果你想獲得一次只有一個名字,只是刪除循環。它的工作原理與您使用INDEX和RANDBETWEEN函數完全相同,使用該生成的數字獲取列A中的名稱,然後完全刪除該行,因此不會生成唯一的名稱。

我特意選擇了F列和F11單元格,因爲這些單元格在刪除行時不會受到影響。

我希望這會有所幫助,如果它不是你正在尋找的東西,我會看看我是否可以加強它。

+0

非常感謝您的幫助傑克,這工作像一個魅力。只是一個小問題: count =列A中的名稱數量。 name = A列中選擇的隨機名稱。 row =這是幹什麼用的? 範圍(「F11」)是指定你想要的10個名字 行刪除就是刪除該行沒有重複 現在,我明白2個隨機索引可能會出現相同的名稱,但如果該名稱被刪除會發生什麼?它只是退出循環?另外,你有沒有想法只刪除那些實際挑選的方法?就好像我想知道誰沒有被挑選出來一樣,我可以不用手工做呢? – Maude 2012-07-19 16:39:26

+0

它是如何工作的,它會刪除在每次迭代中被選中的人,所以仍然在列表中的人還沒有被選中。正如我在我的帖子中所說的,如果你想一次獲得一個名字,只需刪除循環。至於行變量,即用於標識要刪除的行號。 – jrad 2012-07-19 16:45:15

+0

問題是假設我有16個名字,我選擇了F14,它刪除了整列A,即使在我的F列中沒有名字。 爲了證明這一點,我在列A中寫了Maude1到Maude20的名字。然後我運行了你的函數。結果,我按隨機順序得到了14個名字,但是整個A列不見了,包括沒有被選中的那個。 – Maude 2012-07-19 19:47:32

0

有可用於VBA(谷歌Excel中隨機唯一的)其中一個最好的是CPearson.Com包括(其中包括)這樣的例子很多:

隨機元從一系列工作表單元
您還可以創建一個函數,該函數以隨機順序返回一定數量的元素,並且不會從一系列工作表單元格中重複出現。下面的功能就是這樣做的。您可以使用如下公式調用數組公式:
= RandsFromRange(A1:A10,5)
其中A1:A10是要從中提取值的元素列表,5是要返回的值的數量。在指定要返回的單元格內輸入公式,然後按CTRL SHIFT ENTER而不是ENTER鍵。

如果你不想使用VBA那麼則可以用幾個簡單的步驟來完成:

  1. 插入一列旁邊的學生姓名,用公式=RAND()
  2. 排序只要你想弗洛姆列表
  3. 每一次在你的排序,你得到一個新的隨機排序的最前面和隨機數的上的數字
  4. 的列表中選擇儘可能多的學生
+0

我提供的網站存在的問題是它是靜態的。由於公式是:= RandsFromRange(A1:A10,5),每當我添加一個名稱時,我將不得不手動更改範圍。 你的第二個答案似乎是要走的路,儘管它需要祕書將= rand()複製到她可能添加的新行中。 – Maude 2012-07-19 15:42:25

+0

我重讀了你的解決方案,我看到的另一個問題是,例如,如果我想要20個學生的名字,然後有人告訴我可以再添加10個,我可能會在第二次繪製中找到與第一次相同的學生。現在這對20歲來說不是問題,但是當有100多名學生時,很難知道它是否被挑選出來。 – Maude 2012-07-19 16:41:53