Excelで直前に参照していたシートに戻る(シートの参照履歴を保持する)


Excelで直前に参照していたシートに戻る方法について書きます。


Excelの標準機能では、以下のショートカットでシートを移動できます。

  (1) Ctrl+PageUP…左のシートへ移動

  (2) Ctrl+PageDown…右のシートへ移動






(図:Excel標準機能によるシート間の移動)


しかし、たくさんのシートがあるブックで作業したり、複数のブックを開いているときなどは、
となりのシートではなく、直前に参照していたシートに戻りたいという時がよくあります。
イメージとしては、Ctrl+Tabで、以下の様な移動ができるショートカットが欲しい。といった感じです。





(図:必要とするショートカットによる移動イメージ)


Excelの標準機能には、残念ながらこういった機能はありません。

「Alt+Tabなどでファイルを選択→シートを選択する」ということをいちいちやるしかありません。

しかしそれは面倒なので、VBAでなんとかしてみました。

VBAで直前に参照していたブック.シートに戻る(参照履歴を保持する)

以下のサンプルを組み込むことで、上記で説明したCtrl+Tabショートカットを実現できます。
※ブック・シートの参照履歴を保持し、直前に参照していたシートに戻ります。(アクティブにします)



[コードの記述箇所]

  (1) PERSONAL.XLSB>Microsoft Excel Objects>ThisWorkBook

  (2) PERSONAL.XLSB>標準モジュール>任意のモジュール(ただし他のモジュールとは独立したモジュール。以下例では「goBackSheet」モジュールとして追加しています。)





(図:コードの記述箇所)




以下、ソースです。



[サンプルソース(1)]※ThisWorkBookに記述

'PERSONAL.XLSB ThisWorkBook

'WithEventsにてApplicationオブジェクト(Excel全体を示すオブジェクト)に発生するイベントを拾える様にする
'PERSONAL.XLSBに記述することで、全てのExcelファイルに適用される。
Public WithEvents xlAPP As Application


'Excelブックが開いた時に自動実行する。
Private Sub Workbook_Open()
    

    'アプリケーションオブジェクトを取得
    Set xlAPP = Application
    

    '標準モジュールの初回呼出し
    '直接呼び出すとエラーになるため、実行時間をずらして呼び出す。
    Application.OnTime Now + TimeSerial(0, 0, 1), "appFirst"
    

End Sub


'シートがアクティブになった時に自動実行する。
'(ブック内)シート間での参照履歴を保持する。
Private Sub xlAPP_SheetActivate(ByVal Sh As Object)

    oldBook = nowBook
    oldSheet = nowSheet
    nowBook = ActiveWorkbook.Name
    nowSheet = Sh.Name
        

End Sub


'Excelウインドウがアクティブになった時に自動実行する。
'以下によりExcelファイルを跨いでも、参照履歴が保持される。
Private Sub xlAPP_WindowActivate(ByVal Wb As Workbook, ByVal Wn As Window)

    oldBook = nowBook
    oldSheet = nowSheet
    nowBook = Wb.Name
    nowSheet = Wb.ActiveSheet.Name


End Sub



任意のブックではなく、Excel全般に適用したいため、PERSONAL.XLSBに記述します。

ThisWorkBookにはファイルオープン時やウインドウがアクティブになった時に自動実行させる、イベントプロシージャを利用したコードを記述しています。

その他の説明については、ソース内のコメントを参照してください。




[サンプルソース(2)]※標準モジュールに記述

'PERSONAL.XLSB 標準モジュール goBackSheet
'前に参照していたファイル.シートへ戻る(アクティブにする)


'マクロの実行メニューにPublicプロシージャが表示されないようにする。
Option Private Module


'参照履歴
Public oldBook  As String  '前に参照していたブック
Public oldSheet As String  '前に参照していたブック
Public nowBook  As String  '現在参照しているブック
Public nowSheet As String  '現在参照しているブック


'前に参照していたシートに戻る(Activeにする)マクロ
Public Sub oldsheet_act()


    'エラー発生した場合は無視する
    On Error Resume Next

    Workbooks(oldBook).Worksheets(oldSheet).Activate
    
End Sub

'Excel起動時に自動呼出しされるモジュール
Public Sub appFirst()

    'ファイル読込みに時間がかかるとエラーになるためスキップする
    On Error GoTo nextProc
    

    'ブック名・シート名を取得
    nowBook = ActiveWorkbook.Name
    nowSheet = ActiveSheet.Name
    
nextProc:
    

    'ショートカットキー(Ctrl+Tab)を設定。※同様にすれば、他のマクロもショートカット登録できます。
    Application.OnKey "^{TAB}", "OldSheet_act"   '…前に参照していたシートに戻るマクロを登録
    

End Sub



こちらは実際にシートを移動するためのコードを記述しています。

「oldsheet_act()」をショートカットキー(サンプルでは、Ctrl+Tab)で呼び出すことで、直前に参照していたファイルのシートへ移動できます。

ショートカットは、「appFirst()」をExcel起動時に呼出し、登録しています。

なお、既に他のマクロをCtrl+Tabで登録している場合は、上記ソースの「"^{TAB}"」を変更してください。

他のマクロも「appFirst()」へ記述すれば、ショートカットを登録できます。

その他の説明はソース内のコメントをご参照ください。



以上です。





2014.6.30 訂正

「appFirst()」に以下の処理を追加しました。


    'ファイル読込みに時間がかかるとエラーになるためスキップする
    On Error GoTo nextProc

    
    'ブック名・シート名を取得
    nowBook = ActiveWorkbook.Name
    nowSheet = ActiveSheet.Name
    
nextProc:


初回に開くファイルのサイズが大きい場合エラーになるため、対応しました。