결과를 월별 일로 나누는 DateDiff와 비슷한 쿼리/vba 함수를 어떻게 만들 수 있습니까? (즉, 2010 년 1 월 1 일 - 2010 년 2 월 3 일 = 1 월 31 일, 2 월 : 3 (서식 지정 무시)).DateDiff를 월로 나누기 access/vba
답변
좋아요, 당신이하고 싶은 것을 보았습니다.
우선 월과 일이 주어진 월의 일 수를 반환하는 함수가 필요합니다 (윤년으로 인해 2 월의 일수가 변경되는 것을 알 필요가 있습니다) :
Function DaysInMonth(month As Integer, year As Integer) As Integer
If month < 1 Or month > 12 Then
DaysInMonth = -1
Else
DaysInMonth = Day(DateSerial(year, month + 1, 1) - 1)
End If
End Function
내가 함수를
GetMonthDays 지정된 시작 및 종료 날짜 사이에 각 월의 일 수를 포함하는 정수의 배열 (1 ~ 12)을 시작 날짜와 종료 날짜를 받아 반환를 작성했습니다
. 시작일과 종료일은 수시로 다를 수 있으며 필요한 경우 여러 해 동안의 각 달의 총 일수를 누적합니다.
예를 들면,이 함수 호출 등 :
Dim months() As Integer
months = GetMonthDays(#6/13/2011#, #8/1/2011#)
는 반환 배열 [00000183110000]
호출과 같은 : 여러 년 동안
months = GetMonthDays(#12/25/2010#, #1/15/2011#)
반환 [15,0000000000,7]
에 대한 예 :
,months = GetMonthDays(#12/25/2009#, #1/15/2011#)
그것은 반환 [46,28,31,3031303131303130,38]
당신은 그것에서 일 수를 축적하고 있음을 알 수 2 월 1 일 (31 + 15)과 2 명의 죽음의 자 (31 + 7). 나는 이것이 당신이 원하는 것이라는 것을 100 % 확신하지는 못하지만, 12 개월이 넘는 날짜 범위가 주어지면 나에게 의미가 있습니다.
기본적으로이 함수는 시작 날짜와 종료 날짜 사이의 각 월을 반복하고 각 날짜를 누적합니다. 첫 번째와 마지막 달은 약간의 계산이 필요한 특수한 경우이며, 그렇지 않으면 단순히 그 달의 일 수입니다.
기능은 다음과 같습니다 뺀 오류 검사 : 나는 같은 기능을 사용하여 테스트했습니다
Function GetMonthDays(startDate As Date, endDate As Date) As Integer()
Dim months(1 To 12) As Integer
Dim monthStart As Integer
Dim monthEnd As Integer
Dim yearStart As Integer
Dim yearEnd As Integer
Dim monthLoop As Integer
Dim yearLoop As Integer
' initialise months array to all zeros
For monthLoop = 1 To 12
months(monthLoop) = 0
Next monthLoop
monthStart = month(startDate)
monthEnd = month(endDate)
yearStart = year(startDate)
yearEnd = year(endDate)
monthLoop = monthStart
yearLoop = yearStart
Do Until yearLoop >= yearEnd And monthLoop > monthEnd
If yearLoop = yearStart And monthLoop = monthStart Then
months(monthLoop) = months(monthLoop) + (DaysInMonth(monthLoop, yearLoop) - Day(startDate) + 1)
ElseIf yearLoop = yearEnd And monthLoop = monthEnd Then
months(monthLoop) = months(monthLoop) + Day(endDate)
Else
months(monthLoop) = months(monthLoop) + DaysInMonth(monthLoop, yearLoop)
End If
If monthLoop < 12 Or (monthLoop = 12 And yearLoop = yearEnd) Then
monthLoop = monthLoop + 1
Else
monthLoop = 1
yearLoop = yearLoop + 1
End If
Loop
GetMonthDays = months
End Function
:
Sub TestRun()
Dim months() As Integer
months = GetMonthDays(#12/25/2009#, #1/15/2011#)
MsgBox _
months(1) & vbCrLf & _
months(2) & vbCrLf & _
months(3) & vbCrLf & _
months(4) & vbCrLf & _
months(5) & vbCrLf & _
months(6) & vbCrLf & _
months(7) & vbCrLf & _
months(8) & vbCrLf & _
months(9) & vbCrLf & _
months(10) & vbCrLf & _
months(11) & vbCrLf & _
months(12)
End Sub
이것은 당신을위한 좋은 시작점이 있어야한다 적어도. 행운을 빕니다!
편집 : 종료일이 12 월 인 경우 오류를 수정하려면 사소한 변경. –
비슷한 기능을 필요로하는 다른 사용자의 경우 동일한 요일 (# 11/5/2011 #, # 11/20/2011 # returns 26) 일 경우 위의 기능이 실패 할 수 있습니다. –
각 결과에는 날짜 범위를 나타내는 두 개의 날짜 열이 있으며 각 결과에 매월 일 수를 표시 하시겠습니까? – Banjoe
입력에는 두 개의 날짜 열이 있습니다. 결과는 모두 12 개월이며 각 날의 일수가됩니다. (12 개월 간의 DateDiff 분할). –
그렇지 않은 경우 현재 월의 지난 12 개월을 계산해야합니다 (이 달의 경우 10 월, 오늘부터 10 년 사이의 날짜를 지난 연도의 11 월 초에서 오늘까지 계산 함) . –