VBA получит последний день месяца

Я довольно новичок в VBA. У меня есть диапазон дат, и мне нужно написать код, который изменит дату в ячейке на последний день месяца, используемый в ячейке. Например, если дата в ячейке 28/03/2018 Я хочу, чтобы это было заменено 31/03/2018, Есть идеи, как я могу это сделать?

7 ответов

Решение

Вы также можете получить нужный результат с помощью одной строки кода благодаря формуле Eomonth:

Range("A1") = Excel.Application.WorksheetFunction.EoMonth(Range("A1").Value2, 0)

Вы можете использовать пользовательскую функцию GetLastDayOfMonth() и передайте интересующий вас диапазон:

Option Explicit

Public Function GetLastDayOfMonth(ByVal myDate As Date) As Date
    GetLastDayOfMonth = DateSerial(Year(myDate), Month(myDate) + 1, 0)
End Function

Public Sub TestMe()

    Range("A1") = DateSerial(2000, 11, 11)
    If Range("A1") = GetLastDayOfMonth(Range("A1")) Then
        Debug.Print "LAST DAY!"
    End If

    Range("A1") = DateSerial(2000, 12, 31)
    If Range("A1") = GetLastDayOfMonth(Range("A1")) Then
        Debug.Print "LAST DAY! " & Range("A1")
        Range("A1") = DateAdd("d", 1, Range("A1"))
    End If

End Sub

Функция проверяет месяц и год прошедшей даты и возвращает новую дату, которая является последним днем ​​месяца для этого конкретного месяца и года.

Тогда в TestMe Версия, вы можете сравнить заданную дату с последним днем ​​месяца, созданного функцией. Если даты совпадают, то эта дата является последним днем ​​соответствующего месяца. С помощью DateAdd() можно получить следующий день последнего дня.

В приведенном выше примере я явно написал Range("A1") 9 раз, поэтому, вероятно, легче следовать.

Чтобы сделать его действительно коротким, вы можете использовать:

Sub test()

    Dim myDate As Date

    myDate = #3/28/2018#
    Debug.Print DateSerial(Year(myDate), Month(myDate) + 1, 0)

End Sub

Во-первых, если вы просто хотите, чтобы в Excel был последний день месяца, используйте функцию =EOMONTH или посмотрите этот пост SO с кодом vba: VBA Run Macro Последний день месяца

Прокрутка собственного кода даты и времени - плохая идея. Не делай этого.

Эта функция VBA рассчитает последний день месяца:

Public Function LastDay(ByVal d As Date)
Dim returnDate As Date
'First day of current month
returnDate = DateSerial(Year(d), Month(d), 1)
'Forward a month
returnDate = DateAdd("m", 1, returnDate)
'back one day
returnDate = DateAdd("d", -1, returnDate)
LastDay = returnDate

Конечная функция

Работает, переходя к началу месяца, добавляя месяц, затем вычитая день (1 февраля->1 марта->28 февраля)

Как это в VBA:

Sub LastDayOfMonth()
    Dim dates As Range, dt As Range

    Set dates = Range("A1") //Update as required

    For Each dt In dates
        dt = Application.WorksheetFunction.EoMonth(dt, 0) //e.g. 01/06/2018 ~~~> 30/06/2018
    Next
End Sub

VBA способ:

Function LastDayOfMonth(ByVal d As Date)
  LastDayOfMonth = DateSerial(Year(d), Month(d), 1)
  LastDayOfMonth = DateAdd("m", 1, LastDayOfMonth)
  LastDayOfMonth = DateAdd("d", -1, LastDayOfMonth)
End Function
  1. Построить новую дату:
    • год: от старой даты
    • месяц: со старой даты
    • день: 1
  2. Добавьте 1 месяц к новой дате.
  3. Вычтите 1 день с новой даты.

Шаги 2 и 3 избавят вас от всех сложностей расчета даты.

Для Excel, пожалуйста, обратитесь к другому ответу.

Другие вопросы по тегам