任意の年のカレンダーを作るスクリプト

コンピュータ

Excelファイル(xlsx形式)でカレンダーを作成します。
祝日は対応しません。

スポンサーリンク

スクリプト

<#
.SYNOPSIS
 任意の年のカレンダー(.xlsx)を作成する。

.DESCRIPTION
 デフォルトで2020年のカレンダーを作成します。

.EXAMPLE
 PS>CalenderMaker.ps1 [xlsxファイルパス] [西暦]

.PARAMETER XlsxPath
 作成するxlsxファイルのパス

.PARAMETER Year
 作成するカレンダーの年。西暦で指定。
#>

param(
    [string]$XlsxPath = (Join-Path ([Environment]::GetFolderPath("MyDocuments")) "Calender.xlsx"),
    [int]$Year = 2020
)

Set-StrictMode -Version Latest
$ErrorActionPreference = "STOP"



function Make-Calender
{
    param(
        [Parameter(ValueFromPipeline=$false,Mandatory=$true)]
        [string]
        $XlsxPath,
        [Parameter(ValueFromPipeline=$false,Mandatory=$true)]
        [int]
        $Year
    )
    
    $week = @("日","月","火","水","木","金","土")

    $Excel = New-Object -ComObject Excel.Application # Excel起動
    $Excel.Visible = $True

    # ワークブックの初期処理
    $XlsxExits = Test-Path -LiteralPath $XlsxPath # ファイルの存在確認
    if ($XlsxExits) {
        # ファイルが有る
        $Workbook = $Excel.Workbooks.Open($XlsxPath) # ワークブックを開く
    } else {
        # ファイルが無い
        $Workbook = $Excel.Workbooks.Add() # ワークブックを作成
    }
    

    try {

        # ワークシートの初期処理
        $SheetName = "Calender"
        $Sheet = $Workbook.Worksheets | ? { $SheetName -eq $_.Name } # ワークシート名Calenderを取り出す
        if(-not($Sheet)) {
            # シート無し
            $Sheet = $Workbook.Worksheets.Add() # ワークシートを作成
            $Sheet.Name = $SheetName
        }

        # 年をセット
        $Sheet.Range("A1") | % {
            $_.Value = $Year
            $_.NumberFormatLocal = "0""年"""
        }

        # 月のループ
        for($m=0; $m -lt 12;$m++) {
        
            if ($m -gt 5) {
                # 右側(7-12月)
                $y = 5 + ($m-6) * 8
                $x = 1 + 9
            } else {
                # 左側(1-6月)
                $y = 5 + $m * 8
                $x = 1
            }

            
            # 月をセット
            $Sheet.Cells.Item($y, $x) | % { 
                $_.Value = ($m+1)
                $_.NumberFormatLocal = "0""月"""
            }

            # 罫線をセット
            $Sheet.Range($Sheet.Cells.Item($y, ($x+1)),$Sheet.Cells.Item(($y+6), ($x+7))) | % {
                # 罫線の種類を指定
                $_.borders.LineStyle = 1

                # 罫線の太さを指定
                $_.borders.Weight = 2
            }

            # 曜日をセット
            for($i=0;$i -lt 7;$i++) {
                $Sheet.Cells.Item($y, ($x + 1 + $i)) = $week[$i]
            }

            # 月末日を計算
            $ds = (Get-Date -Year $Year -Month ($m+1) -Day 1)
            $de = $ds.AddMonths(1).AddDays(-1)


            # 日付のループ
            $j = 0
            for($i=1;$i -le $de.Day;$i++) {
                $d = (Get-Date -Year $Year -Month ($m+1) -Day $i)
                $w = $d.DayOfWeek.value__

                # 日付をセット
                $Sheet.Cells.Item(($y + 1 + $j), ($x + 1 + $w)) = $i

                if ($w -eq 6) { $j++ }
            }

        }
        # カラムの自動調整
        $Sheet.Columns("B:H").AutoFit() | Out-NUll
        $Sheet.Columns("K:Q").AutoFit() | Out-NUll

        # 日曜日赤
        $Sheet.Columns("B:B").font.ColorIndex = 3
        $Sheet.Columns("K:K").font.ColorIndex = 3


    } catch {
    
        throw $_

    } finally {

        # ワークブックを保存
        if ($XlsxExits) {
            # ファイルが有る
            $Workbook.Save() # 上書き保存
        } else {
            # ファイルが無い
            $Workbook.SaveAs($XlsxPath) # 名前を付けて保存
        }

        $Excel.Quit() # Excelを終了
        $Excel = $Null
        [System.GC]::Collect() # ガーベージコレクト
    }
}
Make-Calender $XlsxPath $Year

コメント