[[20161227213242]] 『年間スケジュールでの月末5営業日の表示について』(ちこ) ページの最後に飛ぶ

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

 

『年間スケジュールでの月末5営業日の表示について』(ちこ)

こんばんは、夜分ですがどうしても手詰まりで調べているうちに
ここに来ました。

やりたいのは年間スケジュールで各月月末営業日より5営業日前に
強調した年間スケジュールを作りたいのです。
過去に毎週水曜にというのは作ったのですが、それ以上ができず。

サンプル(水曜ver)

Sub calendar_year4()

    '横に3か月、下に4か月を出力
    Dim myDate As Long  '整数型は Long で統一しましょう
    Dim nen As Long, Tuki As Long
    Dim i As Long, j As Long, k As Long
    Dim myTitleD, myTitle(1 To 1, 1 To 7)
    Dim myRow As Long, myCol As Long
    Dim cn As Long ', cntCol As Integer, cntRow As Integer
    Dim cntCol, cntRow
    Dim c As Range, m&, S, Mon& '*****
        '行間隔、列間隔の設定
        myRow = 9
        myCol = 8
        '作成する年を入力します
        S = Application.InputBox(Title:="年の指定", _
                            Prompt:="作成する年月を入力してください。(yyyy/mm)", _
                            Default:="2013/04", Type:=1) '*****
        Tuki = Month(CDate(S)) '*****
        nen = Year(CDate(S))  '*****
        '曜日を配列にセットします
        myTitleD = Array("日", "月", "火", "水", "木", "金", "土")
        For k = 0 To 6
            myTitle(1, k + 1) = myTitleD(k)
        Next k
        'ひと月の日付を配列にセットします
        Sheets("年間スケジュール").Select
        Range("C1:Z38").Clear
        Application.ScreenUpdating = False

        For i = 1 To 12
            Dim myTable(1 To 6, 1 To 7)
            cn = 1
            '配置によって列と行の位置を変数で指定します
            cntCol = Split("Empty,1,2,3,1,2,3,1,2,3,1,2,3", ",") '*****
            cntRow = Split("Empty,1,1,1,2,2,2,3,3,3,4,4,4", ",") '*****
            m = i + (Tuki - 1) '3月 *****
            For j = DateSerial(nen, m, 1) To DateSerial(nen, m + 1, 0) '*****
                If Day(j) <> 1 And Weekday(j) = 1 Then cn = cn + 1
                myTable(cn, Weekday(j)) = j
            Next j
            'シートに書き出します 基準はD4セル

            With Cells(4 + myRow * (cntRow(i) - 1), 4 + myCol * (cntCol(i) - 1))
                '******************* 訂正範囲
                If i = 1 Then
                  .Offset(0, -1).Value = nen & "年"
                  .Offset(0, -1).Font.Size = 16
                End If
                If m > 12 Then
                  m = m - 12
                  If m = 1 Then
                     .Offset(0, -1).Value = nen + 1 & "年"
                     .Offset(0, -1).Font.Size = 16
                  End If
                End If
                '*******************
                .Value = m & "月"
                .Font.Bold = True
                .Font.Size = 14
                .HorizontalAlignment = xlHAlignCenter    '---横位置 中央揃え
                .VerticalAlignment = xlVAlignCenter      '---縦位置 中央揃え
                .Offset(1, 0).Resize(1, 7).Value = myTitle
                .Offset(2, 0).Resize(6, 7).Value = myTable
                '書式を設定します
                .Offset(1, 0).Resize(1, 7).Interior.Color = RGB(235, 241, 222)
                .Offset(1, 0).Resize(7, 7).HorizontalAlignment = xlCenter
                .Offset(2, 0).Resize(6, 7).NumberFormatLocal = "d"
                '日曜日は赤色にします
                .Offset(1, 0).Resize(7, 1).Font.Color = RGB(255, 0, 0)
                '土曜日は青色にします
                .Offset(1, 6).Resize(7, 1).Font.Color = RGB(0, 0, 255)
                '水曜日はMagentaにします
                'With Selection.Interior
                .Offset(1, 3).Resize(7, 1).Font.Color = vbMagenta  '*****
                .Offset(1, 3).Resize(7, 1).Font.Bold = True  '*****
                .Offset(2, 3).Resize(5, 1).Interior.Pattern = xlGray25 '*****
                'End With
                '祝日(指定休日)のチェックし、赤色の太文字にします
                For Each c In .Offset(2, 0).Resize(6, 7)
                 '休日表より対象祝日の書式を太字に
                     If Application.CountIf(Worksheets("設定").Range("G8:G37"), c.Value) > 0 Then
                         c.Font.Color = RGB(255, 0, 0)
                         c.Font.Bold = True
                     End If
                 Next c
            End With
            Erase myTable
        Next i
        Application.ScreenUpdating = True
 '罫線絵画
    Range("D5:J11").Borders.LineStyle = xlContinuous
    Range("L5:R11").Borders.LineStyle = xlContinuous
    Range("T5:Z11").Borders.LineStyle = xlContinuous

    Range("D14:J20").Borders.LineStyle = xlContinuous
    Range("L14:R20").Borders.LineStyle = xlContinuous
    Range("T14:Z20").Borders.LineStyle = xlContinuous

    Range("D23:J29").Borders.LineStyle = xlContinuous
    Range("L23:R29").Borders.LineStyle = xlContinuous
    Range("T23:Z29").Borders.LineStyle = xlContinuous

    Range("D32:J38").Borders.LineStyle = xlContinuous
    Range("L32:R38").Borders.LineStyle = xlContinuous
    Range("T32:Z38").Borders.LineStyle = xlContinuous

 End Sub

一応、祝日と言う名で祝日のシートはあります。

すいません、どなたかお分かりになりますでしょうか?
よろしくお願いします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 >各月月末営業日より5営業日前に 強調した年間スケジュールを作りたいのです。 

 「各月月末営業日より5営業日前」の日付(12個)が分かりさえすれば、
 後は自力で出来ると言うことですか?

(半平太) 2016/12/27(火) 23:30


半平太様

 すいません、自力でできるとは言えません。

教えていただいた後に、その構文を読んで理解する…
が今言えるところです。

全くどうしていいのか分からないところですので…。

ごめんなさい。

(ちこ) 2016/12/28(水) 00:41


 >   '祝日(指定休日)のチェックし、赤色の太文字にします
 >   For Each c In .Offset(2, 0).Resize(6, 7)
 >    '休日表より対象祝日の書式を太字に
 >        If Application.CountIf(Worksheets("設定").Range("G8:G37"), c.Value) > 0 Then
 >            c.Font.Color = RGB(255, 0, 0)
 >            c.Font.Bold = True
 >        End If
 >    Next c

       ↓( へ 変更)

     '祝日(指定休日)は赤色の太文字とし、月末営業日の5営業前は強調します
     For Each c In .Offset(2, 0).Resize(6, 7)
      '休日表より対象祝日の書式を太字に
          If Application.CountIf(Worksheets("設定").Range("G8:G37"), c.Value) > 0 Then
              c.Font.Color = RGB(255, 0, 0)
              c.Font.Bold = True
          ElseIf Application.WorkDay(DateAdd("M", 1, DateAdd("M", i - 1, S)), -6, Worksheets("設定").Range("G8:G37")) _
             = c.Value Then
             c.Style = "アクセント 4"
          End If
      Next c

 ※>各月月末営業日より5営業日前
  翌月初日から見て、6営業日前と解釈。

 ※>祝日と言う名で祝日のシートはあります。 
 休日リストは、"設定"シートの"G8:G37" にあると推測。
 ("祝日"シートじゃないですよね?)

(半平太) 2016/12/28(水) 08:18


半平太様

 的確な回答な解答ありがとうございます。

 ※>祝日と言う名で祝日のシートはあります。 
 休日リストは、"設定"シートの"G8:G37" にあると推測。
 ("祝日"シートじゃないですよね?)
すいません、名前の定義でシート名ではありませんでした。

構文より読み取っていただき、ありがとうございました。
大変助かりました。

なお、
ElseIf Application.WorkDay(DateAdd("M", 1, DateAdd("M", i - 1, S)), -6, Worksheets("設定").Range("G8:G37")) _

             = c.Value Then
この箇所はまだ解析中です。
難しい〜

(ちこ) 2016/12/29(木) 05:15


 >この箇所はまだ解析中です。
 >難しい〜

 済みませーん。 馬鹿な事をやっちゃったです。m(__)m

 これでよかったです。
  ↓
 ElseIf Application.WorkDay(DateAdd("M", i, S), -6, Range("祝日")) = c.Value Then

(半平太) 2016/12/29(木) 09:30


半平太様

 わざわざ訂正申し訳ございません。

というか、まだ分かっていなかったので、違いが…。
ただ、キレイに構文がなった気が。

まだまだ低レベルですいません。
(ちこ) 2017/01/02(月) 09:54


 ElseIf Application.WorkDay(DateAdd("M", i, S), -6, Range("祝日")) = c.Value Then

 S は 2017/4/1 の様な「期初の初日」
 i  は ずらす月数(1〜12)

 ワークシート関数の↓ と同じ

 =WORKDAY(EDATE("2017/4/1",1),-6,祝日)

(半平太) 2017/01/02(月) 15:13


コメント返信:

[ 一覧(最新更新順) ]


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