使用VBA

时间:2016-08-10 15:24:27

标签: excel-vba vba excel

我对VBA(或编程)编程相当新,请原谅我,如果我的问题有点愚蠢。

我遇到了尝试创建可以自动填写工作时间表的代码的问题。该计划应该能够接收任意数量的员工,并根据一年中所有52周内的星期一至星期五的重复时间表分配他们的姓名(时间表不包括假期,雇主本身将必须填写商业关闭)。

我要做的是确保没有人连续两天安排,而且每个人都安排了大量相等的天数。我的解决方案是相应地改变名称:

12345,23451,34512,45123,51234。

如果需要安排五个人,那将是这样的: Unshuffled

对此:

Shuffled

我已经尝试了一段时间,但无法使其发挥作用。问题是我不知道如何使用x个名称制作这样的计划。如果数字是常数,那将很容易,但我需要根据x名称自动创建计划。

我有一个想法是创建某种循环,在整个计划中输入数据,首先输入名称x次(其中x =放入要安排的人员列表中的名称总数),然后跳过x + 1:每次都是名字。

有五个人看起来像这样(在()中跳过的数字): 12345(1)23451(2)34512(3)45123(4)51234(5)(重复全年已填写)。

我必须这样做的原因是因为我们的一些部门中有5人,我想确保他们没有安排在每周的同一天完成同样的任务。

如果有人对此问题有解决方案或一些有用的输入,我将非常感激。

干杯!

1 个答案:

答案 0 :(得分:0)

这是一种能产生预期结果的算法:

Sub createDutyRoster(numOfEmployees As Integer, numOfWeeks As Integer)

    Dim dutyRosterWS As Excel.Worksheet
    Dim emplCount As Integer, i As Integer, n As Integer, tempEmplCount As Integer

    Set dutyRosterWS = ThisWorkbook.Sheets("Duty Roster")

    With dutyRosterWS

        ' insert headers
        .Cells(1, 1) = "Week/day"
        .Cells(1, 2) = "Monday"
        .Cells(1, 3) = "Tuesday"
        .Cells(1, 4) = "Wednesday"
        .Cells(1, 5) = "Thursday"
        .Cells(1, 6) = "Friday"

        For i = 1 To numOfWeeks

            ' weeks
            .Cells(i + 1, 1) = i

            ' employee count
            If emplCount < numOfEmployees Then
                emplCount = emplCount + 1
            ElseIf emplCount = numOfEmployees Then
                emplCount = 1
            End If
            tempEmplCount = emplCount

            ' insert for monday to friday
            For n = 2 To 6
                .Cells(i + 1, n) = tempEmplCount
                If tempEmplCount < numOfEmployees Then
                    tempEmplCount = tempEmplCount + 1
                ElseIf tempEmplCount = numOfEmployees Then
                    tempEmplCount = 1
                End If
            Next n

        Next i
    End With

End Sub

工作原理

  1. 添加一个名为“Duty Roster”的新工作表(或在代码中重命名)
  2. 使用以下参数调用子程序:a)雇员人数,b)给定年份的iso周数(某些年份有53个iso周而不是52个)。例如。 Call createDutyRoster(15, 52)
  3. 15名员工的示例

    enter image description here