めんどくさいので公開
Excelが読み取り専用モードになる問題は
Excel:保護されたビューを解除(無効)するには
http://office-qa.com/Excel/ex161.htm
の「方法(2) フォルダを信頼できる場所として指定する」等で回避?
Set-FirstCell.ps1
function Open-ExcelAndProcess($processMethod,$filename){
try{
# Excelオブジェクト作成
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $false
# 既存のExcel
$book = $excel.Workbooks.Open($filename)
# その他やりたい処理
$ret = $processMethod.Invoke($excel)
# 上書き保存
if($ret){
Write-Host "ファイルをセーブします"
$book.Save()
}
# 閉じる
$excel.Quit()
} finally {
$excel,$book,$sheet | foreach{
if($_ -ne $null){
[Runtime.InteropServices.Marshal]::ReleaseComObject($_) > $null
}
}
}
}
function Set-FirstCell($excel){
$isChange=$false
# 初期のアクティブシートを取得し、画面出力
$activeSheet=$excel.ActiveSheet
Write-Host ("アクティブシート:"+$activeSheet.Name)
# Sheet名一覧を取得します。Sheetの数の配列を作成し、それぞれの名前の配列に変換してます。
$sheetNames=1..($excel.Worksheets.Count) | % {$excel.Worksheets.Item($_).Name}
#シート名一覧ループ
$sheetNames | % {
# シート名からシートオブジェクトを取得
$sheet = $excel.Worksheets.Item($_)
# シートを選択
$sheet.Activate() > $null
# アクティブセルを取得
$activeCell=$excel.ActiveCell
# アクティブセル座標のハッシュオブジェクトを作成
$activeCellArray=@{x=$activeCell.Column;y=$activeCell.Row}
# シート名を画面出力
Write-Host ("シート名:"+$sheet.Name)
if($excel.ActiveWindow.ScrollColumn -ne 1){
Write-Host ("ScrollColumn set to 1")
$excel.ActiveWindow.ScrollColumn = 1
$isChange=$true
}
if($excel.ActiveWindow.ScrollRow -ne 1){
Write-Host ("ScrollRow set to 1")
$excel.ActiveWindow.ScrollRow = 1
$isChange=$true
}
# 初期座標を画面出力
Write-Host ("x:"+$activeCellArray.x+" y:"+$activeCellArray.y)
# アクティブセルが1ではなかった場合、A1を選択
if(-not($activeCellArray.x -eq 1 -And $activeCellArray.y -eq 1)){
$excel.Range("A1").Activate() > $null
$isChange=$true
}
}
# アクティブシートの名前が、一番先頭のシート名と違った場合は、先頭シートをアクティブ化
$excel.Worksheets.Item(1).Activate() > $null
if($sheetNames -is [Array] -And $activeSheet.Name -ne $sheetNames[0]){
$isChange=$true
}
# 関数の戻り値として、シートを変更したかをリターン
$isChange
}
foreach($arg in $args){
Open-ExcelAndProcess ${function:Set-FirstCell} $arg
}
Set-FirstCell.bat
@echo off
powershell -file %~pdn0.ps1 %*