Как получить название дня недели

Вариант I. Для получения названия дня можно воспользоваться функцией Format и форматом даты DDDD.
code: #vba
DayNameLocal = Format(Now, "DDDD")
Если Вам необходимо, чтобы день недели начинался с прописной буквы, то используйте любой вариант из данного совета [FAQ37] Пример получения имени дня в виде пользовательской функции, а также вызов этой функции
code: #vba
Private Sub GetDayName() 
    MsgBox DayNameLocal(#5/22/2005#), , "День:" 
End Sub 
 
Private Function DayNameLocal$(iDate As Date) 
    DayNameLocal$ = StrConv(Format(iDate, "DDDD"), vbProperCase) 
End Function
Вариант II. Для получения название дня также можно воспользоваться функциями Choose и WeekDay. Первая функция используется для того, чтобы возвратить значение из списка, используя его индекс(номер), а номер определяется с помощью второй функции, которая возвращает номер дня (число от 1 до 7) для указанной даты.
code: #vba
DayNameRus = Choose(WeekDay(Now, vbMonday), _ 
"Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")
Пример получения имени дня в виде пользовательской функции, а также вызов этой функции.
code: #vba
Private Sub GetDayName() 
    MsgBox DayNameRus(#1/22/2005#), , "День:" 
End Sub 
 
Private Function DayNameRus$(iDate As Date) 
    DayNameRus$ = Choose(WeekDay(iDate, vbMonday), _ 
    "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье") 
End Function
Вариант III. Для решения поставленной задачи можно также воспользоваться функциями Array и WeekDay. Первая функция используется для того, чтобы возвратить массив всех дней недели. Нужный день(элемент массива) выбирается путём указания необходимого индекса, который представляет собой номер дня (число от 1 до 7).
code: #vba
DayNameRus = Array("", "Понедельник", "Вторник", "Среда", _ 
"Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday))
code: #vba
DayNameRus = Array("Понедельник", "Вторник", "Среда", _ 
"Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday) - 1)
code: #vba
DayNameRus = Array("Воскресенье", "Понедельник", _ 
"Вторник", "Среда", "Четверг", "Пятница", "Суббота")(WeekDay(iDate) - 1)
Несколько однотипных примеров получения дня недели, оформленных в виде функций.
code: #vba
Private Sub GetDayName() 
    MsgBox DayNameRus(#7/22/2005#), , "День:" 
End Sub 
 
Private Function DayNameRus$(iDate As Date) 
    DayNameRus$ = Array("", "Понедельник", "Вторник", _ 
    "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday)) 
End Function
code: #vba
Private Sub GetDayName() 
    MsgBox DayNameRus(#7/22/2005#), , "День:" 
End Sub 
 
Private Function DayNameRus$(iDate As Date) 
    DayNameRus$ = Array("Понедельник", "Вторник", "Среда", _ 
    "Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday) - 1) 
End Function
code: #vba
Option Base 1 
 
Private Sub GetDayName() 
    MsgBox DayNameRus(#7/22/2005#), , "День:" 
End Sub 
 
Private Function DayNameRus$(iDate As Date) 
    DayNameRus$ = Array("Понедельник", "Вторник", _ 
    "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday)) 
End Function
Вариант IV. Также можно воспользоваться функцией WeekDayName, но необходимо учитывать тот факт, что эта функция появилась только в Microsoft Excel 2000
code: #vba
DayNameLocal = WeekdayName(Weekday(Now, vbMonday))
Пример получения дня недели с помощью функции WeekdayName (XL 2000 и старше)
code: #vba
Private Sub GetDayName() 
    MsgBox DayNameLocal(#8/15/2005#), , "День:" 
End Sub 
 
Private Function DayNameLocal$(iDate As Date) 
    DayNameLocal$ = WeekdayName(Weekday(iDate, vbMonday)) 
    ' Только для Microsoft Excel 2000 и старше 
End Function
Если Вам необходимо просто получить перечень всех дней недели, т.е. без привязки к конкретной дате, то используйте следующий вариант (обратите внимание на строку, позволяющую получить название дня с прописной буквы, возможно она окажется Вам полезна ... или же наоборот)
code: #vba
For iDay = 1 To 7 
    DayNameLocal = WeekdayName(iDay) 'понедельник 
    Mid(DayNameLocal, 1, 1) = UCase(DayNameLocal) 'Понедельник 
    MsgBox DayNameLocal 'WeekdayName(iDay) 
Next
Вариант V. Кроме того, можно воспользоваться одним из четырёх стандартных списков MS Excel, однако, есть опасение, что ранние версии, например, XL97 будут возвращать название дня недели в английском варианте (вне зависимости от того руссифицирован Ваш офис или нет)
code: #vba
DayNameLocal = Application.GetCustomListContents(2)(Weekday(Now, vbMonday))
Обратите внимание на метод GetCustomListContents об'екта Application, который возвращает массив всех дней недели, что позволяет обойтись без цикла, например, при заполнении ComboBox или ListBox
code: #vba
ComboBox1.List = Application.GetCustomListContents(1)
code: #vba
ListBox1.List = Application.GetCustomListContents(2)
Вариант VI. Для получения названия дня в английском варианте (т.е. вне зависимости от того руссифицирован Ваш офис или нет) можно использовать стандартную функцию рабочего листа =ТЕКСТ()
code: #vba
DayNameEng = Application.Text(Now, "DDDD")
code: #vba
DayNameEng = WorksheetFunction.Text(Date, "DDDD")
code: #vba
DayNameEng = [TEXT(TODAY(),"DDDD")]
и т.д. Вариант VII. Кроме того, можно воспользоваться WinAPI, т.е.
code: #vba
Private Declare Sub VarWeekdayName Lib "oleaut32.dll" ( _ 
        ByVal iWeekday As Long, _ 
        ByVal fAbbrev As Long, _ 
        ByVal iFirstDay As Long, _ 
        ByVal dwFlags As Long, _ 
        ByRef pbstrOut As String) 
 
Private Function DayNameLocal$(iDate As Date) 
    VarWeekdayName Weekday(iDate), 0&, 1&, 0&, DayNameLocal 
    'VarWeekdayName Weekday(iDate, vbMonday), 0&, 0&, 0&, DayNameLocal 
    'fAbbrev = 0& - вторник; = 1& - Вт 

    DayNameLocal = StrConv(DayNameLocal, vbFromUnicode) 
End Function 
 
Private Sub GetDayName() 
    MsgBox DayNameLocal(Now), , "День:" 
End Sub

автор: Климов Павел Юрьевич

Поделиться:

Похожие статьи: