【Excel/VBA】Undo可能な値貼り付けマクロ(図形内対応)をOnKeyのCtrlやAltでショートカットキー化
Excel上で、Ctrl+C→Ctrl+Vを行うと書式も含めてコピーされるのが邪魔で「値の貼り付け」を利用する人は多いと思います。
最近のExcelはCtrl+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はクリップボードのデータ有無をチェックしています。
次に、このマクロにショートカットキーを割り当てる方法は個人用ブックを利用しますが個人用ブックについてはこの辺りで。
この個人用ブックに、開いた時に自動実行されるauto_open()を追加して、Application.OnKeyメソッドでキーとプロシージャを割り当てます。
OnKeyの説明はこちらで。
Application.OnKey メソッド (Excel) - MSDN
これを、OnKeyのCtrl+Shift+Vとかでやりたいところですが、Snedkeysを実行するOnKeyのキーでShift、Ctrl、Altが非常に相性が悪いのです。。
Shift→IME ONでShift+アルファベットだとキー入力が優先されOnKeyが動かない
Ctrl →SendKeysでAlt押下の短縮キーで実行する場合にOnKey発火時のCtrl押下が効いて動いてくれない
Alt →そもそもOnKeyが動かない
これを解決する術はないかと、結構悩んだのですが、そもそもExcelでやりきるのは無理だと判断。
ふと、AutoHotkeyが使えるのでは?ということに気づきます。
(AutoHotkeyは以前紹介しました。↓)
まずOnKeyには、他のショートカットに影響なさそうな適当なキーを割り当てておきます(Shift+F1など)
AutoHotkeyで、Excelに対しCtrl+Shift+Vを割り当て、先ほどOnKeyで割り当てたキーをAutoHotkeyで送ればCtrlやAltの組み合わせでもOnKeyでマクロ実行させることができました!
ちなみにSendKeysだけであればわざわざExcelでマクロ化をせずにAutoHotkeyで送るだけで事足りますね。
【C#/XML-RPC】プログラムでブログの投稿をする
【C#】WebBrowser上の選択範囲の文字列位置と、HTML(ソース)の位置を見つける方法
以前の記事で、WebBrowser上の選択範囲の見つけ方を書きました。
この方法は範囲の先頭と終端に特定の文字を挿入し、その文字を検索して位置を特定していますが、これだと元になるHtmlElementのHTML自体に一旦文字を入れるため、Undoするとその挿入した文字が現れてしまう、、と言う問題があります。
なんとかその問題を解決し、少し改善してみました。