Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню Заметки | VBA: Как получить название дня недели


Rambler's Top100


Counter CO.KZ


Вариант I.
Для получения названия дня можно воспользоваться функцией Format и форматом даты DDDD.
DayNameLocal = Format(Now, "DDDD")
Если Вам необходимо, чтобы день недели начинался с прописной буквы, то используйте любой вариант из данного совета [FAQ37]

Пример получения имени дня в виде пользовательской функции, а также вызов этой функции.
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) для указанной даты.
DayNameRus = Choose(WeekDay(Now, vbMonday), _
"Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")
Пример получения имени дня в виде пользовательской функции, а также вызов этой функции.
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).
DayNameRus = Array("", "Понедельник", "Вторник", "Среда", _
"Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday))
DayNameRus = Array("Понедельник", "Вторник", "Среда", _
"Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday) - 1)
DayNameRus = Array("Воскресенье", "Понедельник", _
"Вторник", "Среда", "Четверг", "Пятница", "Суббота")(WeekDay(iDate) - 1)
Несколько однотипных примеров получения дня недели, оформленных в виде функций.
Private Sub GetDayName()
    MsgBox DayNameRus(#7/22/2005#), , "День:"
End Sub

Private Function DayNameRus$(iDate As Date)
    DayNameRus$ = Array("", "Понедельник", "Вторник", _
    "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday))
End Function
Private Sub GetDayName()
    MsgBox DayNameRus(#7/22/2005#), , "День:"
End Sub

Private Function DayNameRus$(iDate As Date)
    DayNameRus$ = Array("Понедельник", "Вторник", "Среда", _
    "Четверг", "Пятница", "Суббота", "Воскресенье")(WeekDay(iDate, vbMonday) - 1)
End Function
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
DayNameLocal = WeekdayName(Weekday(Now, vbMonday))
Пример получения дня недели с помощью функции WeekdayName (XL 2000 и старше)
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
Комментарий : Если Вам необходимо просто получить перечень всех дней недели, т.е. без привязки к конкретной дате, то используйте следующий вариант (обратите внимание на строку, позволяющую получить название дня с прописной буквы, возможно она окажется Вам полезна ... или же наоборот)
For iDay = 1 To 7
    DayNameLocal = WeekdayName(iDay) 'понедельник
    Mid(DayNameLocal, 1, 1) = UCase(DayNameLocal) 'Понедельник
    MsgBox DayNameLocal 'WeekdayName(iDay)
Next


Вариант V.
Кроме того, можно воспользоваться одним из четырёх стандартных списков MS Excel, однако, есть опасение, что ранние версии, например, XL97 будут возвращать название дня недели в английском варианте (вне зависимости от того руссифицирован Ваш офис или нет)
DayNameLocal = Application.GetCustomListContents(2)(Weekday(Now, vbMonday))
Обратите внимание на метод GetCustomListContents об'екта Application, который возвращает массив всех дней недели, что позволяет обойтись без цикла, например, при заполнении ComboBox или ListBox
ComboBox1.List = Application.GetCustomListContents(1)
ListBox1.List = Application.GetCustomListContents(2)


Вариант VI.
Для получения названия дня в английском варианте (т.е. вне зависимости от того руссифицирован Ваш офис или нет) можно использовать стандартную функцию рабочего листа =ТЕКСТ()
DayNameEng = Application.Text(Now, "DDDD")
DayNameEng = WorksheetFunction.Text(Date, "DDDD")
DayNameEng = [TEXT(TODAY(),"DDDD")]
и т.д.

Вариант VII.
Кроме того, можно воспользоваться WinAPI, т.е.
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




Примеры можно скачать здесь




Автор : Климов Павел Юрьевич
© 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff