MENU

直前のエクセルシートに戻るマクロを使って、作業時間を短縮しよう!

f:id:excelkaizen:20181018204027j:plain

 

実務では、同じエクセルブックのシート間を行ったり来たりすることはよくあります。

しかし、何度もシートの切り替えを行うような作業をする場合に、毎回シートの見出しをクリックすると大変です。そこで多くの人は、「Alt+Tab」でアプリケーション間の切り替えが一瞬でできるように、エクセルのシート間の切り替えも一瞬でできるショートカットキーがエクセルに標準で備わっていると想像するわけです。しかし残念ながら、、、エクセルにはそのようなショートカットキーは存在しません。

一応、「Ctrl+Pageup」と「Ctrl+Pagedown」で隣のシートに移動することはできますが、シートが離れている場合は何度も操作しないといけないので手間がかかりますし、それならマウスで見出しをクリックするほうが早いです。

 

ということで、そんなことならマクロで作ってしまおう!また、どうせ作るなら個人用マクロブックに保存してすべてのエクセルで使えるようにしよう!と考えました。

 

下記のマクロを実行すれば、隣のシートであろうが、離れたシートであろうが、直前に参照していたシートに一瞬で切り替わりますもちろん、いちいちマクロを表示させて実行させては時間がかかって意味がないので、片手だけで切り替えができるよう「Ctrl+Tab」というショートカットキーを割り当てました。

 

まず基本的なマクロの考え方ですが、イベント処理を利用して、ワークシートが非アクティベイトになったときにそのシートの名前を変数に格納し、ショートカットキーを使って直前のシートに戻るという方法をとります。

 

ではまずコードから紹介します。下のコードを個人用マクロブックのワークブックモジュールと標準モジュールにそれぞれ記述すれば、すべてのブックが「Ctrl+Tab」でシートの行き来ができるようになります。

 

Thisworkbookに記述

Public WithEvents xlapp As Application
Private Sub Workbook_Open()
 Set xlapp = Application
 Application.OnTime Now + TimeSerial(0, 0, 1), "shortcutkey"
End Sub

Private Sub xlapp_SheetDeactivate(ByVal Sh As Object)
    gotobeforeSheet = Sh.Name
End Sub   

標準モジュールに記述

Public gotobeforeSheet As String

Sub GobacktoBeforeSheet()
    On Error Resume Next
   If gotobeforeSheet <> "" Then
    Worksheets(gotobeforeSheet).Activate
   End If
End Sub

Public Sub shortcutkey()
 On Error Resume Next
 'ショートカットキーの登録
 Application.OnKey "^{tab}", "GobacktoBeforeSheet"
End Sub    

 

コードを説明していきます。まず、Public WithEvents xlapp As Applicationですが、ほかのブックのイベント処理を扱う場合は、WithEventsキーワードを使用して、アプリケーションオブジェクトの変数を宣言する必要があります。

Private Sub Workbook_Open()  
Set xlapp = Application  
  Application.OnTime Now + TimeSerial(0, 0, 1), "shortcutkey"
End Sub

次にこの部分ですが、「Workbook_Open」プロシージャによって、ブックが開かれた(イベント発生の)ときに自動でマクロを実行させています。

まず、Set xlapp = Application で、アプリケーションオブジェクトを生成します。次に、Application.OnTime Now + TimeSerial(0, 0, 1), "shortcutkey" で、マクロ実行時間を遅らせて"shortcutkey"マクロを呼び出します。

 

Private Sub xlapp_SheetDeactivate(ByVal Sh As Object)
 gotobeforeSheet = Sh.Name
End Sub

次に、「SheetDeactivate」プロシージャで、シートが非アクティベイトになるときに、そのシートの名前をgotobeforeSheet変数に格納します。通常、ワークブックのイベント処理の場合、「xlapp」の部分が「Workbook」になりますが、今回はエクセル全体に対するイベント処理のため、先ほど生成した「xlapp」になります。

 

さて、ここまでがワークブックモジュールに記述したコードの説明になります。WithEventsキーワードは使い方が難しいですが、一つのブックに記述したマクロを複数のブックで利用できるため、職場などでは必須の機能といえます。では次は、標準モジュールの説明に移ります。

 

まず、gotobeforeSheet変数をパブリックで宣言します。そして、「GobacktoBeforeSheet」プロシージャにより、直前に非アクティブになったシートに戻ることができます。あとはこのプロシージャを「Ctrl+Tab」のショートカットキーに登録すれば完成です。

 

イベント処理は奥が深いので、マスターすれば多くのことがエクセルで実現可能だと思います。私もまだまだ理解が浅いので、さらに学習を進めていこうと思います。

 

参照:

直前に操作していたシートに戻るショートカットキーは?:エクセルマクロ・Excel VBAの使い方-イベントプロシージャ