Встроенный MS Project из Excel, пропускающий пустые строки

#excel #vba #ms-project

#excel #vba #ms-project

Вопрос:

Этот вопрос касается не столько какого-либо приложения, сколько поиска алгоритма, который будет работать. У меня есть код для перемещения данных из 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" amp; i)
        strStartDate = WorksheetToOperate.Range("E" amp; i)
        strEndDate = WorksheetToOperate.Range("F" amp; i)
        Strresource = WorksheetToOperate.Range("J" amp; i)
        
        ' Import tasks
        If (WorksheetToOperate.Range("C" amp; i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("C" amp; i).Value)) Then
            newproj.Tasks.Add strValue
        End If
        
        ' Import start date
        If (WorksheetToOperate.Range("E" amp; i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("E" amp; i).Value)) Then
            newproj.Tasks(i - 18).Start = strStartDate
        End If
        
        ' Import end date
        If (WorksheetToOperate.Range("F" amp; i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("F" amp; 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" amp; i).Value <> "") And _
        (Not IsError(WorksheetToOperate.Range("J" amp; i).Value)) Then
            newproj.Tasks(i - 18).ResourceNames = Strresource
        End If
    
    Next i 
  

Ответ №1:

Проблема пропуска пустых строк значительно упрощается за счет использования переменной объекта задачи для отслеживания задачи, которая была только что добавлена. Кроме того, используйте 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" amp; i)) Then
                Set t = newProj.Tasks.Add(CStr(.Range("C" amp; i)))
                t.Start = CDate(.Range("E" amp; i))
                t.Finish = CDate(Range("F" amp; i))
                t.ResourceNames = CStr(.Range("J" amp; i))
            End If
        End With
    Next i
    
End Sub
  

Ответ №2:

Мне удалось заставить его работать с дополнительной переменной m :

     Dim m
    m = 0

    ' Move data to project
    For i = 19 To lRow
        
        If IsEmpty(WorksheetToOperate.Range("C" amp; i).Value) Then
        
            m = m   1
        
        Else
        
            strValue = WorksheetToOperate.Range("C" amp; i)
            strStartDate = WorksheetToOperate.Range("E" amp; i)
            strEndDate = WorksheetToOperate.Range("F" amp; i)
            Strresource = WorksheetToOperate.Range("J" amp; i)
        
            ' Import tasks
            If (WorksheetToOperate.Range("C" amp; i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("C" amp; i).Value)) Then
                newproj.Tasks.Add strValue
            End If
            
            ' Import start date
            If (WorksheetToOperate.Range("E" amp; i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("E" amp; i).Value)) Then
                newproj.Tasks(i - (18   m)).Start = strStartDate
            End If
            
            ' Import end date
            If (WorksheetToOperate.Range("F" amp; i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("F" amp; 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" amp; i).Value <> "") And _
            (Not IsError(WorksheetToOperate.Range("J" amp; i).Value)) Then
                newproj.Tasks(i - (18   m)).ResourceNames = Strresource
            End If
            
        End If
    
    Next i