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

あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【Excel/VBA】Undo可能な値貼り付けマクロ(図形内対応)をOnKeyのCtrlやAltでショートカットキー化

プログラミング アプリケーション

Excel上で、Ctrl+C→Ctrl+Vを行うと書式も含めてコピーされるのが邪魔で「値の貼り付け」を利用する人は多いと思います。

最近のExcelCtrl+Vの後にアイコンが出て形式指定で再貼り付けできるようになりましたし、Ctrl+Alt+Vで形式指定の再貼り付けダイアログが出せるのでそんなに苦でも無いかもしれませんが、それでもキー一発で値貼り付けしたい!という場合に以下のマクロ。

    If Application.ClipboardFormats(1) = -1 Then
        Exit Sub
    End If
     
    If Application.CutCopyMode And TypeName(Selection) = "Range" Then
        SendKeys ("%hvv")
    Else
        SendKeys ("%hvt")
    End If


マクロ実行をUndo可能にするためにはSendKeysを利用したショートカット操作でコマンドを実行させる必要があります。
その時のショートカットが、【Alt(%)→ホーム(h)→貼り付け(v)→値の貼り付け(v)】となります。

値の貼り付け」だけであれば、カスタマイズでクイックアクセスツールバーにアイコンをおいて、Alt+数字のショートカットで実行させることもできますが、Excelのコピーモード(セルがコピー状態になっている)以外や、セルが選択されていない(図形内にフォーカスがある)場合では「値の貼り付け」が行えないので、このマクロではその場合は、【貼り付け(v)→テキストを保持(t)】に切り替えるようにしています。

また、最初のApplication.ClipboardFormatsクリップボードのデータ有無をチェックしています。

次に、このマクロにショートカットキーを割り当てる方法は個人用ブックを利用しますが個人用ブックについてはこの辺りで。

support.office.com


この個人用ブックに、開いた時に自動実行されるauto_open()を追加して、Application.OnKeyメソッドでキーとプロシージャを割り当てます。 
OnKeyの説明はこちらで。

Application.OnKey メソッド (Excel) - MSDN



これを、OnKeyCtrl+Shift+Vとかでやりたいところですが、Snedkeysを実行するOnKeyのキーでShift、Ctrl、Alt非常に相性が悪いのです。。

ShiftIME ONでShift+アルファベットだとキー入力が優先されOnKeyが動かない
Ctrl →SendKeysでAlt押下の短縮キーで実行する場合にOnKey発火時のCtrl押下が効いて動いてくれない
Alt →そもそもOnKeyが動かない

これを解決する術はないかと、結構悩んだのですが、そもそもExcelでやりきるのは無理だと判断。


ふと、AutoHotkeyが使えるのでは?ということに気づきます。
AutoHotkeyは以前紹介しました。↓)

allthewayfrom.hatenablog.com

まずOnKeyには、他のショートカットに影響なさそうな適当なキーを割り当てておきます(Shift+F1など)

AutoHotkeyで、Excelに対しCtrl+Shift+Vを割り当て、先ほどOnKeyで割り当てたキーをAutoHotkeyで送ればCtrlAltの組み合わせでもOnKeyでマクロ実行させることができました!


ちなみにSendKeysだけであればわざわざExcelでマクロ化をせずにAutoHotkeyで送るだけで事足りますね。