在 Excel VBA 中,尝试将输入的月份数字转换为完整日期

问题描述

您好,我正在尝试将输入的月份数字转换为当前年份 (mm/dd/yyyy) 的该月最后一天的完整日期。例如,如果用户要输入“01”,我需要存储日期“01/31/2021”。如果他们输入“11”,那就是“11/30/2021”。我觉得我只是在放屁,它应该是一些简单的事情,但我无法弄清楚。

截至目前,我正在使用此代码

Dim stopDate,defaultDate As String

If (Day(Now()) < 10) Then
    defaultDate = Format(WorksheetFunction.EoMonth(Now(),-2),"mm/dd/yyyy")
Else
    defaultDate = Format(WorksheetFunction.EoMonth(Now(),-1),"mm/dd/yyyy")
End If
stopDate = InputBox("Input the last day of the last month (mm/dd/yyyy) of the 12 month period.","User date",defaultDate)

所以如果今天的日期在当月的前 9 天之内,则认为前一个月的最后一天,如果过了当月的前 9 天,则认为前一个月的最后一天上个月。这个认日期是我们大部分时间都需要的,但是如果需要更改认日期,那么用户必须输入新的月份和该月的最后一天,我想避免麻烦。如果用户不必知道并输入他们需要的月份的最后一天,例如“09/30/2021”将其存储在 stopDate 变量中,他们只需输入“09”并输入“09/ 30/2021" 存储在 stopDate 变量中

解决方法

试试:

Function someDate(mnth As Long) As Date
    someDate = DateSerial(Year(Date),_
        mnth - IIf(Day(Date) > 9,1),0)
End Function

如果我理解你在做什么,如果今天的日期 >9,它应该返回上个月的最后一天,否则它将返回上个月的最后一天。

通过在 0 函数中使用 Day 作为 Dateserial 参数获得上个月的最后一天。

,

感谢 Ron Rosenfield,我能够解决问题并使用 DateSerial 函数和 1 行额外代码完成所需的工作

Dim month As Long
Dim stopDate,defaultMonth As String

If (Day(Now()) < 10) Then
        defaultMonth = Format(WorksheetFunction.EoMonth(Now(),-2),"mm")
    Else
        defaultMonth = Format(WorksheetFunction.EoMonth(Now(),-1),"mm")
    End If
    month = InputBox("Input the last month (mm) of the 12 month period there is data for.","User date",defaultMonth)
    stopDate = DateSerial(Year(Date),month + 1,0)
,

这可以减少 - 并且尺寸缺乏一点 - 所以:

Dim month           As Integer
Dim stopDate        As Date 
Dim defaultMonth    As String

defaultMonth = Format(DateAdd("m",-1,DateAdd("d",-9,Date)),"mm")
month = Val(InputBox("Input the last month (mm) of the 12 month period there is data for.",defaultMonth))
stopDate = DateSerial(Year(Date),0)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...