如何在MS Project宏中按优先级排序工作分配?求可行方案
按优先级排序任务/工作分配的可行实现方案
原代码无效原因
你写的代码是遍历资源的Assignments集合进行内存排序,但这个操作不会同步到项目视图的显示,只是修改了内存中集合的顺序,关闭项目后就会丢失,也无法在界面上看到排序效果。
两种场景的实现方案
1. 对整个项目的任务按优先级排序
直接针对项目的任务集合排序,会同步到视图显示:
Sub SortTasksByPriority() ' 按任务优先级降序排序,优先级相同则按任务名称升序 ActiveProject.Tasks.Sort _ FieldID:=pjTaskPriority, SortOrder:=pjDescending, _ Key2:=pjTaskName, SortOrder2:=pjAscending End Sub
如果需要在特定视图生效(比如甘特图),可以先切换视图再执行排序:
Sub SortTasksInGanttByPriority() ActiveProject.Views("甘特图").Apply ActiveProject.Tasks.Sort _ FieldID:=pjTaskPriority, SortOrder:=pjDescending, _ Key2:=pjTaskName, SortOrder2:=pjAscending End Sub
2. 在资源视图中按任务优先级排序工作分配
如果要在「资源使用状况」这类视图中,让每个资源的工作分配按关联任务的优先级排序,直接修改视图的排序规则:
Sub SortResourceAssignmentsByPriority() ' 切换到资源使用状况视图 ViewApply Name:="资源使用状况" ' 排序规则:先按资源名称升序,再按任务优先级降序,最后按任务名称升序 Sort _ Key1:="资源名称", Order1:=pjAscending, _ Key2:="任务优先级", Order2:=pjDescending, _ Key3:="任务名称", Order3:=pjAscending, _ Reset:=True End Sub
Reset:=True会清除之前的排序规则,确保新规则生效。
快速获取单个资源的最高优先级任务
如果不需要排序,只是要找某个资源的最高优先级任务,直接遍历对比更高效:
Function GetHighestPriorityTaskForResource(res As Resource) As Task Dim highestPriority As Integer Dim targetTask As Task highestPriority = 0 For Each assign In res.Assignments If assign.Task.Priority > highestPriority Then highestPriority = assign.Task.Priority Set targetTask = assign.Task End If Next assign Set GetHighestPriorityTaskForResource = targetTask End Function
调用示例:
Sub TestGetTopTask() Dim res As Resource Dim topTask As Task Set res = ActiveProject.Resources("你的资源名称") Set topTask = GetHighestPriorityTaskForResource(res) If Not topTask Is Nothing Then MsgBox "最高优先级任务:" & topTask.Name & ",优先级:" & topTask.Priority End If End Sub
内容的提问来源于stack exchange,提问作者the_yaz2000
相关产品推荐
相关产品推荐

