Vba 将旋转循环到Excel单元格中

Vba 将旋转循环到Excel单元格中,vba,excel,loops,Vba,Excel,Loops,我有一个用户数据库(带有一个数字分配)和一个Excel项目列表,我正在成功地将它们放入两个数组中。一个是用户数组,另一个是Excel中的项目(任务)。我正在尝试思考表示此场景的逻辑: 数据库中的用户可以使用数字0-5存在。基本上,这表示一周中他们休息了多少天,并且有助于划分每个人可以获得的Excel范围内的项目数量,以便正确地按比例分配项目(在我使用布尔指示器指示包含或排除之前)。例如: User | Present # ------------------- Jared | 0 'p

我有一个用户数据库(带有一个数字分配)和一个Excel项目列表,我正在成功地将它们放入两个数组中。一个是用户数组,另一个是Excel中的项目(任务)。我正在尝试思考表示此场景的逻辑:

数据库中的用户可以使用数字0-5存在。基本上,这表示一周中他们休息了多少天,并且有助于划分每个人可以获得的Excel范围内的项目数量,以便正确地按比例分配项目(在我使用布尔指示器指示包含或排除之前)。例如:

User   |  Present #
-------------------
Jared  |  0 'present daily
John   |  0 'present daily
Mary   |  1 'off 1 day
Tom    |  5 'off rotation entirely
问题是:什么是最好的方式将其与他们应该得到的总体项目数量联系起来

我希望
Jared
John
得到最多,
Mary
少一点,
Tom
永远不会被包括在内。假设我有50件物品

我想到的一种方法是,在将名称循环到Excel中时,每次我从数组顶部开始算起时,将其作为“通过”(分配到Excel单元格中)

每次传递都不会跳过具有0的任何人 每过4次都会跳过一次1 每过三次都会跳过2分的任何人 每过2次都会跳过3分的任何人 每过一次都会跳过一个4 任何有5分的人都不包括在内(简单)

以我为例,
Jared
John
将始终被使用,
Mary
将每四次跳过一次,而
Tom
将永远不会被使用

这有意义吗?
捕捉每N次通过数组的循环的最佳方法是什么?

我这样做是否正确?

这并不完全有意义,因为您似乎每周都要分配任务,每天一项:

每次传递都不会跳过具有0的任何人

每过4次都会跳过一次1

每过三次都会跳过2分的任何人

每过2次都会跳过3分的任何人

每过一次都会跳过一个4

任何有5分的人都不包括在内(简单)

但是,假设上述情况,当用户的个人
任务分配sattested Mod(6-Present#)=0
时,您将跳过用户

也许你需要:

具有0的任何人都不会被跳过

每5次通过都会跳过一次1

每5次传球都会跳过2次

每过5次,任何人都会被跳过3次

每过5次,任何人都会被跳过4次

任何带5的人都会被跳过

假设上述情况,当用户的个人
5-Present#
小于其个人
taskassignmentsattentmod 5
时,您将跳过用户


使用这两种方法之一,您需要跟踪每个用户尝试分配(成功或失败)的次数以及实际分配。

为了避免大量循环以及由此可能导致的延迟,我建议计算“需求系数”。
根据可用性分配50个项目(示例中)。可用性显示为
0
每天呈现到
5
完全不轮换,但更容易用其他方式处理这些可用性:“不轮换”没有可用资源,因此
0
,“当前每天”有所有工作日(?)可用,因此
5

用户| Present#表将变成:

Jared 5 John 5 Mary 4 Tom 0 14 杰瑞德5 约翰5 玛丽4 汤姆0 14 因此,14个工作日可涵盖50个项目,平均每人每天3.57个项目。假设每人每天有3件物品且超过8件,则无法拆分该物品。通过将(修订的)表格值乘以INT(项目总数/表格总数),可以一次性分配“各3个”。因此,对于Jared和John,结果是5x3=15,对于Mary,结果是4x3=12


虽然只占42个,但还有8个尚未分配。3,3,2“额外”是显而易见的(结果是18,18,14),但编程并不是那么容易。我建议在INT公式中有任何剩余的地方,然后使用其结果+1(即这里是4而不是3)接受20,20,16,0(6太多)的初步结果,然后在每个用户中循环敲除1次(如果可能),直到敲除6次。

你能再解释一下你是如何做到的:“5>15,5>15,4>12”吗?我了解倒过来和除法。如果你只有5个数字,那么我会使用嵌套的
If
s或
Select Case
。然后使用计数器循环,当计数器达到任务量时重置或退出。
While
循环在这里是有效的。然后使用具有like(用户,循环#)的2D数组,并从循环#中减去每个过程。如果Loop#=0,则添加一个任务并将Loop#重置到用户号码中。@pnuts是否提供您的评论作为答案? Jared 5 John 5 Mary 4 Tom 0 14