VBA получит последний день месяца - PullRequest
0 голосов
/ 01 июня 2018

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

Ответы [ 7 ]

0 голосов
/ 01 июня 2018

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

Sub test()

    Dim myDate As Date

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

End Sub
0 голосов
/ 01 июня 2018

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

Range("A1") = Excel.Application.WorksheetFunction.EoMonth(Range("A1").Value2, 0)
0 голосов
/ 01 июня 2018

Вы можете использовать пользовательскую функцию 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(), можно получить следующий день lastDay.

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

0 голосов
/ 01 июня 2018

Как это в 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
0 голосов
/ 01 июня 2018

Эта функция 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 февраля)

0 голосов
/ 01 июня 2018

Путь 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, пожалуйста, обратитесь к другой ответ .

0 голосов
/ 01 июня 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...