読者です 読者をやめる 読者になる 読者になる

t-hom’s diary

主にVBAネタを扱っているブログです。

VBA Excelのセル移動をVI風にしたい

VI(ブイアイ)というテキストエディタをご存じだろうか。
カーソルの移動をh・j・k・lの4キーで行う、なんとも奇妙なエディタである。
では文字入力はどうするのかというと、VIにはいくつかのモードがあり、iキーで編集モードに入ると普通のエディタのように編集でき、Escキーで編集モードから抜けるとノーマルモードに戻ってhjklで移動できるようになる。

VIを知らない方にとっては、編集モードがノーマルで、hjklで移動できる方がむしろアブノーマル。

しかし、VIではこれが普通なのだ。
VIでは、ホームポジションを大きく崩さずに編集ができる。
矢印キーでも移動できるが、ホームポジションから遠いので普通はhjklで移動する。

そしてその操作に慣れてしまうと…

もう普通に戻れない。

矢印キーがひどく煩わしく感じる。

VIは他にも、切り取りやコピー、選択などをすべてコマンドで行う。
メモ帳でもCtrl+Cでコピーできるが、VIのそれはちょっと違う。
yyと入力すると、現在カーソルがある行が丸ごとコピーされ、pで貼り付けされる。
3yyと入力すると3行コピーされ、10pと入力するとそれが10回文貼り付けられる。

【参考】viコマンド(vimコマンド)一覧(検索・置換)


Windows番のVIはこちらで入手できる。www.kaoriya.net

さて、VIの操作に慣れてしまうと、ExcelもVI風に操作したくなる。
全部は無理でも、せめてカーソル移動だけでも。。

ということで作ってみたのがこちら。

Sub ViMode()
    Application.CutCopyMode = False
    Application.OnKey "i", "ExcelMode"
    Application.OnKey "h", "Vi_h"
    Application.OnKey "j", "Vi_j"
    Application.OnKey "k", "Vi_k"
    Application.OnKey "l", "Vi_l"
    Application.OnKey ":", "Vi_ExMode"
    Application.Caption = "■■■VI MODE■■■"
End Sub

Sub ExcelMode()
    For Each x In Split("i h j k l :", " ")
        Application.OnKey x
    Next
    Application.Caption = ""
    Application.OnKey "{ESC}", "ViMode"
End Sub

Sub Vi_ExMode()
    Application.VBE.MainWindow.Visible = True
    Dim w As VBIDE.Window
    For Each w In Application.VBE.Windows
        If w.Type = VBIDE.vbext_wt_Immediate Then
            w.SetFocus
        End If
    Next
End Sub

Sub Vi_h()
    If Selection.Column > 1 Then Selection.Offset(0, -1).Select
End Sub

Sub Vi_j()
    If Selection.Row < Rows.Count Then Selection.Offset(1, 0).Select
End Sub

Sub Vi_k()
    If Selection.Row > 1 Then Selection.Offset(-1, 0).Select
End Sub

Sub Vi_l()
    If Selection.Column < Columns.Count Then Selection.Offset(0, 1).Select
End Sub

あまり知られていないが、Application.OnKeyを使用すると、マクロのショートカットを[Ctrl+文字]以外にも設定できる。
削除するには再度Application.Onekyで、第二引数を渡さなければ良い。


上記コードを標準モジュールに貼り付けてViModeマクロを実行すればExcelのタイトルバーに■■■VI MODE■■■と表示され、hjklで移動できるようになる。

Vi_ExModeマクロは、イミディエイトウインドウをすばやく表示させるためのコードで、動作させるには次の2つの設定が必要だ。

まず、VBEのツールメニューから参照設定で、Microsoft Visual Basic for Applications Extensibility X.Xを参照させておく。
f:id:t-hom:20150814051026p:plain

次に、マクロのセキュリティで以下を設定する。
f:id:t-hom:20150814051318p:plain

これで、コロンを入力するとVi_ExModeマクロが実行され、イミディエイトウインドウが開く。
これはVBAで一行コマンドをすばやく実行するために用意した。thom.hateblo.jp

iキーを押すと普通のExcelに戻るが、EscキーでまたVIモードになる。

まだ試行錯誤している段階なので、最初のViModeをどう実行させるか等は決めてない。
また、hjklは矢印キーと違い、非表示セルにも移動するので非表示セルが連続すると移動が煩わしい。
色々と改善できる点はあるけど、面倒くさいので徐々にやっていこうと思う。


…実は調べていたら似たような試みはすでにあったようで、Vectorで公開されていた。www.vector.co.jp

まあ、全部VI風にはせずにExcelコマンドとハイブリッドにしようとは思うので、自分用のキーは自前で実装を続ける予定。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。