LoginSignup
0
0

More than 1 year has passed since last update.

Excel 帳票 最新はどれ ~ Winmarge の差分レポート一括作成 ~

Posted at

複数人で帳票を編集しているとき,最新はどれって思うことありませんか?

変更時のルールが曖昧な時など,人によってファイル名に rev1 をつけて保存したり,日付を付けて保存したりと最新のファイルの名前が変化していきます。。

で・・・・,どれが最新なのかひとつづつファイルを開いて確認するのは面倒だったので,Winmarge の差分レポート作成を一括で作成するスクリプトを書いてみました。

とあるフォルダのファイル(残念な状態)
○○台帳.xlsx
○○台帳_220610.xlsx
○○台帳_220610_rev1.xlsx
○○台帳_rer2.xlsx
○○台帳_ver2_220615.xlsx

どうやって比較しようか

ファイルのタイムスタンプが近いファイルどおしは,タイムスタンプが遠いもよりは,変更箇所は少ないという考えのもと

タイムスタンプの近いもの通しで比較し差分レポートを作ります。

Script

GetDiffreport.bat

powershell -NoProfile -ExecutionPolicy Unrestricted -File Get-DiffReport.ps1 -filePrefix "○○台帳_" -debugMode -All

Get-DiffReport.ps1
# WinmargeでエクセルDiffReportを作成する
# 初版 22.06.15 SBY

param (
    [Parameter(Position=0)]
    [string]
    $filePrefix = "AAAA帳票BBBBB_",
    [Parameter()]
    [Switch]
    $all = $false,
    [Parameter()]
    [Switch]
    $debugMode = $false
)
# ============ 初期設定 ===================
$WINMARGE = "C:\Program Files\WinMerge\WinMergeU.exe"
$WINMARGEOP = " -noninteractive -minimize "

# =========================================
$t_file = $filePrefix + "*.xlsx"

# ファイルリスト取得し降順(最新のファイルがidx=0になる)で並び変え
$files = get-childitem -Filter $t_file | Sort-Object -Property 'LastWriteTime' -Descending

if ($debugMode) {
    write-host $files.count
}

if ( $files.count -ge 2){
    # ファイルが2つ以上の時に処理する

    # $all が true:全ファイルを対象に差分レポートを作成する
    # $all が false:最新のファイルとひとつ前のファイルのみ比較する
    if ($all){
        $fidxs = 0..($files.count - 2)
    } else{
        $fidxs = 0
    }

    foreach ($fidx in $fidxs){
        $file0 = $files[$fidx]     # 最も最近のファイル
        $file1 = $files[$fidx+1]   # そのひとつ前のタイムスタンプ

        $outFileName = $filePrefix + $file0.LastWriteTime.ToString("yyyyMMdd") + "_" + $file1.LastWriteTime.ToString("yyyyMMdd") + ".html"

        if ($debugMode) {
            write-host "Inputfile1:" $file0.Name
            write-host "Inputfile2:" $file1.Name
            write-host "Outputfile:" $outFileName
        }

        # ======= winmargeの実行 ==================
        # Winmargeの引数を作成
        $args =  $file0.Name + " " + $file1.Name + " -or " + $outFileName + " " + $WINMARGEOP

        if (-not (test-path $outFileName)) {
            write-host "Winmargeで比較処理を実行します。"
            # Winmarge を実行 ,-Waitで終了まで待機
            Start-Process -FilePath $WINMARGE -Wait -ArgumentList $args
        } else {
            write-host "出力ファイルが既にあるためWinmarge比較をパスします。"
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0