サンプルプログラム概要
・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>