【问题标题】:How to get start and end of previous month in VB如何在VB中获取上个月的开始和结束
【发布时间】:2013-03-15 10:31:40
【问题描述】:

我正在尝试创建一些 VB 代码来获取上个月的开始和结束。 我可以到当前月份,这只是:

Month(DateValue(Now))

这将返回 3。从那里我可以带走 1 给我 2 意思是二月。这很好,但是当我在一月份我重复这个并且它给我零时 - 我的代码将失败。有谁知道如何获得前几个月的开始和结束日期?

谢谢

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    上个月的第一天总是1,要获取上个月的最后一天,使用0和DateSerial:

    ''Today is 20/03/2013 in dd/mm/yyyy
    DateSerial(Year(Date),Month(Date),0) = 28/02/2013 
    DateSerial(Year(Date),1,0) = 31/12/2012 
    

    你可以像这样从上面得到第一天:

    LastDay = DateSerial(Year(Date),Month(Date),0)
    FirstDay = LastDay-Day(LastDay)+1
    

    另请参阅:How to caculate last business day of month in VBScript

    【讨论】:

    • 嗨 Remou 刚刚再次检查您的代码并有另一个问题 - 为什么当我这样做时:LastDay = DateSerial(Year(Date), Month(Date) - 1, 1 - 1 ) 我得到的是 2013 年 1 月 31 日而不是 2013 年 2 月 28 日?当然是月份(日期) - 1 返回 2 暗示二月
    • 您有月份-2,月份(日期)-1 一次,0 天一次。这个月的第零天是上个月的最后一天,所以二月是日期序列(2013,3,0),而不是你显示的。
    • 哦,好吧——那是骗人的。谢谢
    • ?DateSerial(Year(12/1/2015),Month(12/31/2015),0) 11/30/1899
    • @barry17 您正在传递12/1/2015,它被解释为数学并计算为如下内容:DateSerial(Year(0.00595533498759305210918114143921),Month(0.00019210758024493716581229488513568),0) 将日期括在引号中,如下所示:DateSerial(Year("12/1/2015"),Month("12/31/2015"),0) 。 Excel 不会将整数隐式转换为日期,但会将字符串转换为日期。
    【解决方案2】:

    第一天和最后一天我有类似的公式

    每月的第一天

    FirstDay = DateSerial(Year(Date),Month(Date),1)
    

    下个月的零日是当月的最后一天

    LastDay = DateSerial(Year(Date),Month(Date)+ 1,0) 
    

    【讨论】:

      【解决方案3】:
      firstDay = DateSerial(Year(DateAdd("m", -1, Now)), Month(DateAdd("m", -1, Now)), 1)
      lastDay = DateAdd("d", -1, DateSerial(Year(Now), Month(Now), 1))
      

      这是另一种方法,但我认为 Remou 的版本看起来更干净。

      【讨论】:

        【解决方案4】:

        试试这个

        First_Day_Of_Previous_Month = New Date(Today.Year, Today.Month, 1).AddMonths(-1)
        
        Last_Day_Of_Previous_Month = New Date(Today.Year, Today.Month, 1).AddDays(-1)
        

        【讨论】:

        • 这不是 VBA。
        【解决方案5】:

        这在我的主要子系统中对我来说很可靠。

        Dim defDate1 As Date, defDate2 As Date
        
        '** Set default date range to previous month
        defDate1 = CDate(Month(Now) & "/1/" & Year(Now))
        defDate1 = DateAdd("m", -1, defDate1)
        defDate2 = DateAdd("d", -1, DateAdd("m", 1, defDate1))
        

        【讨论】:

          【解决方案6】:

          试试这个以数字形式获取月份:

          Month(DateAdd("m", -3, Now))
          

          它将在 12 月为您提供 12

          因此,在您的情况下,您将使用 Month(DateAdd("m", -1, Now)) 来减去一个月。

          【讨论】:

          • 如何获得上个月的开始和结束
          【解决方案7】:

          只是在@Fionnuala 所说的内容中添加一些内容,可以使用以下功能。这些甚至适用于闰年。

          'If you pass #2016/20/01# you get #2016/31/01#
          Public Function GetLastDate(tempDate As Date) As Date
              GetLastDate = DateSerial(Year(tempDate), Month(tempDate) + 1, 0)
          End Function
          
          'If you pass #2016/20/01# you get 31
          Public Function GetLastDay(tempDate As Date) As Integer
              GetLastDay = Day(DateSerial(Year(tempDate), Month(tempDate) + 1, 0))
          End Function
          

          【讨论】:

            【解决方案8】:
            Public Shared Function GetFOMPrev(ByVal tdate As Date) As Date
                Return tdate.AddDays(-(tdate.Day - 1))
            End Function
            
            Public Shared Function GetEOMPrev(ByVal tdate As Date) As Date
                Return tdate.AddDays(-tdate.Day)
            End Function
            

            用法:

            'Get End of Month of Previous Month - Pass today's date
            EOM = GetEOMPrev(Date.Today)
            
            'Get First of Month of Previous Month - Pass date just calculated
            FOM = GetFOMPrev(EOM)
            

            【讨论】:

            • 很确定这不是 VBA。
            • 为什么不在您的代码中添加解释以改进帖子?
            • 我已经好几年没用过 VBA 了——有人能告诉我这是否是接受答案的更好解决方案吗?虽然我希望投票能回答我自己的问题......
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多