从 Excel 跳过空行构建 MS 项目

Built MS Project from Excel skipping empty rows

这个问题与任何应用程序无关,而是与寻找可行的算法有关。 我有一个用于将数据从 Excel 移动到 MS Project 的代码。我当前的解决方案一直有效,直到中间没有空行。

我的数据从第 19 行开始。所以 19 - 18 是第一个任务,20 - 18 是第二个任务,依此类推。但是,一旦中间有空行,就可以说:

Task 1 (row 19)
Task 2 (row 20)

Task 3 (row 22)

我的代码无法正常工作,因为 MS Project 中有任务 2,下一个应该是数字 3,但是 22 - 18 是 4。有人对此有什么好的解决方案吗?

代码如下:

    ' Move data to project
    For i = 19 To lRow
    
        strValue = WorksheetToOperate.Range("C" & i)
        strStartDate = WorksheetToOperate.Range("E" & i)
        strEndDate = WorksheetToOperate.Range("F" & i)
        Strresource = WorksheetToOperate.Range("J" & i)
        
        ' Import tasks
        If (WorksheetToOperate.Range("C" & i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("C" & i).Value)) Then
            newproj.Tasks.Add strValue
        End If
        
        ' Import start date
        If (WorksheetToOperate.Range("E" & i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("E" & i).Value)) Then
            newproj.Tasks(i - 18).Start = strStartDate
        End If
        
        ' Import end date
        If (WorksheetToOperate.Range("F" & i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("F" & i).Value)) Then
            newproj.Tasks(i - 18).Finish = strEndDate
        End If
        
        ' Import recources
        If Not ExistsInCollection(newproj.Resources, Strresource) Then _
        newproj.Resources.Add.Name = Strresource
        
        If (WorksheetToOperate.Range("J" & i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("J" & i).Value)) Then
            newproj.Tasks(i - 18).ResourceNames = Strresource
        End If
    
    Next i 

我已经设法让它与其他变量一起工作 m:

    Dim m
    m = 0

    ' Move data to project
    For i = 19 To lRow
        
        If IsEmpty(WorksheetToOperate.Range("C" & i).Value) Then
        
            m = m + 1
        
        Else
        
            strValue = WorksheetToOperate.Range("C" & i)
            strStartDate = WorksheetToOperate.Range("E" & i)
            strEndDate = WorksheetToOperate.Range("F" & i)
            Strresource = WorksheetToOperate.Range("J" & i)
        
            ' Import tasks
            If (WorksheetToOperate.Range("C" & i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("C" & i).Value)) Then
                newproj.Tasks.Add strValue
            End If
            
            ' Import start date
            If (WorksheetToOperate.Range("E" & i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("E" & i).Value)) Then
                newproj.Tasks(i - (18 + m)).Start = strStartDate
            End If
            
            ' Import end date
            If (WorksheetToOperate.Range("F" & i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("F" & i).Value)) Then
                newproj.Tasks(i - (18 + m)).Finish = strEndDate
            End If
            
            ' Import recources
            If Not ExistsInCollection(newproj.Resources, Strresource) Then _
            newproj.Resources.Add.Name = Strresource
            
            If (WorksheetToOperate.Range("J" & i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("J" & i).Value)) Then
                newproj.Tasks(i - (18 + m)).ResourceNames = Strresource
            End If
            
        End If
    
    Next i

通过使用 Task object 变量来跟踪刚刚添加的任务,大大简化了跳过空行的问题。此外,将 With 语句与 Worksheet 对象一起使用可进一步简化代码。

Sub CreateSchedule()

    Dim prj As MSProject.Application
    Set prj = CreateObject("MSProject.Application")
    prj.Visible = True
    
    Dim newProj As MSProject.Project
    Set newProj = prj.Projects.Add
    
    Dim i As Long
    Dim t As MSProject.Task
    
    For i = 19 To 28 'lRow
        With WorksheetToOperate
            If Not IsEmpty(.Range("C" & i)) Then
                Set t = newProj.Tasks.Add(CStr(.Range("C" & i)))
                t.Start = CDate(.Range("E" & i))
                t.Finish = CDate(Range("F" & i))
                t.ResourceNames = CStr(.Range("J" & i))
            End If
        End With
    Next i
    
End Sub