あらかじめ日記

雑記とかブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

【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で送るだけで事足りますね。



【C#】ボタンをクリックした場合の、直前のアクティブコントロールの取得

フォーム(コンテナ)上で、現在フォーカスのあるアクティブコントロールは、ActiveControlのプロパティ取得できます。

この時、ボタンをクリックした時に、その直前にアクティブだったコントロールが取りたい場合のメモ。

続きを読む

【C#】WebBrowserでYouTube動画を再生する(ドキュメントモードと、ユーザーエージェントを変更する方法)

C#WebBrowserコントロールを利用していて、YouTubeのページを見た時に動画が再生できないことに気づきました。
IE本体にはFlashの最新版を入れているはずなのに、「最新版をインストールしてください」と言われる)

その対処方法です。

(この辺の製作記の続きです)

allthewayfrom.hatenablog.com

続きを読む

【C#】IHTMLTxtRangeのhtmlTextとparentElementの動きについてのメモ

IHTMLTxtRangeを扱っているときに分かったことのメモ書きです。

内容的にはこの辺の記事の絡みです。

allthewayfrom.hatenablog.com

続きを読む

【C#】HtmlElementのNextSibling(次の要素)とPreviousSibling(前の要素)

以前より、WebBrowserHtmlElementの操作を色々と調べていた時のメモ。

前回の記事はこちら。
 

allthewayfrom.hatenablog.com

続きを読む

【C#】WebBrowser上の選択範囲の文字列位置と、HTML(ソース)の位置を見つける方法

以前の記事で、WebBrowser上の選択範囲の見つけ方を書きました。

allthewayfrom.hatenablog.com

この方法は範囲の先頭と終端に特定の文字を挿入し、その文字を検索して位置を特定していますが、これだと元になるHtmlElementのHTML自体に一旦文字を入れるため、Undoするとその挿入した文字が現れてしまう、、と言う問題があります。
なんとかその問題を解決し、少し改善してみました。

続きを読む