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 месяц к новой дате.
- Вычтите 1 день с новой даты.
Шаги 2 и 3 избавят вас от всех сложностей расчета даты.
Для Excel, пожалуйста, обратитесь к другому ответу.