【Power Shell】自動でExcelマクロのパスワードを解除する

サンプルプログラム概要

・SendKeysにより解除
・引数で対象ファイルが格納されたフォルダを指定
・サブフォルダ配下も対象
・対象/対象外ファイルを判定
・特定のファイルの場合、Excel起動後のsleep時間を長めにする
・Excel起動後/停止後のsleep時間は必要に応じて調整する

注意点

・サンプルプログラム起動前にマクロは無効にしておく
 ┗[ファイル]→ [オプション] → [セキュリティセンター] → [ セキュリティセンター の設定]
    → [マクロの設定] → [警告を表示せずにすべてのマクロを無効にする] にチェック

・OFFICE365のExcelを使用等により上記の設定変更が不可の場合、SendKeysでEnterを入力
 する等で上手くやる

サンプルプログラム

Add-Type -AssemblyName System.Windows.Forms

# inputフォルダを指定
$inputFolder = $Args[0]

# 対象ファイルのリストを取得(サブフォルダ配下のファイルも含む)
# 「*.xlsm 」を対象、「*hoge*」を対象外とする
$fileList = Get-ChildItem $inputFolder  -Recurse  `
                                        -include *.xlsm  `
                                        -exclude *hoge* `
                                        | select-object FullName

$count = 1

foreach($file in $fileList){

    # 開始日時を出力
    $date = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    $message = $date + " 開始 " + $count + "/" + $fileList.Count + " " +  `
               $file.FullName
    echo $message

    # ファイル名に「piyopipy」が含まれている場合、sleep時間を長めに20秒にする
    If($file.FullName -Like "*piyopiyo*"){
        $fileOpenSleepTime = 20
    }Else{
        $fileOpenSleepTime = 10
    }
    
    # ファイルを開く
    Invoke-Item $file.FullName
    Start-Sleep -s $fileOpenSleepTime
	
    # 「開発タブ」にフォーカス
    [System.Windows.Forms.SendKeys]::SendWait("%l")
    Start-Sleep -s 2

    # 「コードの表示」を選択
    [System.Windows.Forms.SendKeys]::SendWait("c")
    Start-Sleep -s 2
	
    # パスワードを入力
    [System.Windows.Forms.SendKeys]::SendWait("password")
    Start-Sleep -s 2
	
    # ENTERでOK
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
    Start-Sleep -s 2

    # 「ツールタブ」にフォーカス
    [System.Windows.Forms.SendKeys]::SendWait("%t")
    Start-Sleep -s 2

    # 「VBA Project」を選択
    [System.Windows.Forms.SendKeys]::SendWait("e")
    Start-Sleep -s 2

    # 「全般タブ」にフォーカス
    [System.Windows.Forms.SendKeys]::SendWait("+{TAB}")
    Start-Sleep -s 2

    # 「保護タブ」にフォーカス
    [System.Windows.Forms.SendKeys]::SendWait("{RIGHT}")
    Start-Sleep -s 2

    # 「プロジェクトを表示用にロックする」のチェックを外す
    [System.Windows.Forms.SendKeys]::SendWait("%v")
    Start-Sleep -s 2

    # ENTERでOK
    [System.Windows.Forms.SendKeys]::SendWait("{ENTER}")
    Start-Sleep -s 2

    # VBEを閉じる
    [System.Windows.Forms.SendKeys]::SendWait("%q")
    Start-Sleep -s 2

    # 上書き保存
    [System.Windows.Forms.SendKeys]::SendWait("^s")
    Start-Sleep -s 2

    # 閉じる
    [System.Windows.Forms.SendKeys]::SendWait("%{F4}")
    Start-Sleep -s 5
	
    # 終了日時を出力
    $date = (Get-Date).ToString("yyyy/MM/dd HH:mm:ss")
    $message = $date + " 終了 " + $count + "/" + $fileList.Count + " " +  `
               $file.FullName
    echo $message

    $count = $count + 1
}

サンプルプログラムの起動

PS C:\Windows\system32> C:\Users\user\Desktop\temp\unlockMacroPassword.ps1 C:\Users\user\Desktop\temp
2019/10/11 00:02:26 開始 1/2 C:\Users\user\Desktop\temp\kakikae.xlsm
2019/10/11 00:03:05 終了 1/2 C:\Users\user\Desktop\temp\kakikae.xlsm
2019/10/11 00:03:05 開始 2/2 C:\Users\user\Desktop\temp\sampleVBA.xlsm
2019/10/11 00:03:44 終了 2/2 C:\Users\user\Desktop\temp\sampleVBA.xlsm
PS C:\Windows\system32>
タイトルとURLをコピーしました