Excel VBA 質問スレッド №2069 (未解決)

カレンダー制作について

投稿者 : 団子     投稿日時 : 2025/01/16(Thu) 13:56:24     OS : Windows 11     EXCEL : Office 365
『カレンダー制作について』(カフェ俺)
日付や日付によって色が変わるようなカレンダーをマクロで制作する場合、どのようなコードを立てればいいでしょうか?

カレンダーのイメージは、Windowsの右下から見えるカレンダーのような感じです。


前提:
年(D3セル)と、月(DEセル)を好きな数字で入力すれば一瞬で(B7:H12)のセルがその年/月に当てはまる日付に書き直されるようなコードを立てたい。
※ちなみに(B5:H5セル)に日曜から始まり、土曜日までが書かれているとする。よって、B列は日、C列は月、D列は火、E列は水、F列は木、G列は金、H列は土曜となる。


さらに、(B7:H12)セルの間に、その月だけの日付だけでなく、前月と来月の日付も反映されるようにしたい。

例えば、年セル(D3)に2025、月セル(E3)に1と書き換えたとしたら、(B7セル)は2024年12月29日(日曜日)から始まり、(E7セル)は2025年1月1日となり、(H12セル)は2025年2月の8日(土曜日)で終わるように。


?@そして、その入力された数字に、以下の要件を搭載したコードを反映させたい。
要件:
年/月に応じて、カレンダーの数値を入力するマクロは基本的な色分けは以下の通りとする。
平日:黒
土曜日:青色 (RGB(0,0,255))
日曜日、祝日:赤色(RGB(255,0,0))
土曜日の祝日:赤色を優先
前月、翌月の表示:灰色(祝日も全て灰色を優先する)RGB(200,200,200)
主に使用するメソッド
if
for
DateSerial:数値をdate型に変更
?Aさらに祝日名も反映させたい。
祝日は別に祝日シートがある状態です。
※余談として、すでに下のように(B7:H12)に1.2.3…と数字が入力されるコードは立てられている。
Sub practice_14_1()

    For i = 1 To 7
    For j = 1 To 7
 Cells(i + 6, j + 1).Value = j + (i - 1) * 7

  Next j
  Next i
End Sub
dateserialを使うと聞いたのですが全く分からず、、
分かりづらく、難しいと思うのですがよろしくお願いします。



< 使用 Excel:Microsoft365、使用 OS:Windows11 >

スポンサーリンク
[返信 1] Re : カレンダー制作について
投稿者 : 何何     投稿日時 : 2025/01/16(Thu) 14:17:11
>年(D3セル)と、月(DEセル)を好きな数字で入力すれば一瞬で(B7:H12)のセルがその年/月に当てはまる日付に書き直されるようなコードを立てたい。

まずは、これを数式で表示されるように考えては、考え方のきっかけになるかと
参考
ht tps://addinbox.sakura.ne.jp/CalendarTopic.htm#BOX

[返信 2] Re : カレンダー制作について
投稿者 : 何何     投稿日時 : 2025/01/16(Thu) 14:20:47
マルチでした
https://www.excel.studio-kazu.jp/cgi-bin/kazuwiki2.cgi

[返信 3] Re : カレンダー制作について
投稿者 : 何何     投稿日時 : 2025/01/16(Thu) 14:58:48
http://www.vbalab.sakura.ne.jp/vbaqa/c-board.cgi?cmd=one;no=182;id=FAQ


B1に西暦年を書いておく
コードを張り付けたときエラーになるのでコメントにする

' ↑ ↑
'11月と12月は位置をづらして入れ替えてあります

[返信 4] Re : カレンダー制作について
投稿者 : さんこう     投稿日時 : 2025/01/16(Thu) 16:52:23
謎がおおいですが、参考になれば。

'シートモジュールへ
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$D$3" Or Target.Address = "$E$3" Then
        Range("B7:H12").ShrinkToFit = True
        y = DateSerial(Range("D3"), Range("E3"), 1)
        d = y - Weekday(y) + 1
        For r = 0 To 5
            For c = 0 To 6
                Cells(r + 7, c + 2) = Day(d)
                If r = 0 And c = 0 Then Cells(r + 7, c + 2) = Format(d, "yyyy年m月d日(aaaa)")
                If Month(d) = Range("E3") And Day(d) = 1 Then Cells(r + 7, c + 2) = Format(d, "yyyy年m月d日")
                If r = 5 And c = 6 Then Cells(r + 7, c + 2) = Format(d, "yyyy年m月のd日(aaaa)")
                
                With Cells(r + 7, c + 2).Font
                    Select Case Weekday(d)
                        Case 1: .Color = RGB(255, 0, 0)
                        Case 2: .Color = vbBlack
                        Case 3: .Color = vbBlack
                        Case 4: .Color = vbBlack
                        Case 5: .Color = vbBlack
                        Case 6: .Color = vbBlack
                        Case 7: .Color = RGB(0, 0, 255)
                    End Select
                    'If d = 祝日 Then .Color = RGB(0, 0, 255)
                    If Month(d) <> Range("E3") Then .Color = RGB(200, 200, 200)
                End With
                d = d + 1
                For i = 1 To 1000: DoEvents: Next
            Next
        Next
    End If
End Sub


※「if」「for」「DateSerial」というメソッドは知らないので使っていません。
※「祝日名も反映させたい」とのことですが、どこに反映させればいいのか不明なので無視しています
※「祝日は別に祝日シートがある状態です」だけでは、どのように祝日を取得すればいいのか不明なので、祝日の色分けに対応していません

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2025-02-07 23:28:01 )
タイトルとURLをコピーしました