2013-09-26 3 views
0

많은 수의 프로젝트/활동 (약 10,000 개)의 시작 및 종료 날짜가있는 Excel 시트가 있습니다. 이 프로젝트 중 일부는 시간이 겹치고 일부 프로젝트는 그렇지 않습니다. 나는 적어도 하나의 프로젝트가 진행되는 데 걸리는 총 일수를 계산하고 싶습니다.날짜 간격 조합 - Excel

예 :

  • 프로젝트 시작 : 1월 1. 2013 - 종료 : 1월 3. 2013
  • 프로젝트 B 시작 : 1월 2. 2013 - 종료 : 1월 4. 2013
  • 프로젝트 C 시작 : jan 6. 2013 - 종료 : jan 7. 2013

1 개 이상의 프로젝트가 현재 활성 상태 인 1 월 중 일 : 1,2,3,4,6,7. 따라서 그러한 일의 총 수는 6 일입니다.

수학적 배경에서 오는 것은 날짜 범위의 합집합을 만들고 크기를 안심시킬 것입니다. 그러나 그러한 표준 기능은 간격이 셀 범위가 아니라면 VBA에서 사용할 수있는 것으로 보이지 않습니다. 그런 다음 중첩되는 셀 범위를 두 번 계산합니다. 깨끗하고 빠른 솔루션을위한 아이디어? (날짜는 내 시트에 표준 Excel 형식 임).

+0

하는 열은 시작이며 날짜를 중지? –

+0

현재 C 열의 시작 날짜와 D 열의 종료 날짜는 어디에도 지정할 수 있습니다. – user2819141

답변

0

이를 고려

Sub CountDays() 
    Dim wf As WorksheetFunction, col As Collection 
    Set wf = Application.WorksheetFunction 
    Set col = New Collection 
    Dim StartDates As Range, EndDates As Range 
    Dim d1 As Date, d2 As Date, d As Date 
    Dim K As Long 
    Set StartDates = Range("C2:C100") 
    Set EndDates = Range("D2:D100") 
    d1 = wf.Min(StartDates) 
    d2 = wf.Max(EndDates) 
    For d = d1 To d2 
     For K = 2 To 100 
      If d >= Cells(K, "C") And d <= Cells(K, "D") Then 
       On Error Resume Next 
       col.Add d, CStr(d) 
       On Error GoTo 0 
      End If 
     Next K 
    Next d 
    MsgBox col.Count 
End Sub 

우리 루프 후보 기간을 통해, 그들이 어떤 범위에 맞는 경우 검사합니다. Collection.Add 메서드는 동일한 날짜를 두 번 계산하는 것을 금지합니다.

+0

감사합니다. 매우 유사한 것으로 생각되지만 날짜 간격의 수를 감안할 때 매우 느릴 것이라고 생각합니다. 나는 그것을 구현하려고 시도하고 합리적인 시간에 내가 돌아올거야 귀하의 답변을 수락하면 :) – user2819141

+0

훨씬 빠른 대안을 구성하는 경우 게시하십시오. –

0

다음 공식 접근 방식 :

=SUMPRODUCT(GESTEP(COUNTIFS(C1:C3,"<="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3))),D1:D3,">="&ROW(INDIRECT(MIN(C1:C3)&":"&MAX(D1:D3)))),1)) 

및 VBA 해당하는 사용자 정의 함수 :

Function DateCount(StartDates, EndDates) As Long 

Dim DateRange, DateFreq 
With Application 
    DateRange = .Evaluate("ROW(" & .Min(StartDates) & ":" & .Max(EndDates) & ")") 
    DateFreq = .CountIfs(StartDates, .Text(DateRange, """<=""0"), EndDates, .Text(DateRange, """>=""0")) 
    DateCount = .Sum(.GeStep(DateFreq, 1)) 
End With 

End Function