VBA - 访问 - 获取一个月的最后一天

时间:2015-10-13 19:43:33

标签: vba

我需要你的帮助。我想得到这个月的最后一天。这是我的代码,但如果我想调试它并将其编译到数据库,它说它在语法中有错误。 请帮忙=)

Public Function GetNowLast() As Date
Dim asdfh As Date
asdfh = DateValue("1." _
& IIf(Month(Date) + 1) > 12, Month(Date) + 1 - 12, Month(Date) + 1) _
&"."&IIf(Month(Date)+1)>12 , Year(Date)+1,Year(Date))
asdf = DateAdd("d", -1, asdf)
GetNowLast = asdf
End Function

5 个答案:

答案 0 :(得分:10)

GD Linuxman,

让我们专注于获得结果......: - )

另请参阅:here

@Scott Craner的评论很有见!虽然严格来说,不需要使用格式。 (假设您想使用'日期'对象)

要实现您的目标,请按以下方式设置功能:

Function GetNowLast() as Date

    dYear = Year(Now)
    dMonth = Month(Now)

    getDate = DateSerial(dYear, dMonth + 1, 0)

    GetNowLast = getDate

End Function

您可以将代码中的函数调用为:

Sub findLastDayOfMonth()

    lastDay = GetNowLast()

End Sub

或者,可能更整洁:

Function GetNowLast(inputDate as Date) as Date

    dYear = Year(inputDate)
    dMonth = Month(inputDate)

    getDate = DateSerial(dYear, dMonth + 1, 0)

    GetNowLast = getDate

End Function

您可以调用该函数并将其传递给输入参数。

Sub findLastDayOfMonth()

lastDay = GetNowLast(Now()) 'Or any other date you would like to know the last day of the month of.

End Sub

另见@KekuSemau的this整洁解决方案

答案 1 :(得分:2)

我意识到这在谈话中有点晚了,但是有一个已经可用的工作表函数给出了月末日期EoMonth()。

粘贴到即时窗口中:

    ?Format(CDate(WorksheetFunction.EoMonth(Date, 0)), "dd")

将根据当前日期返回当月的最后一天。

作为一个UDF,给它一个默认的Argument是有意义的:

    Function LastDay(Optional DateUsed As Date) As String
        If DateUsed = Null Then DateUsed = Date
        LastDay = Format(CDate(WorksheetFunction.EoMonth(DateUsed, 0)), "dd")
        Debug.Print LastDay
    End Function

如果您提供参数,请确保它们是日期文字(即附带 #s

LastDay(#3/10#)
Result: 31

LastDay #2/11/2012#
Result: 29 '(A leap Year)

请注意,输出数据类型为 String (不是日期),并且可以根据需要调整日期格式(例如:" mm / dd / yyyy"而不是" dd")。

如果需要日期数据类型,请使用:

Function LastDay(Optional DateUsed As Date) As Date
    If DateUsed = 0 Then DateUsed = Date
    LastDay = WorksheetFunction.EoMonth(DateUsed, 0)
    Debug.Print CDate(LastDay)
End Function

我希望能帮助别人。

答案 2 :(得分:1)

简而言之,一种很棒而直接的方法是找到下个月的第一天,然后往后移一天。

为您自己做一个像这样的小功能:

  1. 获取有问题的月份和年份(最后一天的日期)
  2. 使用DateSerial组合月份和年份,以及日期“ 1”以获取相关月份的第一天。
  3. 使用DateAdd添加一个月。这将为您提供下一个月的第一天(即您真正想要的日期 之后的一天)。
  4. 再次使用DateAdd减去(移回)一天。这将为您提供开始月份的最后一天。
WITH messages_ranked 
AS ( 
   SELECT p.Date, p.RecipientId, p.RecipientType, p.Id, p.text, p.userId,
   ROW_NUMBER() OVER(PARTITION BY p.RecipientId, p.userId 
   ORDER BY p.Id DESC) 
   AS rk 

   FROM ChatMessages p
   JOIN ChatGroupMemberships as g 
   ON p.recipientId = g.groupId
   WHERE g.userId = XXX <-- user id
) 

SELECT date, recipientId as groupId, recipientType as groupType, id, text, userId, rk
FROM messages_ranked s 
where rk = 1

Order BY s.date DESC 

答案 3 :(得分:0)

Sub Worksheet_SelectionChange(ByVal Target As Range)

   Dim d1 As String

   Set Rng = Range("A2")
   d1 = Range("a2").Value2 'put a date in A2 Formatted as date(cell format)

   Dim years
   Dim months
   Dim end_month
   years = year(d1)
   months = month(d1)

   end_month = Day(DateSerial(years, months + 1, 1 - 1)) 'add one month and subtract one day from the first day of that month

   MsgBox CStr(end_month), vbOKOnly, "Last day of the month"


End Sub

答案 4 :(得分:0)

在Access VBA中,您可以通过EOMonth调用Excel的Excel's worksheet methods工作表函数(或几乎binding中的任何一个)到Excel应用程序对象和WorksheetFunction object,可以通过几种方式完成。

使用后期绑定对象调用Excel函数

Access VBA中最短的方法是使用一个后期绑定对象使用一行代码。此示例返回当月最后一天的日期:

MsgBox CreateObject("Excel.Application").WorksheetFunction.EOMonth(Now(), 0)

更详细的方法,作为函数:

Function eoMonth_LateBound(dt As Date) As Date
  Dim xl As Object
  Set xl = CreateObject("Excel.Application")
  eoMonth_LateBound = xl.WorksheetFunction.eomonth(dt, 0)
  Set xl = Nothing
End Function

后期绑定引用的一个问题是,每次调用函数时,VBA都会花一秒钟的时间来绑定对象。通过使用早期绑定可以避免这种情况。


使用Early Bound对象调用Excel函数

如果要重复使用该函数,则使用Early Binding并在两次调用之间保留对象会更有效,例如:

  • 转到工具> 参考add a reference到“ Microsoft Excel x.xx Object Library”(使用您安装的最新版本号) )。

  • 将此代码添加到新模块中:

    Option Compare Database
    Option Explicit
    
    Dim xl As Excel.Application
    
    Function eoMonth_EarlyBound(dt As Date) As Date
      If xl Is Nothing Then Set xl = New Excel.Application
      eoMonth_EarlyBound = xl.WorksheetFunction.eomonth(dt, 0)
    End Function
    
    Sub demo()
      MsgBox eoMonth_EarlyBound(Now())
      MsgBox eoMonth_EarlyBound("4/20/2001")
    End Sub
    

创建一个WorksheetFunction对象

如果要在整个代码中大量使用Excel的工作表函数,则甚至可以创建一个WorksheetFunction对象来简化调用。例如,这可能是一种简单的方法,可以使用TEXTJOIN连接多个字符串,或者使用WEBSERVICE从API获得响应:

Sub Examples()
'requires reference: "Microsoft Excel x.xx Object Library"
  Dim xl As Excel.Application, wsf As Excel.WorksheetFunction
  Set xl = New Excel.Application
  Set wsf = xl.WorksheetFunction

  'use EOMONTH to return last date of current month
  Debug.Print CDate(wsf.eomonth(Now(), 0))

  'use WEBSERVICE return your current IP address from a free JSON API
  Debug.Print wsf.WebService("https://api.ipify.org")

  'use TEXTJOIN to implode a bunch of values
  Debug.Print wsf.TextJoin(" & ", True, "join", "this", , "and", , "that", "too")

  'always tidy up your mess when finished playing with objects!
  Set wsf = Nothing
  Set xl = Nothing
End Sub

请注意,这些功能可能需要 Excel 2016 +或Excel 365(又名:对象库16.0 +)。