Vba excel последнее число месяца

 

NIKOLASCS

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

Какой функцией на VBA вернуть последний день месяца?

 

обязательно VBA?  
есть стандартная

 

The_Prist

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

Dim iLastDay As Integer  
iLastDay = Day(DateSerial(2010, 5, 1) — 1)  
iLastDay = Day(DateSerial(Year(Now), Month(Now), 1) — 1)

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

NIKOLASCS

Пользователь

Сообщений: 123
Регистрация: 01.01.1970

 
 

Владимир, читаем вопрос:  
{quote}{login=NIKOLASCS}{date=02.04.2010 07:19}{thema=Последний день месяца}{post}Какой функцией на VBA вернуть последний день месяца?{/post}{/quote}  
VBA нужно.

 
 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

Зачем тогда отвечаете? Формулы не просили.

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

{quote}{login=Юрий М}{date=02.04.2010 02:00}{thema=}{post}Зачем тогда отвечаете? Формулы не просили.{/post}{/quote}  
Часто бывает, что спрашивающий не подозревает, что требуемое можно сделать без макросов, поэтому лищний пример не помешает. И вдруг потомкам… :)

 

Serge

Пользователь

Сообщений: 11308
Регистрация: 01.01.1970

{quote}{login=vikttur}{date=02.04.2010 05:20}{thema=Re: }{post}Часто бывает, что спрашивающий не подозревает, что требуемое можно сделать без макросов, поэтому лищний пример не помешает. И вдруг потомкам… :){/post}{/quote}  
Если потомкам, то надо пояснить, что КОНМЕСЯЦА появится только установки пакета анализа :-)

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

У потомков она будет вшита. В подсознание :)

 

У нас каждый десятый только знает, чего хочет, вот и предлагаются возможные варианты…    
—  
Если подойдет функция, то и о пакете анализа расскажем.

 

Если при помощи предложенной функции вычислять последний день  
то получается что последний день мая 2012 года — 30!  
Как можно исправить эту функцию чтобы считать правильно?  
Dim iLastDay As Integer  
iLastDay = Day(DateSerial(2011, 5, 1) — 1)

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

Узнаем последнее число следующего месяца  
1) x = Dateadd(«m»,1,Date) ‘- вспомогательная дата должна быть на один месяц больше интересующего нас месяца  
2) lastDate = Dateserial(Year(x), Month(x),0) ‘дата последнего числа интересущего месяца  
3) DayinMonth = Day(lastDate) ‘цифра-результат

 

egonomist

Пользователь

Сообщений: 409
Регистрация: 21.12.2012

т.о для мая  
x = «01.06.2012»  
lastDate = Dateserial(Year(x), Month(x),0) ’31/05/2012  
DayinMonth = Day(lastDate) ’31

 

ДМ

Гость

#16

06.04.2012 11:24:50

Спасибо за быстрый ответ. Очень признателен.

In Access VBA, you can call Excel’s EOMonth worksheet function (or almost any of Excel’s worksheet methods) is by binding to an Excel application object and a WorksheetFunction object, which can be accomplished in a few ways.

Calling Excel functions with an Late Bound object

The shortest method from Access VBA is with a single line of code using a late-bound object. This example returns the date of the last day of the current month:

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

A more verbose method, as a function:

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

An issue with late-bound references is that VBA takes a second to bind the object each time the function is called. This can be avoided by using early binding.


Calling Excel functions with an Early Bound object

If the function is to be used repeatedly, it’s more efficient to go with Early Binding and retain the object between calls, for example:

  • Go Tools > References and add a reference to «Microsoft Excel x.xx Object Library» (use whatever the newest version number is that you have installed).

  • Add this code in a new module:

    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
    

Creating a WorksheetFunction object

If Excel’s worksheet functions are to be used lots throughout your code, you could even create a WorksheetFunction object to simplify the calls. For example, this could be a simple way to join multiple strings with TEXTJOIN, or get a response from an API with WEBSERVICE:

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

Note that these functions may require Excel 2016+ or Excel 365 (aka: Object Library 16.0+.)

You can use a user-defined function GetLastDayOfMonth() and pass the range you are interested in:

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

The function checks the month and the year of the date, which is passed and it returns a new date, which is the last day of the month for this specific month and year.

Then in the TestMe version, you can compare a given date with the last day of the month, generated by the function. If the dates are the same, then this date is the last day of the corresponding month. Using DateAdd() it is possible to get the next day of the lastDay.

In the example above, I have explicitly written Range(«A1») 9 times, thus it is probably easier to follow.

Содержание

  1. VBA получит последний день месяца
  2. 6 ответов
  3. Метод WorksheetFunction.EoMonth (Excel)
  4. Синтаксис
  5. Параметры
  6. Возвращаемое значение
  7. Замечания
  8. Поддержка и обратная связь
  9. Get the last day of month
  10. 6 Answers 6
  11. VBA Excel. Функции для работы с датой и временем
  12. Функция Date
  13. Функция DateAdd
  14. Функция DateDiff
  15. How to Get End of the Month Date in Excel
  16. Get the Last Day of the Month using EOMONTH Function
  17. End Date of the Same Month
  18. End Date of the Future Month
  19. How does it work
  20. End Date of the Previous Month
  21. DATE Function to Get Month’s Last Date
  22. Get Last Day with a UDF
  23. Conclusion

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

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

6 ответов

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

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

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

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

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

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

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

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

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

Источник

Метод WorksheetFunction.EoMonth (Excel)

Возвращает серийный номер последнего дня месяца, который является указанным числом месяцев до или после start_date. Используйте EoMonth для вычисления дат погашения или сроков, которые приходятся на последний день месяца.

Синтаксис

expression. EoMonth (Arg1, Arg2)

Выражение Переменная, представляющая объект WorksheetFunction .

Параметры

Имя Обязательный или необязательный Тип данных Описание
Arg1 Обязательный Variant Start_date — дата, представляющая начальную дату. Даты следует вводить с помощью функции DATE или в качестве результатов других формул или функций. Например, используйте date(2008,5;23) для 23-го дня мая 2008 г. Проблемы могут возникнуть, если даты вводятся в виде текста.
Arg2 Обязательный Variant Месяцы — количество месяцев до или после start_date. Положительное значение для месяцев дает дату в будущем; отрицательное значение возвращает прошлую дату.

Возвращаемое значение

Double

Замечания

Microsoft Excel сохраняет даты как последовательные серийные номера, чтобы их можно было использовать в вычислениях. По умолчанию 1 января 1900 года — серийный номер 1, а 1 января 2008 года — серийный номер 39448, так как после 1 января 1900 г. это 39 448 дней. Microsoft Excel для Macintosh использует другую систему даты по умолчанию.

Visual Basic для приложений (VBA) вычисляет последовательные даты иначе, чем Excel. В VBA серийный номер 1 — 31 декабря 1899 года, а не 1 января 1900 года.

Если start_date не является допустимой датой, EoMonth возвращает #NUM! значение ошибки.

Если start_date плюс месяцы возвращает недопустимую дату, EoMonth возвращает #NUM! значение ошибки.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Get the last day of month

I want to get the last day of the month.

This is my code. If I want to debug it and compile it to the database it says it has an error in the syntax.

6 Answers 6

Let’s focus on obtaining the result. -)

The comment by @Scott Craner is spot on ! Though strictly speaking there is no need to use the formatting. (Assuming you want to work with the ‘Date’ object)

To achieve what you want, setup the function as per below:

You can call the function in your code as:

Alternatively, and neater is likely:

You can call that function and pass it an input parameter.

See also this neat solution by @KekuSemau

I realize this is a bit late into the conversation, but there is an already available worksheet function that gives the end of month date, EoMonth().

Pasting into the Immediate Window:

Will return the last day of the month based on current date.

As a UDF, it makes sense to give it a default Argument:

If you feed it Arguments, be sure that they are Date Literals (i.e. Enclosed with #s)

Note the output Data Type is String (not Date) and that the format of the date can be adjusted as needed (Ex: «mm/dd/yyyy» instead of «dd»).

If the Date Data Type is needed, use:

I hope that helps someone.

In short, a great and straightforward approach is to find the first day of the following month and then move backward one day.

Make yourself a little function that does something like this:

  1. Obtain the month and year in question (the one where you want the last day)
  2. Use DateSerial to combine the month and the year, along with the day «1» to get the first day of the month in question.
  3. Use DateAdd to add one month. This will get you the first day of the next month (which is one day after the date you really want).
  4. Use DateAdd again to subtract (move back) one day. This will give you the last day of the month where you started.

Источник

VBA Excel. Функции для работы с датой и временем

Функции для работы с датой и временем в VBA Excel. Синтаксис, параметры, спецсимволы, примеры. Функции, возвращающие текущие дату и время по системному таймеру.

Функция Date

Синтаксис

Пример

Функция DateAdd

Синтаксис

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, который требуется добавить.
number Обязательный параметр. Числовое выражение, задающее количество интервалов, которые необходимо добавить. Может быть как положительным (возвращается будущая дата), так и отрицательным (возвращается предыдущая дата).
date Обязательный параметр. Значение типа Variant/Date или литерал, представляющий дату, к которой должен быть добавлен интервал.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: три символа – y, d, w – указывают функции DateAdd на один день, который необходимо прибавить к исходной дате number раз.

Пример

Функция DateDiff

Синтаксис

Параметры

Параметр Описание
interval Обязательный параметр. Строковое выражение из спецсимволов, представляющее интервал времени, количество которых (интервалов) требуется вычислить между двумя датами.
date1, date2 Обязательные параметры. Значения типа Variant/Date , представляющие две даты, между которыми вычисляется количество указанных интервалов.
firstdayofweek Необязательный параметр. Константа, задающая первый день недели. По умолчанию – воскресенье.
firstweekofyear Необязательный параметр. Константа, задающая первую неделю года. По умолчанию – неделя, в которую входит 1 января.

Таблицу аргументов (значений) параметра interval смотрите в параграфе «Приложение 1».

Примечание к таблице аргументов: в отличие от функции DateAdd , в функции DateDiff спецсимвол «w» , как и «ww» , обозначает неделю. Но расчет осуществляется по разному. Подробнее об этом на сайте разработчиков.

Параметры firstdayofweek и firstweekofyear определяют правила расчета количества недель между датами.

Таблицы констант из коллекций firstdayofweek и firstweekofyear смотрите в параграфах «Приложение 2» и «Приложение 3».

Источник

How to Get End of the Month Date in Excel

Sometimes we need to get an end-of-month date to use as a completion date, a due date, as a target date, or sometimes we need it to calculate the days between two dates.

Without any effort, we can easily add it manually, but there are some formulas that can help us to calculate it.

The best way to calculate the last date of the month is by using the EOMONTH Function. But apart from this, you can also use other methods (VBA).

Using a formula or any other dynamic method has the benefit that we don’t need to calculate it again and again. Today, in this post, I’d like to share with you 3 simple and dynamic ways to get the end of the month date in Excel.

So let’s get started and please download this same file from here to follow along.

Get the Last Day of the Month using EOMONTH Function

EOMONTH is my favorite function to calculate the last day of a month. This function is specifically designed for these kinds of calculations.

All you have to do is just specify a date current date, and the number of months you want to calculate the last date before and after the start date. Here is the syntax:

In this syntax, the start date will be the current date and months will be a number that represents the number of months forward or backward.

End Date of the Same Month

Let’s say, you have the date “06-Feb-2017” and you want to get the last day of “Feb”. In this case, the formulas you need to use are:

In the above example, when you use EOMONTH, has returned 28-Feb-2017 which is the last date of the Feb month.

How does it work: Here, you have used “0” for the number argument because the start date you have used is of Feb month and you won’t have the last day of the same month. When you use “0” it will simply return the last date for the same month for which you have the start date.

To create a dynamic formula you can use the TODAY Function in the start_date argument.

End Date of the Future Month

Now, let’s say, from the same date you want to get the last day of “Apr”. In this case, the formulas you need to use are:

In the above example, the formula has returned 30-Apr-2017 which is the last date of the Apr month.

How does it work

Here, you have used “2” for the number argument and the start date you have used is of Feb month. Now, if you look, Apr is exactly 2 months after Feb so that’s why it has returned 30-Apr-2017.

End Date of the Previous Month

And, if you want to get the last date of a previous month you can use a negative number for that. Let’s say you want the last day of Jan. So, the formula you need to use:

In the above example, the formula has returned 31-Jan-2017 which is the last date of the Jan month.

How does it work: Here, you have used “-1” for the number argument and Jan is exactly 1 month before Feb.

DATE Function to Get Month’s Last Date

DATE Function is another approach to getting the last day in excel. The date function helps you to create a valid excel date by specifying the year, month, and day. Here is the syntax:

As I have mentioned, in the date function, you need to enter the year, month, and day, and it returns a valid date according to that. Now, there is a small trick that you can do with day argument.

And, if you want to calculate the last day of the current month the formula will be:

Or, if you just have a date to refer then the formula will be:

Get Last Day with a UDF

A great VBA Example. This is a macro code for using a VBA UDF to get the last day of the month. You just need to copy it into your VBA editor.

In your worksheet, type “=LastD(” and insert the date for the month or refer to a cell. And, if you want the last day of the current month then simply left it blank using brackets.

Conclusion

As I said, the month’s last day can be helpful for you while calculating target dates, due dates, or completion dates. And, now we have three different ways to get it.

If you use EOMONTH then it’s really easy to create a dynamic formula that can help you to date for past or future months and I think it’s the best way to do it.

I hope you found it useful and it will help you take your skills to the whole next level.

Now tell me one thing. Which one is your favorite method above all? Or, do you have a different method? Please share with me in the comment box, I would love to hear from you.

And, don’t forget to share it with your friends.

Источник

Sometimes we need to get an end-of-month date to use as a completion date, a due date, as a target date, or sometimes we need it to calculate the days between two dates.

Without any effort, we can easily add it manually, but there are some formulas that can help us to calculate it.

The best way to calculate the last date of the month is by using the EOMONTH Function. But apart from this, you can also use other methods (VBA).

Using a formula or any other dynamic method has the benefit that we don’t need to calculate it again and again. Today, in this post, I’d like to share with you 3 simple and dynamic ways to get the end of the month date in Excel.

So let’s get started and please download this same file from here to follow along.

Get the Last Day of the Month using EOMONTH Function

EOMONTH is my favorite function to calculate the last day of a month. This function is specifically designed for these kinds of calculations.

All you have to do is just specify a date current date, and the number of months you want to calculate the last date before and after the start date. Here is the syntax:

EOMONTH(start_date,months)

In this syntax, the start date will be the current date and months will be a number that represents the number of months forward or backward.

Let’s say, you have the date “06-Feb-2017” and you want to get the last day of “Feb”. In this case, the formulas you need to use are:

=EOMONTH("22-Feb-2017",0)
get end of day for a present month using eomonth

In the above example, when you use EOMONTH, has returned 28-Feb-2017 which is the last date of the Feb month.

How does it work: Here, you have used “0” for the number argument because the start date you have used is of Feb month and you won’t have the last day of the same month. When you use “0” it will simply return the last date for the same month for which you have the start date.

To create a dynamic formula you can use the TODAY Function in the start_date argument.

End Date of the Future Month

Now, let’s say, from the same date you want to get the last day of “Apr”. In this case, the formulas you need to use are:

=EOMONTH("22-Feb-2017",2)
get end of the month date for future month using eomonth

In the above example, the formula has returned 30-Apr-2017 which is the last date of the Apr month.

How does it work

Here, you have used “2” for the number argument and the start date you have used is of Feb month. Now, if you look, Apr is exactly 2 months after Feb so that’s why it has returned 30-Apr-2017.

End Date of the Previous Month

And, if you want to get the last date of a previous month you can use a negative number for that. Let’s say you want the last day of Jan. So, the formula you need to use:

=EOMONTH("22-Feb-2017",-1)
get end of the month date for previous month using eomonth

In the above example, the formula has returned 31-Jan-2017 which is the last date of the Jan month.

How does it work: Here, you have used “-1” for the number argument and Jan is exactly 1 month before Feb.

DATE Function to Get Month’s Last Date

DATE Function is another approach to getting the last day in excel. The date function helps you to create a valid excel date by specifying the year, month, and day. Here is the syntax:

DATE(year,month,day)

As I have mentioned, in the date function, you need to enter the year, month, and day, and it returns a valid date according to that. Now, there is a small trick that you can do with day argument.

Quick Trick: If you use 0 asa day it will return the last date of the previous month. For example, if you specify, Year: 2017, Month: 4 (that’s May) and Day: 0 it will return 30-Apr-2017 in the result.

And, if you want to calculate the last day of the current month the formula will be:

get end of the month date using date function
=DATE(CurrentYear,CurrentMonth + 1,0)

Or, if you just have a date to refer then the formula will be:

=DATE(YEAR(date),MONTH(date)+1,0)

Get Last Day with a UDF

A great VBA Example. This is a macro code for using a VBA UDF to get the last day of the month. You just need to copy it into your VBA editor.

Function LastD(Optional sd As Date = 0) As Date
If sd = 0 Then 
sd = VBA.DateLastD = VBA.DateSerial(VBA.Year(sd), VBA.Month(sd) + 1, 0)
End Function
get end of the month date using vba

In your worksheet, type “=LastD(” and insert the date for the month or refer to a cell. And, if you want the last day of the current month then simply left it blank using brackets.

Conclusion

As I said, the month’s last day can be helpful for you while calculating target dates, due dates, or completion dates. And, now we have three different ways to get it.

If you use EOMONTH then it’s really easy to create a dynamic formula that can help you to date for past or future months and I think it’s the best way to do it.

I hope you found it useful and it will help you take your skills to the whole next level.

Now tell me one thing. Which one is your favorite method above all? Or, do you have a different method? Please share with me in the comment box, I would love to hear from you.

And, don’t forget to share it with your friends.

Artur zhitkovic

15 / 2 / 1

Регистрация: 24.10.2014

Сообщений: 106

1

Определить последний день текущего месяца

10.12.2016, 19:17. Показов 11009. Ответов 1

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Есть задание : Определить, сколько часов и минут осталось до конца текущего месяца.
Вот что я сделал, но как задать последний день месяца на автомате

Visual Basic
1
2
3
4
5
6
Public Sub zad2()
Dim h As Long, m As Long
m = DateDiff("n", Now, "31/12/2016")
h = m / 60
MsgBox "До конца месяца, осталось " & h & " ч " & m Mod 60 & " мин"
End Sub

Сам нашел
Если кому надо

Visual Basic
1
LastDayInMoth =  DateSerial(Year(Now), Month(Now) + 1, 0)



0



15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

10.12.2016, 20:11

2

Artur zhitkovic, h = m 60 (иначе будет округление, а не отбрасывание дробной части)

Цитата
Сообщение от Artur zhitkovic
Посмотреть сообщение

Сам нашел



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

10.12.2016, 20:11

Помогаю со студенческими работами здесь

Определить номер последней недели текущего месяца
Ребята, нужно найти последнюю неделю текущего месяца. и если сейчас она, то :
к…

Определить дату, название месяца, квартал, неделю года, день недели
Для заданной даты и определенного значения определить дату, название месяца, квартал, неделю года,…

Как определить первый и последний день текущего месяца?
Подскажите пожалуйста, как определить первый и последний день текущего месяца?

declare…

Как найти последний день текущего месяца?
Здравствуйте!

Есть кнопка, при нажатии на которую в полях дат должны устанавливаться первое и…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

Хитрости »

23 Октябрь 2017              10914 просмотров


Проблема получения последнего дня месяца довольно распространена и очень просто решается. Начиная с Excel 2007 можно без всяких доп.манипуляций использовать функцию КОНМЕСЯЦА(EOMONTH):
=КОНМЕСЯЦА(ТДАТА();0)
=EOMONTH(NOW(),0)
ТДАТА(NOW) — возвращает текущую дату. Вместо неё можно указать любую дату и последняя дата месяца будет возвращена для указанной даты.
Для версий 2003 и ранее для использования КОНМЕСЯЦА(EOMONTH) необходимо для начала подключить надстройку Пакет анализа или же использовать чуть менее понятную формулу:
=ДАТА(ГОД(ТДАТА());МЕСЯЦ(ТДАТА())+1;0)
=DATE(YEAR(NOW()),MONTH(NOW())+1,0)
На самом деле данная формула проста, если разобраться детальнее. Функция ДАТА записывает в ячейку дату, на основании указанного года, месяца и дня. Мы для года берем год от текущей даты, далее берем месяц текущей даты и к месяцу прибавляем 1, чтобы получить следующий месяц. А потом для дня указываем 0, что заставляет Excel сдвинуть первую дату следующего месяца на один день назад. Таким образом и получается последняя дата месяца. Пошагово это выглядит так(если считать, что сегодня «22.10.2017»):
=ДАТА(ГОД(ТДАТА());МЕСЯЦ(ТДАТА())+1;0) =>
=ДАТА(ГОД(«22.10.2017»);МЕСЯЦ(«22.10.2017»)+1;0) =>
=ДАТА(2017;10+1;0) =>
=ДАТА(2017;11;0) здесь уже получится 01.11.2017, но 0 в качестве дня заставляет вернуться на день назад =>
=31.10.2017


Но есть более сложная проблема — получить дату последнего рабочего дня месяца. А это уже не так просто. Встроенных функций(вроде КОНМЕСЯЦА) для этого в Excel нет. А это значит опять придется танцевать с бубном.
Сразу возникает вопрос: а зачем это вообще может потребоваться? Например, для поиска счетов, отгрузка по которым производилась в последний рабочий день месяца, а оплаты(или документы на отгрузку) по некоторым пришли только в начале следующего. Так же такую функцию будет удобно применять для автоматического формирования платежек или накладных, если они должны быть оформлены именно последним рабочим днем месяца.
Чтобы получить именно корректную дату следует так же учесть и тот факт, что есть дни праздничные. И их тоже надо как-то учесть. Для этого я буду использовать отдельный лист Праздники, в столбце А которого записаны праздничные дни на пару лет. Также в этом диапазоне перечислены и все выходные. Сделано для более корректного подсчета дат, т.к. праздники могут быть перенесены, в результате чего рабочими становятся субботы или воскресенья. Если их не учитывать, то расчет будет неверным.

Из спортивного интереса создать такую функцию решил тремя способами:

  • При помощи стандартных функций Excel
  • При помощи функции пользователя на VBA
  • При помощи PowerQuery

Последний рабочий день при помощи стандартных функций Excel
В ходе некоторых экспериментов и манипуляций появилась такая формула:
=РАБДЕНЬ(
ЕСЛИ(ДЕНЬНЕД(КОНМЕСЯЦА(B4;0);2)<6; КОНМЕСЯЦА(B4;0);
КОНМЕСЯЦА(B4;0)-(ДЕНЬНЕД(КОНМЕСЯЦА(B4;0);2)-5));
0; Праздники!$A$2:$A$827)
=WORKDAY(
IF(WEEKDAY(EOMONTH(B4,0),2)<6, EOMONTH(B4,0),
EOMONTH(B4,0)-(WEEKDAY(EOMONTH(B4,0),2)-5)),
0,Праздники!$A$2:$A$827)
где Праздники!$A$2:$A$827 — ссылка на диапазон дат с праздниками
Здесь я так же использую КОНМЕСЯЦА для быстрого определения последней даты месяца.
Функция ДЕНЬНЕД(WEEKDAY) возвращает номер дня недели для указанной даты и нужна для того, чтобы определить — является последний день недели субботой или воскресеньем. Если нет, то возвращаем дату как есть, если это суббота или воскресенье — то отнимаем от даты либо 1 день, либо 2(если это СБ — то 1, если ВСК — то 2).
И только после этого применяем к полученной дате функцию РАБДЕНЬ(WORKDAY), которая для последней даты месяца определяет, является ли она праздничной(на основании списка праздников Праздники!$A$2:$A$827). Если дата праздничная — то она уменьшается до тех пор, пока не достигнет рабочего дня. РАБДЕНЬ не принимает в расчет выходные, поэтому нам и нужны функции ЕСЛИ и ДЕНЬНЕД, прежде чем применить РАБДЕНЬ.

Однако сразу хочу оговорить, что в конкретно моем случае вычисление выходных дней при помощи ЕСЛИ и ДЕНЬНЕД несколько избыточно, т.к. в диапазоне с праздниками помимо непосредственно праздников у меня уже учтены все выходные дни. Т.е. по сути формула могла бы быть намного проще:
=РАБДЕНЬ(КОНМЕСЯЦА(B4;0); 0; Праздники!$A$2:$A$827)
=WORKDAY(EOMONTH(B4,0), 0, Праздники!$A$2:$A$827)
Но я все равно решил именно в статье привести формулу, которая смотрит и на дни недели, т.к. требования могут быть разными.

Т.к. Microsoft все же немного заботится о нас, то для пользователей версий Excel 2010 и более новых, в случае необходимости учитывать день недели прямо в формуле, можно использовать функцию РАБДЕНЬ.МЕЖД:
=РАБДЕНЬ.МЕЖД(КОНМЕСЯЦА(B4;0);0;1;Праздники!$A$2:$A$827)
=WORKDAY.INTL(EOMONTH(B4,0),0,1,Праздники!$A$2:$A$827)
РАБДЕНЬ.МЕЖД[дата; кол-во дней; выходные; праздники]
дата — дата, от которой необходимо отсчитать указанное кол-во дней
кол-во дней — количество дней, которые надо прибавить или отнять(отриц. число — отнимает дни от даты) от указанной даты
выходные — 1 = Суббота и Воскресенье, 2 — Воскресенье и Понедельник и т.д. Полный перечень есть в справке для функции и в выпадающей подсказке к функции при вводе.
праздники — ссылка на диапазон дат с праздниками
Достаточно указать последнюю дату месяца, указать для неё сдвиг на 0 дней, указать тип выходных и ссылку на диапазон дат с праздниками. Все уже сделано и все гораздо проще.


Последний рабочий день при помощи функции пользователя на VBA

Если использование VBA не является для вас проблемой, то можно применить функцию пользователя(UDF) для расчета последнего рабочего дня:

'---------------------------------------------------------------------------------------
' Author : The_Prist(Щербаков Дмитрий)
'          Профессиональная разработка приложений для MS Office любой сложности
'          Проведение тренингов по MS Excel
'          http://www.excel-vba.ru
'          WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
' Purpose: Функция получения последнего рабочего дня на основании указанной даты и списка праздников
'---------------------------------------------------------------------------------------
Option Explicit
 
Function ПоследнийРабочийДень(Дата As Date, Optional Праздники As Range = Nothing, Optional СистемныеВыходные As Boolean = False)
    Dim dd As Date, dres As Date
    Dim lWeekDay As Long
 
    dres = DateSerial(Year(Дата), Month(Дата) + 1, 0)
    If СистемныеВыходные Then
        lWeekDay = Weekday(dres, vbUseSystemDayOfWeek)
        If lWeekDay < 6 Then
            dres = dres
        Else
            dres = dres - (lWeekDay - 5)
        End If
    End If
    Do While (IsHoliday(dres, Праздники))
        dres = dres - 1
    Loop
    ПоследнийРабочийДень = dres
End Function
 
'Функция поиска указанной даты среди праздничных дат
'       dd          - искомая дата
'       Holidays    - диапазон с праздничными днями
Function IsHoliday(ByVal dd As Date, Optional Holidays As Range = Nothing)
    Dim lWeekDay As Long
    Dim x, rr As Range
 
    If Holidays Is Nothing Then Exit Function
    For Each x In Holidays.Value
        If IsDate(x) Then
            If CDate(x) = dd Then
                IsHoliday = True
                Exit Function
            End If
        End If
    Next
End Function

Чтобы правильно использовать приведенный код, необходимо сначала ознакомиться со статьей Что такое функция пользователя(UDF)?. Вкратце: скопировать текст кода выше, перейти в редактор VBA(Alt+F11) -создать стандартный модуль(InsertModule) и в него вставить скопированный текст. После чего функцию можно будет вызвать из Диспетчера функций(Ctrl+F3), отыскав её в категории Определенные пользователем (User Defined Functions).
Синтаксис функции:
=ПоследнийРабочийДень(B4;Праздники!$A$2:$A$827;0)

  • Дата(B4) — непосредственно дата или ссылка на ячейку с датой, последней рабочий день для которой необходимо вычислить. Будет рассчитан последний рабочий день для месяца указанной даты.
  • Праздники() — ссылка на диапазон ячеек, содержащих даты праздничных дней.
  • СистемныеВыходные(0) — ИСТИНА(TRUE или 1) или ЛОЖЬ(FALSE или 0). Если указано как ЛОЖЬ, то при вычислении последнего рабочего дня не будут учитываться выходные. В этом случае они обязательно должны быть перечислены в списке Праздники. Если они не перечислены — то все дни недели считаются рабочими, кроме праздников. Если указано как ИСТИНА, то в качестве выходных будут применены те дни, которые установлены для календаря в операционной системе. Для русской локализации это как правило Суббота и Воскресенье.

Последний рабочий день при помощи PowerQuery

Самый экзотический метод. Если еще не знаете что такое PowerQuery — Power Query — что такое и почему её необходимо использовать в работе?.
Для начала необходимо загрузить список праздников.

Если список праздников еще не преобразован в умную таблицу, то на листе Праздники выделяем все ячейки с датами -переходим на вкладку Вставка(Insert)Таблица(Table). Снимаем галку с пункта «Таблица с заголовками» —Ок:
Создание умной таблицы

Выделяем любую ячейку в созданной таблице праздников -переходим на вкладку Данные(Data или Power Query) и выбираем Из таблицы(From Table).
Нажимаем в заголовке на значок календаря и в выпадающем списке выбираем тип Дата:
Изменить тип на Дата
В правой части окна редактора изменяем название запроса(скорее всего там Таблица1) на Праздники:
Переименование запроса
Переходим на вкладку Главная, раскрываем пункт Закрыть и загрузить и выбираем Закрыть и загрузить в…:
Загрузить
В появившемся окне выбираем Только создать подключение и нажимаем Ок:
Создать подключение
Теперь переходим на вкладку Данные(Data) -Получить данные -Из других источников -Пустой запрос. Переходим в расширенный редактор(вкладка ГлавнаяРасширенный редактор):
Расширенный редактор
и вставляем туда следующий текст:

let
dNow = Date.From(DateTime.LocalNow()),
//dNow = Date.FromText(«2017-09-19»),
lastDay = Date.EndOfMonth(dNow),
WeekD = Date.DayOfWeek(lastDay,1),
dd = if WeekD < 5 then lastDay else Date.AddDays(lastDay,-(WeekD-4)),
//dd = dNow,
coun_dif = (value as date) as date =>
let
dAdd = value,
select_rows = Table.SelectRows(Праздники, each Record.Field(_, «Дата выходного дня») = dAdd),
count_rows = Table.RowCount(select_rows),
result = Date.AddDays(value,-count_rows)
in
result,
res_d = Table.FromValue(coun_dif(dd))
in
res_d

После этого можно на вкладке Главная нажать Закрыть и загрузить. Будет создан новый лист с одной ячейкой — датой последнего рабочего дня.
Чтобы приведенный запрос работал корректно, необходимо назвать столбец с праздничными датами «Дата выходного дня». Либо изменить это название в самом запросе.
Если нужен последний рабочий день на конкретную дату, то необходимо убрать первую строку(dNow = Date.From(DateTime.LocalNow()),) и убрать слеши вначале следующей строки:
let
dNow = Date.FromText(«2017-09-19»),
lastDay = Date.EndOfMonth(dNow),
WeekD = Date.DayOfWeek(lastDay,1),
dd = if WeekD < 5 then lastDay else Date.AddDays(lastDay,-(WeekD-4)),
//dd = Date.EndOfMonth(dNow),
coun_dif = (value as date) as date =>
let
dAdd = value,
select_rows = Table.SelectRows(Праздники, each Record.Field(_, «Дата выходного дня») = dAdd),
count_rows = Table.RowCount(select_rows),
result = Date.AddDays(value,-count_rows)
in
result,
res_d = Table.FromValue(coun_dif(dd))
in
res_d
Если выходные не надо учитывать(чтобы суббота и воскресенье не рассчитывались автоматом в зависимости от дня недели), то запрос будет выглядеть так:
let
dNow = Date.FromText(«2017-09-19»),
dd = Date.EndOfMonth(dNow),
coun_dif = (value as date) as date =>
let
dAdd = value,
select_rows = Table.SelectRows(Праздники, each Record.Field(_, «Дата выходного дня») = dAdd),
count_rows = Table.RowCount(select_rows),
result = Date.AddDays(value,-count_rows)
in
result,
res_d = Table.FromValue(coun_dif(dd))
in
res_d

Реализацию всех приведенных решений можно скачать в приложенном файле
Скачать файл:

  ПоследнийРабочийДень.xlsm (50,7 KiB, 617 скачиваний)


Статья помогла? Поделись ссылкой с друзьями!

  Плейлист   Видеоуроки


Поиск по меткам



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

Понравилась статья? Поделить с друзьями:
  • Vba excel поля страницы
  • Vba excel поля сводной таблицы
  • Vba excel поля листа
  • Vba excel пользовательский тип данных
  • Vba excel пользовательский диапазон