m-eye blog

ノンプログラマによるVBAとPythonの学習記録

特定のセルだけを「Enter」キーで巡回するマクロ - 不渡届その2

f:id:m-eye:20181019094618p:plain

 

はじめに

  • ファイルはYahoo! ボックスに公開しているので、ここからダウンロードして自由につかってください。
  • このファイルには「不渡届その1」で作成したマクロを含みます。
  • 動作確認は、Offie 365 Solo + Windows 10でおこなっています。
  • 動作は無保証です。

 

キーボードだけで入力作業を完結したい

不渡届を作成する際に、マウスをつかいたくない、というリクエストがありました。

キーボードから手をはなさずに作業したいけど、さすがにホームポジションをまったく崩さずに作業するのはムリなので、Enterキーや、Altキーなどの修飾キー、矢印キーなどはつかってよいことにして、特にEnterキーでセルの移動をできるようにしたい、といわれました。

 

実現するには

まず、特定のセルを巡回するマクロを作成します。

たとえば、セルAG3からセルG8に、セルG8からセルJ8に、セルJ8からセルAG3へと巡回します。

ついでに、逆順に巡回するマクロも作成します。

そのつぎに、その巡回マクロをEnterキーに登録するマクロ・解除するマクロを作成します。

さいごに、ブックモジュールに、ブックを開いたときと閉じるときに自動的に登録・解除するマクロを作成します。

 

特定のセルを巡回するマクロ

セルを巡回する順番をきめます。

AG3→G8→J8→Y8→J7→B8→AD9→AD10→AE15→D19→O19→G10→
N10→I13→O12→P11→D16→S16→W16→AG3→以下、おなじ

これをマクロに落とし込みます。AG3がアクティブのときはG8を選択、G8がアクティブのときはJ8を選択、というマクロをつくります。

マクロ名のS_IndicateEnterDirectionは「Enterを押したときのセルの移動方向を決める」という意味ですが、自分がわかればなんでもいいと思います。

わたしはこのマクロをEnterキーに登録するつもりなので、このマクロ名にしました。

 

ソースコード

Sub S_IndicateEnterDirection()
    Select Case ActiveCell.Address(False, False)
        
        Case "AG3"
           Range("G8").Activate
           
        Case "G8"
           Range("J8").Activate
           
        Case "J8"
           Range("Y8").Activate
           
        Case "Y8"
           Range("J7").Activate
           
        Case "J7"
           Range("B8").Activate
           
        Case "B8"
           Range("AD9").Activate
           
        Case "AD9"
           Range("AD10").Activate
           
        Case "AD10"
           Range("AE15").Activate
           
        Case "AE15"
           Range("D19").Activate
           
        Case "D19"
           Range("O19").Activate
           
        Case "O19"
           Range("G10").Activate
           
        Case "G10"
           Range("N10").Activate
           
        Case "N10"
           Range("I13").Activate
           
        Case "I13"
           Range("O12").Activate
           
        Case "O12"
           Range("P11").Activate
           
        Case "P11"
           Range("D16").Activate
           
        Case "D16"
           Range("S16").Activate
           
        Case "S16"
           Range("W16").Activate
           
        Case "W16"
           Range("AG3").Activate
           
        Case Else
        
            On Error Resume Next
            
            With ActiveCell
                
                Application.MoveAfterReturn = True
            
                Select Case Application. _
                    MoveAfterReturnDirection
                    
                    Case xlDown
                        .Offset(1, 0).Select
                        
                    Case xlUp
                        .Offset(-1, 0).Select
                        
                    Case xlToRight
                        .Offset(0, 1).Select
                        
                    Case xlToLeft
                        .Offset(0, -1).Select
                        
                End Select
            
            End With
            
    End Select
    
End Sub

 

解説

ActiveCell.Address(False, False)でアクティブセルのアドレスを相対参照で取得します。

それをさきほど決めた順番にあてはめてコーディングします。

ただし、順番のなかにないセルの場合、Enterをおしても全くうごかなくなってしまいます。

ですので、Case Elseのなかで他のセルの挙動を規定しています。

Application.MoveAfterReturn = Trueで、Enterキーを押したあとにアクティブセルを移動するように設定します。

Application.MoveAfterReturnDirectionは、「ファイル」メニュー→「オプション」→「詳細設定」→「Enterキーを押したら、セルを移動する(M)」という項目の「方向」オプションで選んだ「下」、「右」、「上」、「左」のどれが選択されているかを取得します。

xlDownxlUpxlToRightxlToLeftのそれぞれのとき、「下」、「上」、「右」、「左」に1つセルを移動します。

 

特定のセルを「逆順で」巡回するマクロ

自分できめたセルを巡回する順番を逆に移動するだけですね。

マクロ名のS_IndicateShiftEnterDirectionは「Shift + Enterを押したときのセルの移動方向を決める」という意味ですが、自分がわかればなんでもいいと思います。

わたしはこのマクロをShift + Enterキーに登録するつもりなので、このマクロ名にしました。

 

ソースコード

Sub S_IndicateShiftEnterDirection()
    Select Case ActiveCell.Address(False, False)
        Case "AG3"
           Range("W16").Activate
           
        Case "W16"
           Range("S16").Activate
           
        Case "S16"
           Range("D16").Activate
           
        Case "D16"
           Range("P11").Activate
           
        Case "P11"
           Range("O12").Activate
           
        Case "O12"
           Range("I13").Activate
           
        Case "I13"
           Range("N10").Activate
           
        Case "N10"
           Range("G10").Activate
           
        Case "G10"
           Range("O19").Activate
           
        Case "O19"
           Range("D19").Activate
           
        Case "D19"
           Range("AE15").Activate
           
        Case "AE15"
           Range("AD10").Activate
           
        Case "AD10"
           Range("AD9").Activate
           
        Case "AD9"
           Range("B8").Activate
           
        Case "B8"
           Range("J7").Activate
           
        Case "J7"
           Range("Y8").Activate
           
        Case "Y8"
           Range("J8").Activate
           
        Case "J8"
           Range("G8").Activate
           
        Case "G8"
           Range("AG3").Activate
           
        Case Else
        
            On Error Resume Next
            
            With ActiveCell
                
                Application.MoveAfterReturn = True
            
                Select Case Application. _
                    MoveAfterReturnDirection
                    
                    Case xlDown
                        .Offset(1, 0).Select
                        
                    Case xlUp
                        .Offset(-1, 0).Select
                        
                    Case xlToRight
                        .Offset(0, 1).Select
                        
                    Case xlToLeft
                        .Offset(0, -1).Select
                        
                End Select
            
            End With
            
    End Select
    
End Sub

解説

解説はとくにありませんが、気をつけるとしたら、スペルミスくらいですかね。

だれも指摘してくれないと、けっこうな時間、気がつかないことがあります。

 

巡回マクロを「Enter」キーに登録・解除するマクロ

 

登録

巡回マクロをEnterキーに登録するときは、Application.OnKeyメソッドを使います。

Application.OnKey "登録するキー", "登録するマクロ名"

登録するキーは、Enterキーはエディタに表示されないので、特別なコードを使います。

キー コード
Enter(メインキーボード) ~(チルダ)
Enter(テンキー) {ENTER}

「逆順」で巡回するマクロはShift + Enterに登録するのですが、Shiftも特別なコードをつかいます。

キー コード
Shift +(プラス記号)

以上をくみあわせると次のようなマクロになります。

Sub S_AddKeysToMacro()
    Application.OnKey "~", "S_IndicateEnterDirection"
    Application.OnKey "{Enter}", "S_IndicateEnterDirection"
End Sub

逆順のマクロを登録するのは、次のようなマクロになります。

Sub S_AddKeysToMacro2()
    Application.OnKey "+~", _
        "S_IndicateShiftEnterDirection"
    Application.OnKey "+{Enter}", _
        "S_IndicateShiftEnterDirection"
End Sub

 

解除

巡回マクロをEnterキーから解除するときも、Application.OnKeyメソッドを使います。

Application.OnKey "解除するキー" 'マクロ名はなにも書かない

マクロ名を省略することで、登録していたマクロを解除する意味になります。

次のマクロは、Enterキーからマクロを解除するものです。

Sub S_RemoveKeysFromMacro()
    Application.OnKey "~"
    Application.OnKey "{Enter}"
End Sub

次のマクロは、Shift + Enterキーからマクロを解除するものです。

Sub S_RemoveKeysFromMacro2()
    Application.OnKey "+~"
    Application.OnKey "+{Enter}"
End Sub

 

「ThisWorkbook」モジュールに登録するマクロ

「セルを巡回するマクロ」を登録・解除するマクロを実行するタイミングは、このブックを開いたとき・閉じるときです。

次のマクロで「セルを巡回するマクロ」を登録・解除します。

Private Sub Workbook_Open()
    Call S_AddKeysToMacro
    Call S_AddKeysToMacro2
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call S_RemoveKeysFromMacro
    Call S_RemoveKeysFromMacro2
End Sub

Workbook_Openプロシージャで、このブックをひらくときに正順・逆順のセル巡回マクロを登録します。

Workbook_BeforeCloseプロシージャで、このブックをとじるときにマクロを解除します。

 

おわりに

実際にマウスなしで操作するには、「データの入力規則の設定」や「シートの保護」など、ほかにやることがありますが、とりあえず特定のセルを移動することは、今回のマクロでできるようになります。

 

Copyright 2018 m-eye blog All Rights Reserved.