错误改过了,测试通过:
Dim countArr As Integer '目标的个数
Dim arrTarget() As Integer '目标数组
Sub getDay(date1 As Date, date2 As Date)
Dim arrDaysOfMonth(12) As Integer '数组,存放12个月的最后一天
arrDaysOfMonth(1) = 31
arrDaysOfMonth(2) = 28 '暂时的,如果不是,改为29
arrDaysOfMonth(3) = 31
arrDaysOfMonth(4) = 30
arrDaysOfMonth(5) = 31
arrDaysOfMonth(6) = 30
arrDaysOfMonth(7) = 31
arrDaysOfMonth(8) = 31
arrDaysOfMonth(9) = 30
arrDaysOfMonth(10) = 31
arrDaysOfMonth(11) = 30
arrDaysOfMonth(12) = 31
Dim month1 As Integer '第一个日期的月份
Dim month2 As Integer '第二个日期的月份
month1 = Month(date1)
month2 = Month(date2)
countArr = DateDiff("m", date1, date2) + 2
ReDim arrTarget(countArr - 1) As Integer
Dim tmpDate As Date
Dim tmpMonth As Integer
Dim TmpYear As Integer
'得到第一个日期上个月的最后一天
tmpMonth = month1 - 1
If tmpMonth = 0 Then tmpMonth = 12 '第一个日期上个月的月份
If tmpMonth = 2 Then
tmpDate = DateSerial(Year(date1), "2", "28")
If Month(tmpDate + 1) = 3 Then '下一天是三月,最后一天就是28
arrTarget(0) = 28
Else
arrTarget(0) = 29
End If
Else
arrTarget(0) = arrDaysOfMonth(tmpMonth) '查数组得到此月最后一天
End If
Dim i As Integer
For i = 1 To countArr - 2
tmpMonth = month1 - 1
If tmpMonth = 0 Then tmpMonth = 12 '第一个日期上个月的月份
tmpMonth = tmpMonth + i
TmpYear = -1
While tmpMonth > 12
tmpMonth = tmpMonth - 12
TmpYear = TmpYear + 1 '跨的年数
Wend
If tmpMonth = 2 Then
tmpDate = DateSerial(Year(date1) + TmpYear, "2", "28")
If Month(tmpDate + 1) = 3 Then '下一天是三月,最后一天就是28
arrTarget(i) = 28
Else
arrTarget(i) = 29
End If
Else
arrTarget(i) = arrDaysOfMonth(tmpMonth) '查数组得到此月最后一天
End If
Next
arrTarget(countArr - 1) = Day(date2)
End Sub
Private Sub Form_Load()
Call getDay(CDate("2003-1-3"), CDate("2005-4-9"))
Dim i As Integer
Debug.Print "9999999999999"
For i = 0 To countArr - 1
Debug.Print arrTarget(i)
Next
End Sub
Sub getall(ByVal date1 As Date, ByVal date2 As Date, Optional ByRef months As Integer, Optional ByRef out As String)
Dim x() As String, i As Integer
date1 = DateSerial(Year(date1), Month(date1), 0)
months = DateDiff("m", date1, date2) + 1
ReDim x(1 To months)
For i = 1 To months
x(i) = DateSerial(Year(date1), Month(date1) + i, 0)
Next
x(months) = date2
out = Join(x, vbCrLf)
Erase x
MsgBox out, vbOKOnly, months
End Sub
Private Sub Command1_Click()
getall #1/3/2003#, #4/9/2004#
End Sub
★★★★★★★★★★★★★★★★★
只判断2月,其它从数组中取得,最高效
终结版:
Dim countArr As Integer '目标的个数
Dim arrTarget() As Integer '目标数组
Sub getDay(date1 As Date, date2 As Date)
Dim arrDaysOfMonth(12) As Integer '数组,存放12个月的最后一天
arrDaysOfMonth(1) = 31
arrDaysOfMonth(2) = 28 '暂时的,如果不是,改为29
arrDaysOfMonth(3) = 31
arrDaysOfMonth(4) = 30
arrDaysOfMonth(5) = 31
arrDaysOfMonth(6) = 30
arrDaysOfMonth(7) = 31
arrDaysOfMonth(8) = 31
arrDaysOfMonth(9) = 30
arrDaysOfMonth(10) = 31
arrDaysOfMonth(11) = 30
arrDaysOfMonth(12) = 31
Dim month1 As Integer '第一个日期的月份
Dim month2 As Integer '第二个日期的月份
month1 = Month(date1)
month2 = Month(date2)
countArr = month2 - month1 + 2
ReDim arrTarget(countArr - 1) As Integer
Dim tmpDate As Date
Dim tmpMonth As Integer
Dim TmpYear As Integer
'得到第一个日期上个月的最后一天
tmpMonth = month1 - 1
If tmpMonth = 0 Then tmpMonth = 12 '第一个日期上个月的月份
If tmpMonth = 2 Then
tmpDate = DateSerial(Year(date1), "2", "28")
If Month(tmpDate + 1) = 3 Then '下一天是三月,最后一天就是28
arrTarget(0) = 28
Else
arrTarget(0) = 29
End If
Else
arrTarget(0) = arrDaysOfMonth(tmpMonth) '查数组得到此月最后一天
End If
Dim i As Integer
For i = 1 To countArr - 2
tmpMonth = month1 - 1 + i
While tmpMonth > 12
tmpMonth = tmpMonth - 12
TmpYear = TmpYear + 1 '跨的年数
Wend
If tmpMonth = 2 Then
tmpDate = DateSerial(Year(date1) + TmpYear, "2", "28")
If Month(tmpDate + 1) = 3 Then '下一天是三月,最后一天就是28
arrTarget(i) = 28
Else
arrTarget(i) = 29
End If
Else
arrTarget(i) = arrDaysOfMonth(tmpMonth) '查数组得到此月最后一天
End If
Next
arrTarget(countArr - 1) = Day(date2)
End Sub
Private Sub Form_Load()
Call getDay(CDate("2004-1-3"), CDate("2004-4-9"))
Dim i As Integer
For i = 0 To countArr - 1
Debug.Print arrTarget(i)
Next
End Sub
'一个COMMAND控件
'输入直接用字符串常数强制转换为日期型
Option Explicit
Dim dayCol As Collection '用集合来存放所有最后一天
Sub getday(ByVal date1 As Date, ByVal date2 As Date)
Dim thisDay As Date, nextDay As Date
thisDay = date1
While thisDay <= date2
nextDay = thisDay + 1
If Month(nextDay) <> Month(thisDay) Then '月份与前一天不等,月的最后一天
dayCol.Add thisDay '添加到集合
thisDay = thisDay + 28 '一个月的前27天肯定不是,直接到28
Else
thisDay = nextDay
End If
Wend
End Sub
Private Sub Command1_Click()
Dim i As Integer
Set dayCol = New Collection
Call getday(CDate("2004-1-3"), CDate("2004-4-9"))
For i = 1 To dayCol.Count
Debug.Print dayCol.Item(i)
Next
End Sub