У меня динамическая c группа задач, которые я получаю ежемесячно, я хочу распределить эти задачи по 6 группам, чтобы они могли распределяться равномерно. Каждое задание имеет ранжирование / приоритет, поэтому, если группа получает задание номер 1, я не хочу также давать этой же группе первые 100 приоритетов. Я хочу применить распределение по змее и зигзагам.
Это привело меня к использованию формулы =MIN(MOD(ROW()-2,12),MOD(-ROW()+1,12))
. Я получаю нужный дистрибутив, хотя на данном этапе я не знаю, как учесть какие-либо критерии, которые мне нужно добавить в мои логи c.
На изображении выше я пытаюсь взять группы в column F
и применить их к Column D
. Column E
показывает пример формулы =MOD()
, и я мог бы просто использовать поиск, чтобы заменить значения Mod 0-5 моими группами 1-6.
Место, где я столкнулся с дорожным заграждением, находится в строке 21 , где я хочу объяснить некоторые критерии или исключения. Я добавил двоичный файл column A
для визуализации, но, по сути, я хочу сказать, где столбец C (местоположение задачи) = Loc4
, чтобы никогда не назначать задачу для Group 4
. В случае, когда я не хочу, чтобы задача была назначена группе 4 в Lo c 4, я надеюсь пропустить Group 4
для одного назначения, пока оно не будет применено к следующей возможной ранжированной задаче. Простое решение состоит в том, чтобы удалить все эти вхождения в конце, но это действительно искажает равномерное распределение, к которому я иду.
Я пытался применить солвер к этому назначению, ища самое низкое стандартное отклонение, но я у меня слишком много точек данных.
Это привело меня к другому посту, использующему vba logi c, который мне действительно нравится, но я не могу понять, как изменить его, чтобы учесть некоторые исключения. введите описание ссылки здесь
В идеале я хотел бы использовать эту концепцию создания единого массива моих групп, применяя каждую группу к задаче, если критерии удовлетворяются в этом коротком списке задачи, записать группы в список, выполнить сброс и перейти к следующему подмножеству задач. Таким образом, каждый раз, когда я выбираю следующие 6 задач, они назначаются одной из моих 6 групп, которая будет сохранять тот дистрибутив, на который я надеюсь.
Вот код от пользователя K.Davis пост, который я пытался применить:
Sub assignEmployeeTasks()
Dim ws As Worksheet, i As Long
Set ws = ThisWorkbook.Worksheets(1)
Dim employeeList() As Variant
With ws
For i = 2 To lastRow(ws, 2)
If (Not employeeList) = -1 Then
'rebuild employeelist / array uninitialized
employeeList = buildOneDimArr(ws, "F", 2, lastRow(ws, "F"))
End If
.Cells(i, 4) = randomEmployee(employeeList)
Next
End With
End Sub
Это «вспомогательные» функции, которые позволяют вашей программе чтобы сделать свою работу:
Function randomEmployee(ByRef employeeList As Variant) As String
'Random # that will determine the employee chosen
Dim Lotto As Long
Lotto = randomNumber(LBound(employeeList), UBound(employeeList))
randomEmployee = employeeList(Lotto)
'Remove the employee from the original array before returning it to the sub
Dim retArr() As Variant, i&, x&, numRem&
numRem = UBound(employeeList) - 1
If numRem = -1 Then 'array is empty
Erase employeeList
Exit Function
End If
ReDim retArr(numRem)
For i = 0 To UBound(employeeList)
If i <> Lotto Then
retArr(x) = employeeList(i)
x = x + 1
End If
Next i
Erase employeeList
employeeList = retArr
End Function
' This will take your column of employees and place them in a 1-D array
Function buildOneDimArr(ByVal ws As Worksheet, ByVal Col As Variant, _
ByVal rowStart As Long, ByVal rowEnd As Long) As Variant()
Dim numElements As Long, i As Long, x As Long, retArr()
numElements = rowEnd - rowStart
ReDim retArr(numElements)
For i = rowStart To rowEnd
retArr(x) = ws.Cells(i, Col)
x = x + 1
Next i
buildOneDimArr = retArr
End Function
' This outputs a random number so you can randomly assign your employee
Function randomNumber(ByVal lngMin&, ByVal lngMax&) As Long
'Courtesy of https://stackoverflow.com/a/22628599/5781745
Randomize
randomNumber = Int((lngMax - lngMin + 1) * Rnd + lngMin)
End Function
' This gets the last row of any column you specify in the arguments
Function lastRow(ws As Worksheet, Col As Variant) As Long
lastRow = ws.Cells(ws.Rows.Count, Col).End(xlUp).Row
End Function
Любая помощь будет высоко ценится! Я нахожусь на любом пути, который приближается к моему желаемому решению, формулам или VBA. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.
Спасибо!