[[20251101183528]] 『日にちについて』(たな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『日にちについて』(たな)

土日祝と12月28〜1月3日までを除いた平日のみの日付表を簡単に作ることはできますか??

また、そのカレンダーを元に当日から翌日や、1日前、3日後などの日付を別の表を作って表示させることは可能ですか?

よろしくお願いいたします。

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


1.内閣府の国民の休日をCSVにしたものがアップされていますので
  それをDLしたものに独自の休日を追加した休日マスタを基に
  作成すれば、数十年以前と現時点から1年先までなら簡単だった
  ような気がします。
2.1.を利用する範囲なら指定日、期間等を表示することは可能です。

ボタンポチで済ますならVBAがお勧めです。。。^^;
でわ
m(__)m
(隠居Z) 2025/11/01(土) 19:07:41


まず年号を変えるだけで済む万部年カレンダーが作れることが先では・・・
あとはそれの応用では
(不明) 2025/11/01(土) 19:34:26

 内閣府「国民の祝日」について
 https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
 ※2026年の祝日一覧の後にCSVへのリンクがある。
 ダウンロードして必要な祝日を抜き出し、祝日リストを作成する。
 今回は例として2025年〜2026年の祝日に、2025年12月28日〜2026年1月3日を加えたものをD列に用意した。

 任意のシートのA1に2025/12/1、B1に
 =LET(a,SEQUENCE(60,,A1),FILTER(a,NETWORKDAYS(a,a,D1:D43)))
 ※SEQUENCE(60 の60は開始日から60日(土日祝含む)なので、ここを任意に変更する。
 ※祝日リストの範囲は名前の定義を使用することもできる。
(メントス) 2025/11/01(土) 20:01:30

 直接の質問への回答になってなくてすみません。
 前の方が回答した内容が、参考になりそうだったのでカレンダーを作成する部分だけをAIに聞いてみました。

 最初バージョンに起因するエラーが出ましたが、エラー修正する指示をし、3回目の修正で完動するコードになりました。

 【プロンプト】
 https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv をデータソースとして、PowerQueryで読み込み、日祝日を赤色文字にした今年と来年のカレンダーを作成するマクロを作成してください。
 CSV のファイルはSJISです。
 A:G列に日曜〜土曜を配置(週単位)として作成してください。

 【回答出力】
 以下は、
 ・内閣府の祝日CSV(Shift_JIS) を Power Query で読み込み、
 ・今年(=今年の1月〜12月)と来年(=翌年1月〜12月)のカレンダー を作成し、
 ・A:G列に日曜〜土曜を配置(週単位)
 ・祝日・日曜日を赤字表示
 する Excel VBAマクロ のコードです。

 🔧 実行手順
 Excelを開き、Alt + F11 → 「標準モジュール」を挿入。
 上記コードを貼り付ける。
 Excelに戻って Alt + F8 → CreateCalendar を実行。

 💡 結果
 新しいシート「Calendar」が作成され、
 A:G列が日曜〜土曜
 各行が1週間分
 日曜と祝日が赤字
 祝日はセルコメントで名称付き
 J列以降にPower Query経由で祝日リストが自動取得されます。
 必要があれば、「月ごとに区切る」「翌年を別シートに出力」なども拡張できます。
 ご希望ありますか?

 Option Explicit
 ' --- メインマクロ ---
 Sub CreateCalendar()
    Dim ws As Worksheet
    Dim holidays As Object ' Dictionary
    Dim url As String
    Dim ok As Boolean
    Dim lastRow As Long, i As Long
    Dim yearNow As Long, yearNext As Long
    Dim dateStart As Date, dateEnd As Date
    Dim curDate As Date
    Dim rowPos As Long, colPos As Long

    '=== 1. シート設定 ===
    On Error Resume Next
    Set ws = ThisWorkbook.Worksheets("Calendar")
    If ws Is Nothing Then
        Set ws = ThisWorkbook.Worksheets.Add
        ws.Name = "Calendar"
    End If
    ws.Cells.Clear
    On Error GoTo 0

    '=== 2. CSVダウンロード(Shift_JIS) ===
    url = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"
    ok = DownloadCsvAndImportToSheet(ws, url)
    If Not ok Then
        MsgBox "祝日CSVの取得に失敗したため処理を中止します。", vbCritical
        Exit Sub
    End If

    '=== 3. 祝日データをDictionaryに格納 ===
    Set holidays = CreateObject("Scripting.Dictionary")
    lastRow = ws.Cells(ws.Rows.Count, "J").End(xlUp).row
    For i = 2 To lastRow
        If Not IsEmpty(ws.Cells(i, "J").Value) Then
            holidays(CDate(ws.Cells(i, "J").Value)) = ws.Cells(i, "K").Value
        End If
    Next i

    '=== 4. カレンダー作成 ===
    yearNow = Year(Date)
    yearNext = yearNow + 1
    dateStart = DateSerial(yearNow, 1, 1)
    dateEnd = DateSerial(yearNext, 12, 31)

    ' 見出し(日?土)
    ws.Range("A1:G1").Value = Array("日", "月", "火", "水", "木", "金", "土")
    ws.Rows(1).Font.Bold = True
    ws.Rows(1).HorizontalAlignment = xlCenter

    curDate = dateStart
    rowPos = 2
    colPos = Weekday(curDate, vbSunday)

    Do While curDate <= dateEnd
        ws.Cells(rowPos, colPos).Value = curDate
        ws.Cells(rowPos, colPos).NumberFormat = "m/d"
        ws.Cells(rowPos, colPos).HorizontalAlignment = xlCenter

        ' 日曜を赤
        If Weekday(curDate, vbSunday) = vbSunday Then
            ws.Cells(rowPos, colPos).Font.Color = vbRed
        End If

        ' 祝日を赤+コメント
        If holidays.Exists(curDate) Then
            ws.Cells(rowPos, colPos).Font.Color = vbRed
            On Error Resume Next
            ws.Cells(rowPos, colPos).ClearComments
            ws.Cells(rowPos, colPos).AddComment Text:=holidays(curDate)
            On Error GoTo 0
        End If

        curDate = curDate + 1
        colPos = colPos + 1
        If colPos > 7 Then
            colPos = 1
            rowPos = rowPos + 1
        End If
    Loop

    '=== 5. 曜日行など整形 ===
    ws.Columns("A:G").ColumnWidth = 12
    ws.Range("A1:G1").Interior.Color = RGB(230, 230, 230)
    ws.Range("A1:G" & rowPos).Borders.LineStyle = xlContinuous
    ws.Columns("A:G").HorizontalAlignment = xlCenter

    ' 補助列(J:K)は非表示
    ws.Range("J:K").EntireColumn.Hidden = True

    MsgBox "カレンダー作成完了", vbInformation
 End Sub

 ' --- サブルーチン:祝日CSVをダウンロードして取り込む(Shift_JIS対応)---
 Function DownloadCsvAndImportToSheet(ws As Worksheet, url As String) As Boolean
    On Error GoTo ErrHandler
    Dim http As Object, stm As Object, qt As QueryTable
    Dim tmpPath As String

    ' 一時ファイルパス
    tmpPath = Environ("TEMP") & "\syukujitsu_tmp.csv"

    ' 1) HTTP GET
    Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
    http.Open "GET", url, False
    http.Send
    If http.Status <> 200 Then
        Err.Raise vbObjectError + 1000, , "HTTP取得エラー: " & http.Status & " " & http.StatusText
    End If

    ' 2) Shift_JISで保存
    Set stm = CreateObject("ADODB.Stream")
    stm.Type = 2 ' Text
    stm.Charset = "Shift_JIS"
    stm.Open
    stm.WriteText http.ResponseText
    stm.SaveToFile tmpPath, 2 ' adSaveCreateOverWrite
    stm.Close

    ' 3) シートに読み込み
    ws.Range("J:K").Clear
    For Each qt In ws.QueryTables
        If InStr(1, qt.Connection, tmpPath, vbTextCompare) > 0 Then qt.Delete
    Next qt

    Set qt = ws.QueryTables.Add(Connection:="TEXT;" & tmpPath, Destination:=ws.Range("J1"))
    With qt
        .TextFileParseType = xlDelimited
        .TextFileCommaDelimiter = True
        .TextFilePlatform = 932           ' Shift_JIS
        .TextFileStartRow = 1
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete ' テーブルオブジェクトを削除して値のみ残す
    End With

    DownloadCsvAndImportToSheet = True
    Exit Function

 ErrHandler:
    DownloadCsvAndImportToSheet = False
    MsgBox "CSV取得/読み込みでエラー: " & Err.Description, vbExclamation
 End Function

(英愛) 2025/11/01(土) 22:02:13


 と思ったらコメントが文字化けしてますね。
 AIに修正してもらいました。

    ' 2) Shift_JISで保存
         :
 の部分を下記に差し替えてください。

    ' 2) Shift_JISで保存(正しいUnicode変換)
    Dim binStream As Object
    Dim textStream As Object
    Dim tmpText As String

    ' --- BinaryでHTTPレスポンス受信 ---
    Set binStream = CreateObject("ADODB.Stream")
    binStream.Type = 1 ' Binary
    binStream.Open
    binStream.Write http.ResponseBody
    binStream.Position = 0

    ' --- BinaryをShift_JISテキストとして読み取る ---
    Set textStream = CreateObject("ADODB.Stream")
    textStream.Type = 2 ' Text
    textStream.Charset = "Shift_JIS"
    textStream.Open
    textStream.WriteText StrConv(binStream.Read, vbUnicode)

    ' --- ファイルとして保存 ---
    textStream.SaveToFile tmpPath, 2 ' adSaveCreateOverWrite

    ' --- 後始末 ---
    binStream.Close
    textStream.Close

(英愛) 2025/11/01(土) 22:16:19


簡単かどうかは人によるでしょうが、以下のように考えてみてはどうでしょうか?
 1. A列に日付のリストを作る

 2. B列に「=TEXT(A2,"aaa")」のような数式を書き込む

 3. どこかに(別シートでもOK)祝日リストをつくってC列に
    「=IF(COUNTIF(祝日リスト!$A$1:$A$100,A2),"祝日","")」のような数式を書き込む

 4. オートフィルタを設定して、B列が土or日の行を絞り込んで削除する

 5. B列の絞り込みを解除してC列が祝日の行を削除する

 6. オートフィルタを解除する

 7. ●日後は、考えるまでも無くA列に日数分足せば出ますよね
    (営業日ベースとかそういう話なら、既にA列に表ができてる
    わけですから、基準日から●日(●行)さがったセルを参照
    すればよいでしょう)

まぁ1週間くらいなら、手作業のほうが早いし簡単のような気がしますが・・・・

(もこな2) 2025/11/02(日) 10:37:02


(英愛)さん貴方はAIの回答がお好きなようですね。
貴方自身で回答する気はないんですか。
(AI頼りの回答さん) 2025/11/02(日) 10:59:17

 質問者さんにお願いがあります。
 サンプルを行番号・列番号がわかる形式で示してください。
 ・"カレンダー"と言ってもいろいろな形式があります。
   単に縦一列に並べたものでいいんですよね?
 ・対象となる範囲は通常、いつからいつまでとかなんですか。

 また、
 > そのカレンダーを元に当日から翌日や、1日前、3日後などの日付を別の表を作って表示させる
 ここのところは、WORKDAY関数で対応できます。
 祝日(に年末年始の特定日を加えたもの)を列挙したセル範囲を第三引数に指定すればよいので、
 簡単に対応できると思います。

 以下、余談です。

 英愛さんの回答(というかAIの回答ですかね)ですが、
 ネット上のCSVを取得するのは一回限りのことなので、
 わざわざマクロで難しいことをする必要はないのではというのが率直な感想です。
 WinHTTPを使ったコードを書いたこともありますが、普通は、
 繰り返し発生する、しかも手間のかかる場合に使うことが多いと思います。
 少なくとも、今回の例ではoverspecではないでしょうか。

(xyz) 2025/11/02(日) 15:19:24


 ・特定日を起算日として、
 ・そのn営業日後の日にちを得たい
 というのが目標ですか?
 そのためには営業日だけの表が必要だろうということかと思いますが、
 祝日+年末年始休日を列挙しさえすれば、WORKDAY関数を使うだけで
 別にカレンダー自体を作ることなしに結果は得られます、ということでしょう。

(xyz) 2025/11/02(日) 15:46:54


 >貴方自身で回答する気はないんですか。
 自身の回答って何ですか?
 AIを「使って」3分でできることを、30分かけて自分でネットを調べて、コードを手で打つことですか?
 No Way
(英愛) 2025/11/02(日) 17:38:26

 >少なくとも、今回の例ではoverspecではないでしょうか。
 はそうかもしれません。

 ただ毎年データ更新が必要なので、やっておいてもいいかな?
 くらいな感覚でした。
(英愛) 2025/11/02(日) 17:51:09

 英愛さん、コメントありがとうございました。

 念のためお聞ききするのですが、
 > カレンダーを作成する部分だけをAIに聞いてみました。
 ということですが、質問者が提示された要件の以下の点との関係を教えて下さい。

 1. 「12月28〜1月3日までを除いた」と言う箇所はこれからですか?
 2.  土曜は色を付けたりする必要はないのですか? 
 3.  >そのカレンダーを元に当日から翌日や、1日前、3日後などの日付を別の表を作って表示させる
     という要件にはどのように対応するお考えですか?
     作成されたカレンダーで営業日だけを、どう判断して、どうカウントするのでしょうか。
     一行に7日分を示すのではカウントしにくくないですか?

 なお、私見では、
 質問者さんに真っ先にしていただきたいのは、(サンプルの提示と、)
 「Workday関数の意味と、使用例を確認すること」かと思料します。
 これで見通しがずっとよくなるはずです。
(xyz) 2025/11/02(日) 18:43:20

 質問に対応した回答となっていない点は、認識してはいますが、すみません。

 1. 「12月28〜1月3日までを除いた」と言う箇所はこれからですか?
 2.  土曜は色を付けたりする必要はないのですか? 
 3.  >そのカレンダーを元に当日から翌日や、1日前、3日後などの日付を別の表を作って表示させる
     という要件にはどのように対応するお考えですか?
     作成されたカレンダーで営業日だけを、どう判断して、どうカウントするのでしょうか。
     一行に7日分を示すのではカウントしにくくないですか?

 1,2 に関しては必要であれば対応は「仕様追加」で済むので後でよいとは思っていました。
 3 に関しては、質問の意味・意図が分からなかったので、とりあえず先についた回答に対する実装例として
 「カレンダーに祝日を反映する」にフォーカスした事例を記載しました。
 これが質問者にとって有益な回答とはなっているか?に対しては NO ですね。

(英愛) 2025/11/02(日) 19:23:01


 こちらの説明が伝わりにくかったのでしょうか。
 内容確認に返事がありませんので、私見を纏めて載せて、私の区切りとします。

 こんな風にすれば、カレンダを作成しなくても、指定する営業日数後(前含む)の営業日を
 得ることができます。
 VBAが得意なら問題ありませんが、そうでなければVBAを使わなくても全く問題ありません。

   A列        B列        C列                          G列                 H列
   ========== ========   ==========                   ==============      ============
 1 基準日     指定間隔   営業日日付                   祝日+年末年始      メモ
 2 2025/10/31        0   2025/10/31                         2025/1/1      元日
 3                   1    2025/11/4                        2025/1/13      成人の日
 4                   5   2025/11/10                        2025/2/11      建国記念の日
 5                  10   2025/11/17                        2025/2/23      天皇誕生日
 6                  15   2025/11/25                        2025/2/24      休日
 7                  20    2025/12/2                        2025/3/20      春分の日
 8                  -1   2025/10/30                        2025/4/29      昭和の日
 9                 -10   2025/10/17                         2025/5/3      憲法記念日
 10                -20   2025/10/2                          2025/5/4      みどりの日
 11                                                         2025/5/5      こどもの日
 12                                                         2025/5/6      休日
 13                                                        2025/7/21      海の日
 14                                                        2025/8/11      山の日
 15                                                        2025/9/15      敬老の日
 16                                                        2025/9/23      秋分の日
 17                                                       2025/10/13      スポーツの日
 18                                                        2025/11/3      文化の日
 19                                                       2025/11/23      勤労感謝の日
 20                                                       2025/11/24      休日
 21                                                         2025/1/1   
 22                                                         2025/1/2   
 23                                                         2025/1/3   
 24                                                       2025/12/28 
 25                                                       2025/12/29 
 26                                                       2025/12/30 
 27                                                       2025/12/31 
 28                                                         2026/1/1   
 29                                                         2026/1/2   
 30                                                         2026/1/3   

 C2セル =WORKDAY($A$2,B2,$G$2:$G$30)
 下にコピー

 =========
 【備考】
 1. G列は、祝日と年末年始を指定して下さい。(重複も可。指定の順序も問いません)
 2. 祝日は既に指摘されたとおり、
    内閣府 https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html の資料(表またはCSVファイル)より作成ください
 3. 上記は単なる例です。
    実際の対象期間に応じて、適宜、適切な祝日と年末年始を指定して下さい。

(xyz) 2025/11/03(月) 15:07:43


 英愛さん、コメントありがとうございました。了解しました。
(xyz) 2025/11/03(月) 15:09:45

 まあ、祝日リストぐらい自分で作る
 古い情報のままなので天皇陛下の誕生日とか違うけど、他にも???
 その辺は直してね
http://www.vbalab.sakura.ne.jp/vbaqa/c-board.cgi?cmd=one;no=221;id=FAQ

(Jaka) 2025/11/03(月) 15:40:52


 質問の意図を丁寧に読み解けば、xyz さんの「祝日リストを使用したWORKDAYの使用」がやりたかった内容なのでしょうね。
 基準日を =TODAY()にしておけば「当日から」の表示になりそうです。
 上辺だけを読んで、あさってのほうを向いた回答になってしまって失礼しました。
(英愛) 2025/11/03(月) 16:37:14

コメント返信:

[ 一覧(最新更新順) ]


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