3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ExcelのアクティブセルをすべてA1にして最初のシートをアクティブにする

Last updated at Posted at 2016-11-30

めんどくさいので公開

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 %*

参考:http://qiita.com/tomoko523/items/a70bfbe65fca0b547f5c

3
5
8

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
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?