新北 - 第一行是日期,第二行是天数,第三行是周数。
我的数据如下所示。这是一份每周休假登记册,其中我需要在一周日期范围内为每个员工在仅 2 个单元格中随机添加单词“WO”,依此类推,直到一个月内的每个周日期范围。空白区域是我需要此功能的地方。
Sub Rando()
Lr = Cells(Rows.Count, 2).End(xlUp).Row
Lc = Cells(8, Columns.Count).End(xlToLeft).Column
For j = 8 To Lc
For i = 9 To Lr
Randomize
ActiveSheet.Cells(i, j).Value = "Wo"
Next i
Next j
End Sub
答案1
我甚至不需要 VBA 来实现这一点。您可以让 Excel 为每个人每周生成一个随机数。该数字必须提供唯一的映射,例如 0 表示 {星期一,星期二},1 表示 {星期一,星期三},...,6 表示 {星期一,星期六},7 表示 {星期二,星期一},8 表示 {星期二,星期三}(因为同一天不可能出现两次),等等。
如果您必须从七天中挑选两天,无论顺序如何,您总共将有 7P2(排列)= 42 个选项。从技术上讲,{星期一,星期二} 与 {星期二,星期一} 相同,因此应该是 7C2(组合)= 21 个选项,但为了轻松地在随机数 0..41 和其匹配的两天之间进行转换(使用 mod 和 div 函数),使用排列会更容易。如果我们将数字 1..7 分配给一周中的几天,则完整的映射如下所示:
您可以在上表中使用 VLOOKUP 返回随机日期,例如
=VLOOKUP(RANDBETWEEN(0,41), A2:C43, {2,3}, FALSE) ...CTRL+SHIFT+ENTER for array formula in version prior to Excel 365
或者使用以下三个公式,分别在单元格 A2、B2 和 C2 中:
=RANDBETWEEN(0,41)
=INT((A2)/6)+1
=IF((MOD(A2,6)+1)<B2,MOD(A2,6)+1,MOD(A2,6)+2)
要确定是否应该在当天写“WO”,请在单元格 E2 中使用如下内容(并复制粘贴 F2 到 K2):
=IF(OR(COLUMN(A$1)=$B2, COLUMN(A$1)=$C2),"WO","")
PS. 如果您不希望两个 WO 位于连续的日期或说 {星期一,星期五},查找表可能最有效。只需删除不需要的对并相应地减少最大 RANDBETWEEN 数即可。