Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [VBA] Вывести календарь на заданный месяц 
V
    Опции темы
Tati
  Дата 29.11.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Помогите пожалуйста!!!!
Надо решить задачку "Вывести календарь на заданный месяц"

При этом использовать константы для всех символов и чисел, используемых в программе,   например:

Const NFP as String = "ФИО"
или
Const HeaderLine as String = "ФИО                     Р.и.Класс"

PM MAIL   Вверх
Aloha
Дата 30.11.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
**


Профиль
Группа: Участник Клуба
Сообщений: 351
Регистрация: 14.5.2006

Репутация: 97
Всего: 165



Tati
Вот два варианта. Первый выводит список дней месяца с указанием дня недели, второй – календарь на месяц в виде таблицы. Единственная константа, которая потребовалась – количество дней в неделе: Const c_DAYSINWEEK As Integer = 7. Все остальное делают встроенные функции для работы с датой:
Код
DateValue()
Day()
Weekday()
WeekdayName()
Month()
MonthName()
Year()


Код
Sub s_01()
  Dim v_Year As Integer, v_Month As Integer
  Dim v_Date As Long
  Dim v_FirstDayOfMonth As Date
  Dim v_Str As String
  
  v_Year = CInt(Val(InputBox("Введите год", "Ввод данных")))
  v_Month = CInt(Val(InputBox("Введите номер месяца", "Ввод данных")))
  On Error GoTo ErrorHandler
  v_FirstDayOfMonth = DateValue("1/" & v_Month & "/" & v_Year)
  v_Date = CLng(v_FirstDayOfMonth)
  
  v_Str = MonthName(Month(CLng(v_FirstDayOfMonth))) & String(14, "_") & Year(v_FirstDayOfMonth)
  v_Str = v_Str & vbCrLf
  Do While Month(v_Date) <= v_Month
    v_Str = v_Str & Day(v_Date) & " " & _
            WeekdayName(Weekday(v_Date, vbMonday), False, vbMonday)
    v_Str = v_Str & vbCrLf
    v_Date = v_Date + 1
  Loop
  MsgBox v_Str
Exit Sub
ErrorHandler:
End Sub


По просьбе Tati добавил комментарии:

Код
Const c_DAYINWEEK As Integer = 7 ' в неделе 7 дней
Sub s_02()
  Dim v_Year As Integer, v_Month As Integer, n As Integer
  Dim v_Date As Long
  Dim v_Str As String
  
  ' вводим год
  v_Year = CInt(Val(InputBox("Введите год", "Ввод данных")))
  ' вводим месяц как число
  v_Month = CInt(Val(InputBox("Введите номер месяца", "Ввод данных")))
  On Error GoTo ErrorHandler
  ' используя функцию DateValue() "собираем" первое число нужного месяца
  v_Date = CLng(DateValue("1/" & v_Month & "/" & v_Year))
  ' начинаем формировать строку вывода: функция MonthName() возвращает
  ' название месяца как строку, функция String(n, chr) возвращает строку из
  ' n раз повторенных символов chr
  v_Str = MonthName(v_Month) & String(14, "_") & v_Year
  ' добавляем строку "_________________" (с новой строки)
  v_Str = v_Str & vbCrLf & String(24, "_") & vbCrLf
  ' используя функцию WeekdayName() собираем строку аббревиатур дней недели:
  ' "Пн   Вт   Ср   Чт   Пт   Сб   Вс"
  For n = 1 To c_DAYINWEEK
    v_Str = v_Str & WeekdayName(n, True, vbMonday) & "   "
  Next n
   ' добавляем строку "_________________" (с новой строки)
  v_Str = v_Str & vbCrLf & String(24, "_") & vbCrLf
  ' если 1-й день месяца не понедельник (т.е. не первый день недели)
  ' то собираем строку вида: "__   __   __   __   "
  ' функция Weekday() возвращает номер дня недели
  If Weekday(v_Date, vbMonday) > 1 Then
    For n = 1 To Weekday(v_Date, vbMonday) - 1
      v_Str = v_Str & "__" & Space(3) ' функция Space(n) возвращает строку из n пробелов
    Next n
  End If
  ' формируем основную таблицу календаря
  ' увеличивая текущую дату на 1, продолжаем цикл пока дата находится
  ' в пределах нашего месяца. функция Month() возвращает номер месяца
  Do While Month(v_Date) = v_Month
    ' к строке вывода добавляем конструкцию вида: "_#   " если дата,
    ' число, меньшее 10, либо: "##   " в противном случае
    v_Str = v_Str & Right("_" & CStr(Day(v_Date)), 2) & Space(3)
    ' если день недели текущей даты равен 7, то переходим на новую строку
    If Weekday(v_Date, vbMonday) = 7 Then v_Str = v_Str & vbCrLf
    ' увеличиваем текущую дату
    v_Date = v_Date + 1
  Loop
  ' выводим календарь
  MsgBox v_Str
Exit Sub
ErrorHandler:
End Sub


Будут вопросы - пиши в личку

Это сообщение отредактировал(а) Aloha - 22.12.2006, 20:57
PM   Вверх
Tati
Дата 1.12.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Спасибо!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.