「今天吃中式還是日式?」想好分類,還是選不出餐廳。我會先把附近的店整理成清單,讓試算表挑一間;不挑分類時,就從全部餐廳裡抽。
這篇改寫自方格子午餐抽選器。舊版把每種料理放一欄,新增分類還要改長串公式;新版改成兩欄資料,增加餐廳就是增加一列。這裡用合成店名練習,不涉及實際營業或外送資訊。
一列放一個分類與餐廳
開一張空白工作表,把資料貼到 A1。第 7 列沒有餐廳、第 8 列沒有分類;最後一列也留空。這些列都不參加抽選。
分類 餐廳
中式 阿春便當
日式 小森食堂
素食 青葉蔬食
中式 阿春便當
中式 巷口麵店
日式
沒有分類店
素食 青葉蔬食阿春便當與青葉蔬食故意各放兩次。這次規則是「同名餐廳算一個選項」,所以先去重再抽。若要區分不同分店,名稱就寫成「阿春便當・站前店」等完整識別,不能只靠相同店名。去重以前也要確認多餘空白、全半形或不同寫法;這個抽選器不負責把所有看似同名的店自動合併,可先參考 文字清理。
先保留幾個位置:E2 選料理、F2 放重抽核取方塊、E4 顯示結果;H2:H10 是分類選項、J2:J10 是當下可抽的餐廳。
分類清單自動加上「全部」
在 H1 寫「分類選項」,H2 放這條,先清空下面的 H3:H10:
只列出有分類也有餐廳的類別,去重後在最上面加全部
=IF(
COUNTIFS(A2:A10, "<>", B2:B10, "<>")=0,
"全部",
VSTACK(
"全部",
UNIQUE(FILTER(A2:A10, A2:A10<>"", B2:B10<>""))
)
)依這份資料,清單應是「全部、中式、日式、素食」,保留分類首次出現的順序。這裡的「全部」是保留選項,資料分類不要也叫「全部」。COUNTIFS 先數分類、餐廳皆非空的列;全空時直接回一格「全部」,有有效資料才堆疊分類。不要只在 VSTACK 外包 IFERROR:錯誤可能是陣列裡的一格,會被換成第二個「全部」。
選取 E2,到「資料」的資料驗證新增規則,選範圍來源的下拉式選單,來源填 H2:H10,無效資料選拒絕輸入,完成後選「全部」。選單設定可搭配 下拉選單入門 操作。
先看候選餐廳,再抽其中一間
在 J1 寫「候選餐廳」,J2 貼這條,J3:J10 先留空:
分類符合或選全部,排除不完整列,再按餐廳去重
=IFERROR(
UNIQUE(
FILTER(
B2:B10,
A2:A10<>"",
B2:B10<>"",
((E2="全部")+(A2:A10=E2))>0
)
),
""
)條件裡的加號把「選全部」與「分類相同」合成任一成立即可。先 FILTER 篩出符合列,再 UNIQUE 去重。選「全部」應得到阿春便當、小森食堂、青葉蔬食、巷口麵店四間;選「日式」只剩小森食堂,空餐廳那列不會混進來。
接著在 F1 寫「重抽」,選取 F2,用「插入」加入核取方塊,保留預設 TRUE/FALSE。E4 貼上:
候選為空先顯示提示,否則從去重後的餐廳抽一間
=IF(
COUNTIF(J2:J10, "?*")=0,
"沒有符合餐廳",
INDEX(
J2:J10,
RANDBETWEEN(1, COUNTIF(J2:J10, "?*"))+IF(F2, 0, 0)
)
)COUNTIF 的 ?* 數至少有一個字元的餐廳名稱;沒有選項時,不會把隨機數上限設成 0。候選是從 J2 開始連續排的,所以 INDEX 可以用 1 到候選數量挑一格。
選日式後只會抽到小森食堂;切回全部並連續切換核取方塊,結果都會落在四個候選裡。
IF(F2,0,0) 讓公式引用核取方塊,勾選與取消都加 0,不改變抽選範圍。抽中的餐廳可以和上次相同,不能把「這次沒換店」當成沒有重新計算。
核取方塊沒有把結果鎖住
RANDBETWEEN 是會重新計算的隨機函式。切換核取方塊是方便的重抽入口,其他儲存格編輯或試算表的重新計算也可能讓結果改變;這不是只有按鈕能更新的抽籤系統。重新載入工作表後,分類仍是全部、核取仍是未勾選,餐廳卻可能變成另一間;控制狀態保存和隨機結果固定是不同的事。若在「檔案 > 設定 > 計算」改成手動計算,核取方塊與其他編輯都不會觸發重算,要按「計算」才會重抽。
選完店要分享給同事時,把 E4 複製後在另一格「僅貼上值」,再註明日期與選的分類。不要只丟一張仍含隨機公式的連結,期待對方看到同一家。
去重後每個候選各占一格,是本篇的抽選單位。這裡沒有做統計檢定,也沒有實作加權、不重複輪流或營業時間排除。隨機函式基礎見 亂數與序列;一次產生多格、允許重複姓名的案例可看 MAKEARRAY 抽樣。
空白、重複與新增分類怎麼檢查?
| 操作 | 應檢查的結果 |
|---|---|
| 選全部 | 四間不同餐廳,不含沒有分類店 |
| 選日式 | 候選與結果都只有小森食堂 |
| 選素食 | 重複的青葉蔬食只占一個候選 |
| 有效資料全部清空 | 分類保留全部;結果顯示沒有符合餐廳 |
| 選單仍留著已刪除的分類 | 候選空白;結果顯示沒有符合餐廳,重新選有效分類 |
| 在輸出清單下方放文字 | 可能擋住陣列展開,先清空再檢查公式 |
公式只讀到第 10 列。要擴大清單時,分類公式、候選公式內的 A2:A10、B2:B10 範圍須一起改;若候選超過九間,也要擴大抽選公式的 J 範圍與預留空間。分類下拉的來源範圍同樣要能容納新增選項。
加一種料理,不新增公式分支
把 A10:B10 改成「泰式、微笑咖哩」。需要多寫一個 IF 分支嗎?選泰式後應抽到誰?
我是喜特先生,Mr. Sheet,我們下個教學見!
接下來可以
相關文章
查看所有文章亂數與序列函式:RAND、RANDBETWEEN、RANDARRAY、SEQUENCE
RAND、RANDBETWEEN、RANDARRAY 產生亂數,SEQUENCE 產生等差數列。附語法、抽籤與洗牌的例子,以及亂數每次重算都會變、要用貼上值固定的做法。
資料驗證入門:下拉式選單、數字範圍、核取方塊怎麼設
從「資料」>「資料驗證」開始,一步一步設定下拉式選單(手動輸入選項)、數字介於某個範圍、核取方塊,說明拒絕輸入與顯示警告的差別,以及規則管不到舊資料與貼上的內容。介面字樣對照 Google 說明中心。
FILTER 入門:用一個條件篩出你要的資料
FILTER 的語法、單一條件怎麼寫、兩個條件的 AND 與 OR,以及沒有符合資料時的 #N/A。原始資料不動,結果放在別處。
留言討論
共 0 則留言
