Excelファイルのカーソルをホームポジションに設定するスクリプト

Excelファイルのカーソルをホームポジションに設定するスクリプト

Excelファイルのカーソルをホームポジションに設定するスクリプトです。
Version 3.19.0 より自動A1保存の廃止に伴い、配布予定です。

* 全てのシートのカーソルをホームポジションにします。(非表示シートは除外)
* シートの一番最初を選択します。
* ズームを100%に変更します。

複数ファイル、サブディレクトリ対応です。
読み取りパスワードが指定されているものにも対応します。

使い方

1. ホームポジション設定するExcelファイルのフォルダにこのスクリプトを配置する。
2. スクリプトの「拡張子」「読み取りパスワード」を必要に応じて書き換える。
3. スクリプトを実行する。
4. 結果をテキストファイルで表示する。

'-------------------------------------------------------------------------------
' Excelファイルのカーソルをホームポジションに設定
' 
' ExcelSetHomePosition.vbs
' Version 1.0.0
' 
' Copyright (c) 2015 Y.Watanabe
' 
' This software is released under the MIT License.
' http://opensource.org/licenses/mit-license.php
'-------------------------------------------------------------------------------
' 動作確認 : Windows 7 + Excel 2010 / Windows 8 + Excel 2013
'-------------------------------------------------------------------------------
' for Used
' (1) ホームポジション設定するExcelファイルのフォルダにこのスクリプトを配置する。
' (2) スクリプトの「拡張子」「読み取りパスワード」を必要に応じて書き換える。
' (3) スクリプトを実行する。
' (4) 結果をテキストファイルで表示する。
' 
'-------------------------------------------------------------------------------
    Option Explicit

    Dim objFs, strMsg, SH
    Dim objDic, XL, WB, FL, LogName
    dim varPatterns, strKey, varPass, p
    Dim IE
    Dim strTitle
    
    strTitle = "ホームポジション設定"
    
    If MsgBox("同フォルダ以下のExcelファイルをホームポジション設定します。" & vbCrLf & "よろしいですか?" & VbCrLf & VbCrLf & "☆お約束☆" & vbCrLf & "Excelファイルは事前にバックアップしてください。", vbYesNo + vbQuestion, strTitle) = vbNo Then 
        WScript.Quit 
    End IF

    Set IE = WScript.CreateObject("InternetExplorer.Application")
 
    IE.Navigate "about:blank"
    Do While IE.busy
        WScript.Sleep(100)
    Loop
    Do While IE.Document.readyState <> "complete"
        WScript.Sleep(100)
    Loop
    IE.Document.body.innerHTML = "<b id=""msg"">ホームポジション設定中です<br>しばらくお待ち下さい...</b>"
    IE.AddressBar = False
    IE.ToolBar = False
    IE.StatusBar = False
    IE.Height = 120
    IE.Width = 300
    IE.Left = 0
    IE.Top = 0
    IE.Document.Title = strTitle
    IE.Visible = True
    
    On Error Resume Next

    Set objFs =  WScript.CreateObject("Scripting.FileSystemObject")
    Set objDic = WScript.CreateObject("Scripting.Dictionary")
    
    '--------------------------------------------------------------
    ' 処理を行う拡張子を正規表現で記述
    '--------------------------------------------------------------
    varPatterns = Array("\.xls$", "\.xlsx$", "\.xlsm$")
    
    '--------------------------------------------------------------
    ' 読み取りパスワードがある場合はここに記述(複数指定可)
    '--------------------------------------------------------------
    varPass = Array("", "", "")
    
    FileSearch objFs, objFs.GetParentFolderName(WScript.ScriptFullName), varPatterns, objDic

    LogName = objFs.GetBaseName(WScript.ScriptFullName) & ".txt"
    Set FL = objFs.CreateTextFile(LogName)

    FL.WriteLine "☆=ホームポジション設定 開始(" & Now() & ")☆="
    FL.WriteLine "処理ファイル数:" & objDic.Count

    If objDic.Count > 0 Then
        
        Set XL = WScript.CreateObject("Excel.Application")

        For Each strKey In objDic.Keys
        
            'パスワード指定の場合
            For Each p In varPass
                Err.Clear
                Set WB = XL.WorkBooks.Open(objDic(strKey),,False,,p,"",True,,,False)
                If Err.Number = 0 Then
                    Exit For
                End If
            Next
            
            Select Case True
                Case Err.Number <> 0
                    FL.WriteLine "エラー => " & objDic(strKey)
                    FL.WriteLine "          " & Err.Description
                    
                Case WB.ReadOnly 
  	                FL.WriteLine "エラー => " & objDic(strKey)
                    FL.WriteLine "          ブックが読み取り専用です"
                    
                Case Else
                    setAllA1 WB

                    XL.DisplayAlerts = False
                    WB.Save
                
                    If Err.Number <> 0 Or WB.Saved = False Then
                        FL.WriteLine "エラー => " & objDic(strKey)
                        FL.WriteLine "          " & Err.Description
                    Else
                        FL.WriteLine "処理済 => " & objDic(strKey)
                    End If
                
                    XL.DisplayAlerts = True
            End Select
            
            'インスタンスがあれば Close
            If Not IsNothing(WB) Then
                WB.Close
                Set WB = Nothing
            End If
        Next

        XL.Quit

        Set XL = Nothing

    End If

    FL.WriteLine "☆=ホームポジション設定 終了(" & Now() & ")☆="
    FL.Close
    Set FL = Nothing

    Set objDic = Nothing
    Set objFs =  Nothing

    With CreateObject("Shell.Application")
        .ShellExecute(LogName)
    End With

    IE.Quit
    'MsgBox "処理が完了しました。", vbInformation + VbOkOnly, strTitle

'--------------------------------------------------------------
' すべてのシートの選択位置をA1にセット
'--------------------------------------------------------------
Sub setAllA1(WB)

    Dim WS
    Dim WD

    For Each WS In WB.Worksheets
        If WS.visible Then
            WS.Activate
            WS.Range("A1").Activate
            WB.Windows(1).ScrollRow = 1
            WB.Windows(1).ScrollColumn = 1
            WB.Windows(1).Zoom = 100
        End If
    Next

    '表示中の1枚目にする。
    For Each WS In WB.Worksheets
        If WS.visible  Then
            WS.Select
            Exit For
        End If
    Next

End Sub

'--------------------------------------------------------------
' サブフォルダ検索
'--------------------------------------------------------------
Private Sub FileSearch(objFs, strPath, varPatterns, objDic)

    Dim objfld
    Dim objfl
    Dim objSub
    Dim f, objRegx
    
    Set objfld = objFs.GetFolder(strPath)

    'ファイル名取得
    For Each objfl In objfld.files
    
        Dim blnFind
        blnFind = False

	    Set objRegx = CreateObject("VBScript.RegExp")
        For Each f In varPatterns
            objRegx.Pattern = f
            If objRegx.Test(objfl.name) Then
                blnFind = True
                Exit For
            End If
        Next
	    Set objRegx = Nothing
        
        If blnFind Then
            objDic.Add objFs.BuildPath(objfl.ParentFolder.Path, objfl.name), objFs.BuildPath(objfl.ParentFolder.Path, objfl.name)
        End If
    Next
    
    'サブフォルダ検索あり
    For Each objSub In objfld.SubFolders
        FileSearch objFs, objSub.Path, varPatterns, objDic
    Next

End Sub

ABOUTこの記事をかいた人

はてなブックマークで驚愕の1600越えを記録した伝説が今明らかに! エクセル方眼紙 四天王の1人(ほぼ最弱)窓の杜大賞2014 大賞受賞! Excelを便利にする250以上の機能を体系化したアドインはこちらです。