Automate Schedule Assignment

jjtok7

New Member
Joined
Jun 3, 2022
Messages
2
Office Version
  1. 365
  2. 2021
Platform
  1. Windows
Trying to figure out a way to automate the process of assigning schedule to participants. The participant selects all the schedule they are interested/wiling to work. Then I assign schedules based off of rank (high-low). Each participant can be assigned one schedule and each schedule can be assigned once. Let me know if this is possible

AssignedSchdeules_Temp.xlsx
ABCDEFGHIJKLM
1NamesRankAssigned ScheudleSchedule Interest 1Schedule Interest 2Schedule Interest 3Schedule Interest 4Schedule Interest 5Schedule Interest 6Schedule Interest 7Schedule Interest 8Schedule Interest 9Schedule Interest 10
2Person 191Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
3Person 162Schedule 1 Schedule 2 Schedule 4 Schedule 3 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
4Person 333Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
5Person 354Schedule 18 Schedule 26
6Person 25Schedule 1 Schedule 2 Schedule 18 Schedule 3
7Person 266Schedule 13 Schedule 14 Schedule 18 Schedule 26
8Person 317Schedule 18 Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9
9Person 348Schedule 18 Schedule 1
10Person 139Schedule 13 Schedule 14
11Person 1410Schedule 1 Schedule 14
12Person 711Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
13Person 1514Schedule 13 Schedule 15 Schedule 26 Schedule 11
14Person 2019Schedule 13 Schedule 14 Schedule 15 Schedule 16 Schedule 18 Schedule 19 Schedule 20 Schedule 21 Schedule 26 Schedule 12
15Person 1822Schedule 18
16Person 123Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
17Person 627Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
18Person 2828Schedule 19 Schedule 20 Schedule 21 Schedule 22 Schedule 23 Schedule 24 Schedule 27 Schedule 28 Schedule 29 Schedule 30
19Person 4133Schedule 11 Schedule 10 Schedule 9 Schedule 8 Schedule 7 Schedule 6 Schedule 5 Schedule 4 Schedule 3 Schedule 2
20Person 434Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
21Person 535Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
22Person 937Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
23Person 3738Schedule 18 Schedule 26 Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8
24Person 1140Schedule 11 Schedule 10 Schedule 13
25Person 3241Schedule 18 Schedule 39 Schedule 40 Schedule 41 Schedule 42
26Person 842Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
27Person 4044Schedule 18 Schedule 26
28Person 2446Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
29Person 2348Schedule 1 Schedule 12 Schedule 11 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8
30Person 2751Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
31Person 2958Schedule 12 Schedule 25 Schedule 31
32Person 2559Schedule 25 Schedule 24 Schedule 23 Schedule 22 Schedule 21 Schedule 20 Schedule 19 Schedule 18 Schedule 17 Schedule 16
33Person 3060Schedule 37 Schedule 36 Schedule 38 Schedule 34 Schedule 35 Schedule 32 Schedule 33
34Person 3961Schedule 4 Schedule 11 Schedule 13
35Person 1262Schedule 3 Schedule 4 Schedule 2 Schedule 1 Schedule 5 Schedule 12 Schedule 11 Schedule 7 Schedule 6 Schedule 8
36Person 1063Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
37Person 3664Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
38Person 1767Schedule 13 Schedule 14 Schedule 15 Schedule 16 Schedule 17 Schedule 18 Schedule 19 Schedule 20 Schedule 21 Schedule 26
39Person 3868Schedule 1 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6 Schedule 7 Schedule 8 Schedule 9 Schedule 10
40Person 2272Schedule 1 Schedule 11 Schedule 12 Schedule 13 Schedule 15 Schedule 19 Schedule 22
41Person 377Schedule 1 Schedule 2 Schedule 3
42Person 2112Schedule 1 Schedule 12 Schedule 14 Schedule 18 Schedule 26 Schedule 2 Schedule 3 Schedule 4 Schedule 5 Schedule 6
Sheet1
Cells with Conditional Formatting
CellConditionCell FormatStop If True
C2:C42Cell ValueduplicatestextNO
C2:C42Cell ValueduplicatestextNO
A2:A42Cell ValueduplicatestextNO
D33:M33Cell ValueduplicatestextNO
 

Excel Facts

Round to nearest half hour?
Use =MROUND(A2,"0:30") to round to nearest half hour. Use =CEILING(A2,"0:30") to round to next half hour.
How do you want this ?
1. Start with the person with the lowest rank and go from left to right until he/she has a schedule and then go down
or
2. start also with the person of the lowest rank and go from top to bottom so try to give everybody his first choise and the next column, etc
???

method 2
jjtok7
VBA Code:
Sub Scheduling()
     Set dict = CreateObject("scripting.dictionary")
     dict.comparemode = vbTextCompare

     Set lo = Sheets("Blad1").ListObjects(1)     'that table
     lo.ListColumns(3).DataBodyRange.ClearContents     'clear the assigned schedule column
     arr = lo.DataBodyRange.Value     'data >>> array
     col1 = lo.DataBodyRange.Columns(1) 'column1 = persons
     arr1 = Application.Sort(arr, 2)     'sort on the rank (2nd column)

     For j = 4 To UBound(arr, 2)     'loop through the interests
          For i = 1 To UBound(arr)     'loop throught the persons
               If Len(arr1(i, 3)) = 0 Then     'person doesn't have an assignment yet
                    If Not dict.exists(arr1(i, j)) Then     'schedule isn't assigned neither
                         arr1(i, 3) = arr1(i, j)
                         dict(arr1(i, j)) = vbEmpty
                         r = Application.Match(arr1(i, 1), col1, 0)     'original line number
                         If IsNumeric(r) Then arr(r, 3) = arr1(i, j)
                    End If
               End If
          Next
     Next

     lo.ListColumns(3).DataBodyRange.Value = Application.Index(arr, 0, 3)
     
     
     lo.Range.Offset(10 + lo.ListRows.Count).Resize(UBound(arr1), UBound(arr1, 2)).Value = arr1

End Sub
 
Last edited:
Upvote 0
Solution
How do you want this ?
1. Start with the person with the lowest rank and go from left to right until he/she has a schedule and then go down
or
2. start also with the person of the lowest rank and go from top to bottom so try to give everybody his first choise and the next column, etc
???

method 2
jjtok7
VBA Code:
Sub Scheduling()
     Set dict = CreateObject("scripting.dictionary")
     dict.comparemode = vbTextCompare

     Set lo = Sheets("Blad1").ListObjects(1)     'that table
     lo.ListColumns(3).DataBodyRange.ClearContents     'clear the assigned schedule column
     arr = lo.DataBodyRange.Value     'data >>> array
     col1 = lo.DataBodyRange.Columns(1) 'column1 = persons
     arr1 = Application.Sort(arr, 2)     'sort on the rank (2nd column)

     For j = 4 To UBound(arr, 2)     'loop through the interests
          For i = 1 To UBound(arr)     'loop throught the persons
               If Len(arr1(i, 3)) = 0 Then     'person doesn't have an assignment yet
                    If Not dict.exists(arr1(i, j)) Then     'schedule isn't assigned neither
                         arr1(i, 3) = arr1(i, j)
                         dict(arr1(i, j)) = vbEmpty
                         r = Application.Match(arr1(i, 1), col1, 0)     'original line number
                         If IsNumeric(r) Then arr(r, 3) = arr1(i, j)
                    End If
               End If
          Next
     Next

     lo.ListColumns(3).DataBodyRange.Value = Application.Index(arr, 0, 3)
    
    
     lo.Range.Offset(10 + lo.ListRows.Count).Resize(UBound(arr1), UBound(arr1, 2)).Value = arr1

End Sub
Thanks for the reply!
I definitely like this method but I think method 1 is more of what I'm looking for. I would like to make sure people with the lowest rankings (1,2,3,...) get assigned a schedule first.
 
Upvote 0
that was an easy one, just swap the 2 For's !
jjtok7
You noticed perhaps that the copy further down is a sorted copy on the 2nd column (rank)
 
Upvote 0

Forum statistics

Threads
1,214,833
Messages
6,121,858
Members
449,052
Latest member
Fuddy_Duddy

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top