我有2个单元格,其中一个开始日期指定为startDate,另一个单元格指定为endDate。每次我点击单元格时,都会弹出一个日历,然后输入日期。我希望宏将endDate自动更改为该月的最后一天。因此,当用户进入并输入开始日期时,宏将输入结束日期,即该月的最后一天。这是我现在的代码:
Function dhLastDayInMonth(Optional endDate As Date = 0) As Date
' Return the last day in the specified month.
If endDate = 0 Then
' Did the caller pass in a date? If not, use
' the current date.
dtmDate = Date
End If
dhLastDayInMonth = DateSerial(Year(endDate), _
Month(dtmDate) + 1, 0)
End Function
此处还有日历代码:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'check cells for desired format to trigger the calendarfrm.show routine
'otherwise exit the sub
Dim DateFormats, DF
DateFormats = Array("m/d/yy;@", "mmmm d yyyy")
For Each DF In DateFormats
If DF = Target.NumberFormat Then
If CalendarFrm.HelpLabel.Caption <> "" Then
CalendarFrm.Height = 191 + CalendarFrm.HelpLabel.Height
Else: CalendarFrm.Height = 191
CalendarFrm.Show
End If
End If
Next
End Sub
答案 0 :(得分:2)
在您的endDate单元格中,您可以使用以下公式:
=DATE(YEAR(startDate),MONTH(startDate)+1,0)
其中startDate
是对startDate单元格的命名引用。
答案 1 :(得分:0)
如果您真的热衷于使用自己的VBA功能,那么您可以创建一个这样的功能,它基本上会在下个月的第一天获得,并从中减去1天以获得该月的最后一天。我认为Thunderframe的答案是最好的,因为它很简单,并且使用了excel的原生功能。
Public Function dhLastDayInMonth(Optional endDate As Date = 0) As Date
Dim dt As Date
'check if we have a date
If endDate = 0 Then
' Did the caller pass in a date? If not, use
' the current date.
dt = DateTime.Now
Else
dt = endDate
End If
'check for December
If DatePart("m", dt) = 12 Then
'add one to the year and month
dt = DateSerial(DatePart("yyyy", DateAdd("yyyy", 1, dt)), DatePart("m", DateAdd("m", 1, dt)), 1)
Else
'add 1 to the month
dt = DateSerial(DatePart("yyyy", dt), DatePart("m", DateAdd("m", 1, dt)), 1)
End If
'subtract 1 day from the date to get the last date of the month
dt = DateAdd("d", -1, dt)
'return the end of the month
dhLastDayInMonth = dt
End Function
答案 2 :(得分:0)
EndDate = DateSerial(Year(Date), Month(Date) + 1, 0)
此vba函数还将返回当前月份的每月的最后一天。如果需要其他月份,请更改Date
。