簡単エクセルマクロ日記

説明は苦手なのであしからず

祝日の文字色変更

カレンダーの土・日・祝日の文字を変更するプログラム。

祝日の定義のシート。

<祝日の定義>

祝日名 指定週 指定曜日 説明
元日 1 1     年のはじめを祝う。
成人の日 1   2 2 1月の第2月曜日。おとなになったことを自覚し、みずから生き抜こうとする青年を祝いはげます。
建国記念の日 2 11     建国をしのび、国を愛する心を養う。
天皇誕生日 2 23     天皇の誕生日を祝う。
春分の日 3 21     自然をたたえ、生物をいつくしむ。
昭和の日 4 29     激動の日々を経て、復興を遂げた昭和の時代を顧み、国の将来に思いをいたす。
憲法記念日 5 3     日本国憲法の施行を記念し、国の成長を期する。
みどりの日 5 4     自然に親しむとともにその恩恵に感謝し、豊かな心をはぐくむ。
こどもの日 5 5     こどもの人格を重んじ、こどもの幸福をはかるとともに、母に感謝する。
海の日 7   3 2 7月の第3月曜日。海の恩恵に感謝するとともに、海洋国日本の繁栄を願う。
山の日 8 11     山に親しむ機会を得て、山の恩恵に感謝する。
敬老の日 9   3 2 9月の第3月曜日。多年にわたり社会につくしてきた老人を敬愛し、長寿を祝う。
秋分の日 9 23     祖先をうやまい、なくなった人々をしのぶ。
スポーツの日 10   2 2 10月の第2月曜日。スポーツを楽しみ、他者を尊重する精神を培うとともに、健康で活力ある社会の実現を願う。
文化の日 11 3     自由と平和を愛し、文化をすすめる。
勤労感謝の日 11 23     勤労をたっとび、生産を祝い、国民たがいに感謝しあう。

 

<プログラム>

'/////////////////////////////////////////
'// 祝日
'/////////////////////////////////////////
Option Explicit

'/****************************************
'/* 独自定数
'/****************************************
Private Const dayFormat = "00"
'Private Const dateFormat = "YYYY/MM/DD"
'Private Const flgOn = "1"
'Private Const flgOff = "0"

'列番号
Private Const weekNameHColNum = 1
Private Const monthHColNum = 2
Private Const dayHColNum = 3
Private Const weekCntHColNum = 4
Private Const weekHColNum = 5

'/****************************************
'/* 独自変数
'/****************************************
'Dim transferFlg As String
'Dim weekCnt As Integer
Dim wArrayDay(31) As Integer
Dim wArrayHoliday() As Variant

'/****************************************
'/* 祝日チェック&セット
'/****************************************
Public Sub checkAndSetHoliday(wIdx1 As Integer, wWeekNo As Integer, sheetName As String)

    '祝日取得
    Call getHoliday(Worksheets(sheetName).Cells(startRowNum, monthColNumOri).Value)
    
    Dim i As Integer
    
    For i = LBound(wArrayHoliday) To UBound(wArrayHoliday)
    
        If wArrayHoliday(i, 0) <> 0 Then
            '休日は赤文字
            If wArrayHoliday(i, 1) = Format(wIdx1, "#") Then
                If wWeekNo = 1 Then
                    '日付固定の休日(日曜日の場合、翌日)
                    Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, dataWorkStartColNumOri + wIdx1 - 1) = wArrayHoliday(i, 4)
                    Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, (dataWorkStartColNumOri + wIdx1 - 1) + 1) = "振替"
                    Worksheets(sheetName).Cells(dataDaysRowNumOri, (dataWorkStartColNumOri + wIdx1 - 1) + 1).Font.Color = RGB(colorNumber255, 0, 0)
                    Worksheets(sheetName).Cells(dataWeekRowNumOri, (dataWorkStartColNumOri + wIdx1 - 1) + 1).Font.Color = RGB(colorNumber255, 0, 0)
                    transferFlg = flgOn
                Else
                    '日付固定の休日(日曜日以外の場合)
                    If Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, dataWorkStartColNumOri + wIdx1 - 1) <> "" Then
                        '日付固定の連休(GWなどの場合)
                        Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, (dataWorkStartColNumOri + wIdx1 - 1) + 1) = "振替"
                        Worksheets(sheetName).Cells(dataDaysRowNumOri, (dataWorkStartColNumOri + wIdx1 - 1) + 1).Font.Color = RGB(colorNumber255, 0, 0)
                        Worksheets(sheetName).Cells(dataWeekRowNumOri, (dataWorkStartColNumOri + wIdx1 - 1) + 1).Font.Color = RGB(colorNumber255, 0, 0)
                        transferFlg = flgOn
                    End If
                    
                    Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, dataWorkStartColNumOri + wIdx1 - 1) = wArrayHoliday(i, 4)
                    Worksheets(sheetName).Cells(dataDaysRowNumOri, dataWorkStartColNumOri + wIdx1 - 1).Font.Color = RGB(colorNumber255, 0, 0)
                    Worksheets(sheetName).Cells(dataWeekRowNumOri, dataWorkStartColNumOri + wIdx1 - 1).Font.Color = RGB(colorNumber255, 0, 0)
                    
                End If
            ElseIf wArrayHoliday(i, 1) = 0 And wArrayHoliday(i, 2) = weekCnt And wArrayHoliday(i, 3) = wWeekNo Then
                '第●週の休日
                Worksheets(sheetName).Cells(dataDaysRowNumOri - 1, dataWorkStartColNumOri + wIdx1 - 1) = wArrayHoliday(i, 4)
                Worksheets(sheetName).Cells(dataDaysRowNumOri, dataWorkStartColNumOri + wIdx1 - 1).Font.Color = RGB(colorNumber255, 0, 0)
                Worksheets(sheetName).Cells(dataWeekRowNumOri, dataWorkStartColNumOri + wIdx1 - 1).Font.Color = RGB(colorNumber255, 0, 0)
            End If

        End If
    
    Next i

End Sub

'/****************************************
'/* 対象月の祝日取得
'/* ※祝日が変わった場合は、祝日シートの記載を変更するだけ。PGは修正不要。
'/****************************************
Private Sub getHoliday(targetMonth As Integer)

    '表示&保護解除
    Worksheets(holidaySheet).Visible = True
    Worksheets(holidaySheet).Select
    Worksheets(holidaySheet).Unprotect
    
    Dim wHoliday As String
    Dim wCnt As Integer
    Dim wWeek As String
    Dim i As Long
    
    maxRowNum = getLastRowOrColNum(holidaySheet, startColNum, flgOff)
    ReDim wArrayHoliday(maxRowNum, 5) As Variant
    
    For i = 2 To maxRowNum
    
        '表示月
        If targetMonth = Cells(i, monthHColNum).Value Then
            
            '祝日
            wArrayHoliday(i - 2, 0) = Cells(i, monthHColNum).Value
            wArrayHoliday(i - 2, 1) = Cells(i, dayHColNum).Value
            wArrayHoliday(i - 2, 2) = Cells(i, weekCntHColNum).Value
            wArrayHoliday(i - 2, 3) = Cells(i, weekHColNum).Value
            wArrayHoliday(i - 2, 4) = Cells(i, weekNameHColNum).Value

        End If
        
    Next i

    '保護&非表示
    Call protectAndHiddenSheet(holidaySheet, CreateWorkTableSheet)

End Sub

 

ファイル削除を改良

1週間分だけ保持するように変更。


Private Sub trushClear(backupPath As String, objFSO As Object)
    
    'バックアップフォルダの存在チェック
    If Dir(backupPath, vbDirectory) = "" Then
        MkDir backupPath
    End If
    
    '指定したフォルダパスとファイル名をセットする
    Dim setPath As String
    setPath = Dir(backupPath & "\残したいファイル_*.xlsm")
    
    'バックアップ日付
    Dim bkDate As String
    
    'ファイル名が取得出来なくなるまでループ
    Do While setPath <> ""
        'ファイル名によって開始位置は変わる
        bkDate = Mid(setPath, 9, 8)
        
        '※ファイル名にバックアップした日付をつける
        If bkDate < Format(Date - 7, "yyyymmdd") Then

            Kill backupPath & "\" & Format(Date, "yyyymmdd") & "残したいファイル_*.xlsm"
’            MsgBox "ファイル:" & setPath & "  日付:" & bkDate

        End If
    
        setPath = Dir()
        
    Loop
    
End Sub

ファイルのバックアップ作成

ボタンを押すとファイルをバックアップするプログラム。



<プログラム>

Private Sub BackUp_Click()
On Error Resume Next

ThisWorkbook.Save

If Err.Number <= 0 Then
    'デスクトップにバックアップフォルダを作成した場合
    Dim backupPath As String
    backupPath = "C:\Users\" & Application.UserName & "\Desktop\" & Format(Date,"YYYY") & "_bk"

    '古いバックアップを消す
    Call trushClear(backupPath)

    'ファイル移動オブジェクト(複数用)
    Dim objFSO As Object, txtSource As String, txtDestination
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    'バックアップのコピー
    Call copyNewBk(objFSO)

End If

End Sub


Private Sub trushClear(backupPath As String)
    
    'バックアップフォルダの存在チェック
    If Dir(backupPath, vbDirectory) = "" Then
        MkDir backupPath
    End If

    '※ファイル名は任意
    If Dir(backupPath & "\" & Format(Date, "yyyymmdd") & "残したいファイル_*.xlsm") <> "" Then
        Kill backupPath & "\" & Format(Date, "yyyymmdd") & "残したいファイル_*.xlsm"
    End If

    
End Sub


Private Sub copyNewBk(backupPath As String, objFSO As Object)

    '残したいファイル ※objFSO.CopyFileは、開いていてもコピーできる(最後に保存されたタイミングのコピーとなる)
    objFSO.CopyFile ThisWorkbook.FullName, backupPath  & "\残したいファイル_" & Format(Date, "yyyymmdd") & ".xlsm"


'    '参考 ※FileCopyは、開いているファイルはコピーできない
'    FileCopy "バックアップを取りたいファイルが置かれているフォルダ/" & "\残したいファイル_" & Format(Date, "yyyymmdd") & ".xlsm", backupPath  & "\残したいファイル_" & Format(Date, "yyyymmdd") & ".xlsm"

End Sub


<オマケ>
ファイルをカウントする。

Private Function countFile(filePath As String, fileName As String) As Long

    Dim cnt As Long
    Dim tmp  As String
    cnt = 1
    tmp = Dir(filePath & "\" & fileName)

    Do While tmp <> ""
        cnt = cnt + 1
        tmp = Dir()
    Loop
    
    countFile = cnt
    
End Function