[[20230202205324]] 『カレンダー 土日祝に塗りつぶし』(ヒロ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『カレンダー 土日祝に塗りつぶし』(ヒロ)

1月
1 2 3 4 5
水 木 金 土 日

のカレンダーがあった時に土日祝の列にマクロで
塗りつぶしをしたい。教えてください。
全文検索とかで検索しましたがしましたがヒット
しませんでした。宜しくお願いします。
日付は表示形式で d
曜日は aaaになってます。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


ネットで 土日 祝日 塗りつぶし マクロ とかで調べれば出てくると思いますよ。
(フォーキー) 2023/02/02(木) 21:05:36

フォーキーさん
ありがとうございます。
ネットでも見ているのですが、いまいち分からなくて!
教えて頂けたらと思います
(ヒロ) 2023/02/02(木) 21:09:01

>いまいち分からなくて!
どの部分がどのようにわかりませんか?

さしあたって、完成してなくてよいので現状のコードを示した上で、

 【エラーが発生する場合】
××の箇所で、エラー番号○、エラーメッセージ○○が表示される。

 【エラーにならないが想定した動作でない場合】
○○になるはずが××になる

のように、具体的にわからない部分を説明できませんか?

(もこな2) 2023/02/02(木) 21:18:27


 条件付き書式ではダメですか?
(MK) 2023/02/02(木) 21:24:34

もなこ2さん MKさん
ありがとうございます。

条件書式では、出来てます。ので
マクロお願いしたいです。

もなこ2 さんのご指摘は その通りと
思いますが、こちらとしては 赤ペン先生は
のぞんでません。コードを教えてくださる方
お願いします。
(ヒロ) 2023/02/02(木) 22:19:10


 >赤ペン先生はのぞんでません。コードを教えて
 制作依頼ってやつですね!!
(おおっと) 2023/02/02(木) 22:38:02

最近はコ○ナラみたいな格安で作成してくれるサイトありますよね
(イーブイ) 2023/02/02(木) 23:20:28

 >最近はコ○ナラみたいな
って、ここ?
https://coconala.com/search
(4耐) 2023/02/03(金) 00:33:12

>コードを教えてくださる方
>お願いします。
マクロ記録でもしてみろや。
(J1*) 2023/02/03(金) 09:45:55

 日付はどのセル範囲に入力されていますか?
 祝日はどのシートのどのセル範囲に入力されていますか?

(稲葉) 2023/02/03(金) 09:53:37


エクセル・VBAというカテゴリーがあって
3000から5000円くらいが相場のようですね。
アプリケションレベルはもっと高いが。
ここはタダのようだから狙い目だね。ワハハ。 
(ワハハ) 2023/02/03(金) 10:00:31

 ネットで検索すると例えば

 エクセルVBAでカレンダーシートの土日祝日の行に背景色をつける方法
https://tonari-it.com/excel-vba-holiday-interior-color/

 と、コードを提示してくれているサイトがあるので、 
 まずは、このサイトを読んで、もしわからないところがあれば、
 質問してみるといいんじゃないでしょうか

 クッキングスルールにいって、作り方の説明はいらないから完成品くださいっていったら
 レストランいけばいいんじゃないって話になりますよね...
(´・ω・`) 2023/02/03(金) 10:06:21

>コードを教えてくださる方お願いします。
わかりました。私は作成依頼に興味がないので、ほかの回答者さんをお待ちください。

なお、「条件書式では、出来てます。」とのことですから、マクロで"条件付き書式"を設定するというアプローチも可能だとおもいます。(必要な命令は【マクロの記録】で調べることができます)

さらに、条件付き書式でできているということは、どこかに祝日リストが用意されていて、2行目?の数字を日付として解釈できる土台があるということでしょうから、1列目から順番に「祝日リストに存在する」or「月曜はじまりのWeekday関数の結果が6以上になる」という条件を満たせば【(該当行の)セルに色を塗る】というループ処理にすればよいと思います。

作成依頼に応じてくれる人が現れず、自分で作ってみようと考え直したのであれば、先に述べたようにコードを示してどこで詰まっているのが具体的に説明して"質問"されるとよいとおもいます。

(もこな2) 2023/02/03(金) 10:08:14


 意味不明な書き込みが多いなぁ。

 制作依頼の何が問題なんだ?

 あと、ここは教室でもなければ、職場でもないけどね。

 気にくわなければスルーすればいいだけじゃないの?
 私も、条件付き書式で出来ているならVBAでやる必要性を感じないのでスルーだけども。

(半平太) 2023/02/03(金) 10:37:03


 沢山の人が使う条件付き書式って、コピペでめっちゃ崩れるから結構土日の色付けはVBAでやっちゃってます。
 シートの保護で条件付き書式だけ保護してくれればいいんですけどねぇ
 なのでセル位置だけ教えてくれれば書いてみたいんですけど・・・
(稲葉) 2023/02/03(金) 10:43:10

 >制作依頼の何が問題なんだ?

 それがすんなり通ったら、上にある
 校内全文検索、過去ログ、よくある質問、ライブラリ、関数、エラー値、ExcelPedia
 いらね!
 自分で全てのマクロただで請け負いますってつくったら。
(偽善者) 2023/02/03(金) 10:59:35

 >それがすんなり通ったら、上にある
 >校内全文検索、過去ログ、よくある質問、ライブラリ、関数、エラー値、ExcelPedia
 >いらね!

 なぜそれを質問者に対してレスしないのだ?

(MK) 2023/02/03(金) 11:09:12


色、範囲、日付一覧は適宜修正してください。

 Sub Sample()
 '日付情報をもとにセルの背景色を塗りつぶす
   Dim 対象範囲 As Range
   Dim 日付一覧 As Variant
   Dim 土曜色   As Long
   Dim 日曜色   As Long
   Dim 祝日色   As Long
   '↓塗りつぶし色を設定
   土曜色 = RGB(128, 224, 255)
   日曜色 = RGB(255, 96, 64)
   祝日色 = RGB(255, 96, 64)
   '↓日付を列挙
   日付一覧 = Array("1/1", "2/11", "2/23")
   '↓塗りつぶし対象範囲を設定
   Set 対象範囲 = Range("A2:G7")
   '↓塗りつぶし対象範囲の既存の背景色をリセット
   対象範囲.Interior.Color = xlNone

   Dim Rng As Range
   '↓対象範囲内のセルを一つずつ巡回
   For Each Rng In 対象範囲
     If Rng.Value = "" Then
     '↓セルの値が日付一覧の"月/日"と同じものがあったら
     ElseIf IsNumeric(Application.Match(Format(Rng.Value, "m/d"), 日付一覧, 0)) Then
       '↓セルの背景に色付け
       Rng.Interior.Color = 祝日色
     '↓セル値の日付の曜日が日曜日(=1)なら
     ElseIf Weekday(Rng.Value) = 1 Then
       '↓セルの背景に色付け
       Rng.Interior.Color = 日曜色
     '↓セル値の日付の曜日が土曜日(=7)なら
     ElseIf Weekday(Rng.Value) = 7 Then
       '↓セルの背景に色付け
       Rng.Interior.Color = 土曜色
     End If
   Next
 End Sub

(ふなば) 2023/02/03(金) 11:31:56


皆様貴重なご意見ありがとうございます。
通りすがりの人もいますが?

ふなばさん

コード提供ありがとうございます。

稲葉さん

日付けはS9以降右に
曜日はS10以降右に
祝日シートを用意して、A列にリストは
入っています。
お願いできます?
(ヒロ) 2023/02/03(金) 12:57:09


 塗りたくる範囲とかわかんなかったんで、適当に列を丸ごとです。

    Sub 色付け()
        Dim ws日付 As Worksheet: Set ws日付 = Sheets("Sheet1")
        Dim ary祝日 As Variant
        Dim r As Range
        Dim rngColor As Range
        Dim buf As Variant
        Dim Is休日 As Boolean
        With Sheets("祝日")
            '[祝日リストを取得し、一次配列にする]
            ary祝日 = Application.Transpose(.Range("A1", .Cells(Rows.Count, "A").End(xlUp)).Value)
        End With
        With ws日付
            '[色のリセット]
            .Cells.Interior.Color = xlNone
            '[S9からCtrl+→までの範囲を対象]
            For Each r In .Range("S9", .Range("S9").End(xlToRight))
                Is休日 = False
                Select Case True
                    Case InStr("土日", r.Offset(1).Value) > 0
                        Is休日 = True
                    Case UBound(Filter(ary祝日, Format$(r.Value, "yyyy/m/d"), True)) > -1
                        Is休日 = True
                End Select
                'https://itsakura.com/html-color-codes
                If Is休日 Then r.EntireColumn.Interior.Color = rgbAliceBlue
            Next r
        End With
    End Sub

 日付シート
     |[S]   |[T]   |[U]   |[V]   |[W]   |[X]   |[Y]   |[Z]   |[AA]  
 [9] |1月1日|1月2日|1月3日|1月4日|1月5日|1月6日|1月7日|1月8日|1月9日
 [10]|日    |月    |火    |水    |木    |金    |土    |日    |月    

 祝日シート
    |[A]   
 [1]|祝日  
 [2]|1月1日
 [3]|1月9日

 こんな感じのテスト環境つくって試しました
(稲葉) 2023/02/03(金) 15:15:30

仕様に合わせて少し直しました。
S9セル基準で10行×31列のセルの先頭行の値をもとに列ごとに色付けする仕様です。

 Sub Sample()
 '日付情報をもとにセルの背景色を塗りつぶす
   Dim 対象範囲 As Range
   Dim 日付一覧 As Range
   Dim 土曜色   As Long
   Dim 日曜色   As Long
   Dim 祝日色   As Long
   '↓塗りつぶし色を設定
   土曜色 = RGB(128, 224, 255)
   日曜色 = RGB(255, 96, 64)
   祝日色 = RGB(255, 96, 64)
   '↓日付一覧のあるセル範囲を指定
   Set 日付一覧 = Worksheets("祝日シート").UsedRange.Columns(1)
   '↓塗りつぶし対象範囲を設定(例示はS9セルを基準に10行31列)
   Set 対象範囲 = Range("S9").Resize(10, 31)
   '↓塗りつぶし対象範囲の既存の背景色をリセット
   対象範囲.Interior.Color = xlNone
   Dim Rng As Range
   Dim buf As Long
   Dim セルの色 As Long
   '↓対象範囲内のセルを一列ずつ巡回
   For Each Rng In 対象範囲.Columns
     '↓列の1行目の値を変数bufに格納
     buf = Rng.Cells(1).Value
     Select Case True
       '↓セルの値が日付一覧と同じものがあったら
       Case IsNumeric(Application.Match(buf, 日付一覧, 0)): セルの色 = 祝日色
       '↓セル値の日付の曜日が日曜日(=1)なら
       Case Weekday(buf) = 1:                               セルの色 = 日曜色
       '↓セル値の日付の曜日が土曜日(=7)なら
       Case Weekday(buf) = 7:                               セルの色 = 土曜色
       '↓上記以外
       Case Else:                                           セルの色 = xlNone
     End Select
     '↓セルの背景に色付け
     Rng.Interior.Color = セルの色
   Next
 End Sub
(ふなば) 2023/02/03(金) 17:51:50

こちらの意図としては"私は"作成依頼に興味がないという話であって、この掲示板では作成依頼は特に禁止していないとおもいます。
荒れてしまったのでもう見てないかもですが「2023/02/03(金) 10:08:14」にコメントしたとおり、下記のようにすればそんな難しい話ではないと感じます。気が向いたら研究してみてください。
    Sub 実験用ブック生成()
        With Workbooks.Add
            .Worksheets.Add(after:=.Worksheets(.Worksheets.Count)).Name = "祝日リスト"
            .Worksheets("祝日リスト").Range("A2").Value = #1/1/2023#
            .Worksheets("祝日リスト").Range("A3").Value = #1/10/2023#
            .Worksheets("祝日リスト").Range("A4").Value = #1/12/2023#

            With .Worksheets(1).Range("A2")
                .Value = #1/1/2023#
                .NumberFormatLocal = "d"
                .AutoFill Destination:=.Resize(, 31), Type:=xlFillDefault
                .Resize(, 31).Offset(1).Formula = "=A2"
                .Resize(, 31).Offset(1).NumberFormatLocal = "aaa"
            End With
            .Worksheets(1).Cells.EntireColumn.AutoFit
            .Worksheets(1).Activate
        End With
    End Sub
    '=========================================
    Sub 条件付き書式を設定()
        ActiveSheet.Range("A6:AE6").FormatConditions.Add( _
            Type:=xlExpression, _
            Formula1:="=COUNTIF(祝日リスト!$A:$A,A$2)+IF(WEEKDAY(A$2,2)>=6,1,0)") _
            .Interior.Color = vbRed
    End Sub
    '=========================================
    Sub ループ処理()
        Dim 列 As Long
        With ActiveSheet
            For 列 = 1 To .Cells(2, .Columns.Count).End(xlToLeft).Column
                If WorksheetFunction.CountIf(.Parent.Worksheets("祝日リスト").Columns(1), .Cells(2, 列).Value) > 0 Or _
                    Weekday(.Cells(2, 列).Value, vbMonday) >= 6 Then
                        .Cells(4, 列).Interior.Color = vbBlue
                End If
            Next 列
        End With
    End Sub

(もこな2) 2023/02/03(金) 17:54:31


〉荒れてしまったのでもう見てないかもですが
嫌々、見てます。

せっかく コードを提供くださった方々 ありがとうございます。
一言お礼のコメントです。

早速コードを使用したいと思います。
また、研究もします(*^^*)
(ヒロ) 2023/02/03(金) 20:41:55


教えてください。
稲葉さんのコードで、s9からz100までを色付け対象にした時にコード的に
どのように記述するのでしょうか?
        For Each r In .Range("S9", .Range("S9").End(xlToRight))
この部分とは思いますが?
後 土日が反映されてないのですが?祝日リストに 土日の日付はいれないですよね!?
教えてください。稲葉様

(ヒロ) 2023/02/28(火) 20:21:56


        For Each r In .Range("S9:Z9"))
 に変更

 If Is休日 Then r.EntireColumn.Interior.Color = rgbAliceBlue
 を
 If Is休日 Then r.Resize(100 - 9).Interior.Color = rgbAliceBlue 'S9から(100行 - 9行 + 1行)分範囲を広げる

 >後 土日が反映されてないのですが?祝日リストに 土日の日付はいれないですよね!?
 10行目が文字列としていることを前提としていたので、書式設定で土日に「見える」ようになっている場合
 >r.Offset(1).Value
 を
 r.Offset(1).Text
 に変更すればたぶん大丈夫。
(稲葉) 2023/03/01(水) 09:19:27

 あ、ミスった
        For Each r In .Range("S9:Z9"))
     → For Each r In .Range("S9:Z9")

   If Is休日 Then r.Resize(100 - 9).Interior.Color = rgbAliceBlue 
 →If Is休日 Then r.Resize(100 - 9 + 1).Interior.Color = rgbAliceBlue 
(稲葉) 2023/03/01(水) 09:20:56

稲葉さん

ありがとうございます。
土日の色付けがうまくいきません。
何か問題ありますでしょうか?
(ヒロ) 2023/03/01(水) 19:21:26


 For Eachの下に
 Debug.Print r.Offset(1).Text
 といれて、イミディエイトウィンドウに何が表示されるか確認してください。
https://www.excelspeedup.com/vbadebug/

 正確な情報がないとこちらもわからんです。
(稲葉) 2023/03/01(水) 20:16:06

稲葉さん
ありがとうごうざいます。
確認しました。
表示は、月〜金まで表示されています。
おねがいします。
(ヒロ) 2023/03/02(木) 08:47:20

 >表示は、月〜金まで表示されています。
 ってことは土日ないんじゃ?
 Case InStr("土日", r.Offset(1).Value) > 0
 ↑を
 Case InStr("土日", Format$(r.Value, "aaa")) > 0
 に変更して、動かないようなら私にはわかりませんので他の方の回答お待ちください。
(稲葉) 2023/03/02(木) 09:11:03

稲葉さん

確認しました。上手くいきました。
ありがとうございます。
質問です、 r.Resize(100 - 9 + 1) ここで の
カッコの中の意味を教えていただきたいです。
今までお付き合いくださりありがとうございます。
(ヒロ) 2023/03/02(木) 12:17:42


 (稲葉) 2023/03/01(水) 09:19:27
 に書いてあります
(稲葉) 2023/03/02(木) 13:02:03

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.