Назначить человека на определенный процент строк - PullRequest
1 голос
/ 06 марта 2019

В настоящее время я создаю инструмент распространения, чтобы распределять людей по задачам на основе определенного процента для каждого человека. Ниже приведены примерные данные для уполномоченного и их соответствующий процент распределения, которые можно найти в моем «Основном листе». Цессионарий может расти до тех пор, пока общая сумма распределения составит 100%.

 |---------------------|--------------------------------|
 |      Assignee       |     Distribution Percentage    |
 |---------------------|--------------------------------|
 |          Person1    |         25                     |
 |---------------------|--------------------------------|
 |          Person2    |         30                     |
 |---------------------|--------------------------------|
 |          Person2    |         45                     |
 |---------------------|--------------------------------|

На другом листе под названием «Новый» у меня есть список задач, которые нужно назначить человеку в соответствии с его определенным процентом. И иногда уже есть назначенный человек, в этом случае, чтобы пропустить назначение этой задачи.

Ниже также показан список задач и ожидаемый результат (назначенное лицо) на основе определенного процента для распределения. Задачи также могут расти:

|---------------------|--------------------------------|
|      Assignee       |           Tasks                |
|---------------------|--------------------------------|
|          Person1    |         Task 1                 |
|---------------------|--------------------------------|
|          Person1    |         Task 2                 |
|---------------------|--------------------------------|
|          Person1    |         Task 3                 |
|---------------------|--------------------------------|
|          Person1    |         Task 4                 |
|---------------------|--------------------------------|
|          Person2    |         Task 5                 |
|---------------------|--------------------------------|
|          Person2    |         Task 6                 |
|---------------------|--------------------------------|
|          Person2    |         Task 7                 |
|---------------------|--------------------------------|
|          Person2    |         Task 8                 |
|---------------------|--------------------------------|
|          Person3    |         Task 9                 |
|---------------------|--------------------------------|
|          Person3    |         Task 10                |
|---------------------|--------------------------------|
|          Person3    |         Task 11                |
|---------------------|--------------------------------|
|          Person3    |         Task 12                |
|---------------------|--------------------------------|
|          Person3    |         Task 13                |
|---------------------|--------------------------------|
|          Person3    |         Task 14                |
|---------------------|--------------------------------|
|          Person3    |         Task 15                |
|---------------------|--------------------------------|

В данном случае ниже приведены распределения:

Персона1 - 4 задачи (25%)

Персона2 - 4 задачи (30%)

Персона3 - 7 задач (45%)

Ниже рабочий код, который у меня есть. Тем не менее, это не соответствует выводу, который мне нужен. И я застреваю на том, как поступить:

Sub AssignPercentage()

Dim PersonFirstRow As Integer
Dim PersonLastRow As Long
Dim PersonRow As Long


Set mainSheet = Sheets("Main")
Set TodaySheet = Sheets("New")

Dim LastRow As Long, LastColumn As Long

Dim StartCell As Range, rng As Range
Dim x As Long
Dim cl As Range

Dim Percentage As Long, i As Long
Dim PersonPercent As Long
Set StartCell = TodaySheet.Range("B2")

PersonFirstRow = 10 'row of F12

PersonLastRow = mainSheet.Cells(mainSheet.Rows.Count, "E").End(xlUp).Row

LastRow = TodaySheet.Cells(TodaySheet.Rows.Count, StartCell.Column).End(xlUp).Row
LastColumn = TodaySheet.Cells(StartCell.Row, TodaySheet.Columns.Count).End(xlToLeft).Column

Set rng = TodaySheet.Range(StartCell, TodaySheet.Cells(LastRow, 2))


For x = PersonFirstRow To PersonLastRow

PersonPercent = mainSheet.Cells(x, "F").Value


Percentage = Round(rng.Rows.Count * PersonPercent / 100, 0)

    For Each cl In rng

        i = i + 1
        If i > Percentage Then
        i = 0
        Exit For

        End If


        If Trim(cl.Offset(0, -1).Value) = "" Then

            cl.Offset(0, -1).Value = mainSheet.Cells(x, "E").Value

        End If

    Next cl

Next x

End Sub

Ниже приведен код, приведенный выше, что неверно:

|---------------------|--------------------------------|
|      Assignee       |           Tasks                |
|---------------------|--------------------------------|
|          Person1    |         Task 1                 |
|---------------------|--------------------------------|
|          Person1    |         Task 2                 |
|---------------------|--------------------------------|
|          Person1    |         Task 3                 |
|---------------------|--------------------------------|
|          Person1    |         Task 4                 |
|---------------------|--------------------------------|
|          Person3    |         Task 5                 |
|---------------------|--------------------------------|
|          Person3    |         Task 6                 |
|---------------------|--------------------------------|
|          Person3    |         Task 7                 |
|---------------------|--------------------------------|
|                     |         Task 8                 |
|---------------------|--------------------------------|
|                     |         Task 9                 |
|---------------------|--------------------------------|
|                     |         Task 10                |
|---------------------|--------------------------------|
|                     |         Task 11                |
|---------------------|--------------------------------|
|                     |         Task 12                |
|---------------------|--------------------------------|
|                     |         Task 13                |
|---------------------|--------------------------------|
|                     |         Task 14                |
|---------------------|--------------------------------|
|                     |         Task 15                |
|---------------------|--------------------------------|

1 Ответ

0 голосов
/ 06 марта 2019

Если вы переключитесь на циклическое выполнение назначений задач и проверку того, было ли назначено достаточно задач, возможно, будет проще заставить его работать. Код ниже делает эту работу за меня.


Dim PersonFirstRow As Integer
Dim PersonLastRow As Long
Dim PersonRow As Long


Set mainsheet = Sheets("Main")
Set todaysheet = Sheets("New")

Dim LastRow As Long, LastColumn As Long

Dim StartCell As Range, rng As Range

Dim Percentage As Long, i As Long
Dim PersonPercent As Long
Dim TaskRow, AssignedTasks As Long
Set StartCell = todaysheet.Range("B2")

PersonFirstRow = 10 'row of F12

PersonLastRow = mainsheet.Cells(mainsheet.Rows.Count, "E").End(xlUp).Row

LastRow = todaysheet.Cells(todaysheet.Rows.Count, StartCell.Column).End(xlUp).Row
LastColumn = todaysheet.Cells(StartCell.Row, todaysheet.Columns.Count).End(xlToLeft).Column

Set rng = todaysheet.Range(StartCell, todaysheet.Cells(LastRow, 2))


For TaskRow = 2 To LastRow

    For PersonRow = 10 To PersonLastRow
        PersonPercent = mainsheet.Cells(PersonRow, "F").Value
        Percentage = Round(rng.Rows.Count * PersonPercent / 100, 0)
        AssignedTasks = Application.WorksheetFunction.CountIf(rng.Offset(0, -1), mainsheet.Cells(PersonRow, 5).Value)

        If AssignedTasks + 1 <= Percentage Then
            If Trim(todaysheet.Cells(TaskRow, 1).Value) = "" Then
                todaysheet.Cells(TaskRow, 1).Value = mainsheet.Cells(PersonRow, "E").Value
            End If
        End If

    Next PersonRow

Next TaskRow

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...