前の記事「(続)Excel 2016で選択したアクティブセルが太枠表示されない原因と解決方法2」では、Windows10になってからExcel 2016でコピー&ペースト操作の後アクティブセルが太枠表示されないことがあり、その現象が発生する直前のメッセージログを解析した結果を書きました。
ログの解析結果を要約しますと、
「コピーの後、明示的な貼り付けをしないのに発生するWM_RENDERFORMATメッセージの直前にWM_CLIPBOARDUPDATEメッセージをポストされているプロセス(プログラム)が原因の可能性が高い」
ということなります。
本記事では皆様のPC環境でも同様な現象が起こっていた場合、メッセージログを解析しその原因を特定するために、Spyxx.exeを使ってメッセージログを取得する具体的な使用方法を書きたいと思います。
Spyxx.exeはマイクロソフトのVisual Studio Community 2019に付属しているツールで下記から無料でダウンロードできます。
※Visual Studio Community 2019のダウンロード(無料)
Visual Studio Community 2019をインストールすると、下記のパスに入ってます。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\spyxx.exe
Excelが32bit版の場合(本事例紹介)は、64bit版のWindows10でも上記spyxx.exeで32bitのプログラム(プロセス)のメッセージログを取得すればほぼ問題ないかと思います。
Excelが64bit版の場合や64bitのプログラム(プロセス)のメッセージログを取得するには下記の64bitバージョンのspyxx_amd64.exeを使ってください。
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\spyxx_amd64.exe
使い方は同じです。
実行すると下記の画面になります。
ログ取得の設定を行います。
メニューの「スパイ」→「メッセージログの出力」を選択すると下記のダイアログが表示されます。
表示されたら、上記のように「すべてのウィンドウ」のチェックボックスをONにします。
Windowsの内部ではウィンドウとOSの間でメッセージのやり取りを行って、メッセージを受け取ったら処理を実行するという約束で操作に対するアクションが実行されます。
全てのプログラム(プロセス)は、1つ以上のウィンドウを保持しているのがWindowsの特徴です。
従って全てのウィンドウに対するメッセージを取得してやれば、Windows内部の動作や状態はほぼ把握できるということになります。
次に上記、メッセージオプションダイアログの「メッセージ」タブを選択します。
タブが切り替わったら、上記のように「すべてクリア」ボタンを押下した後、「クリップボード」チェックボックスのみONにします。
全てのウィンドウに対する全てのメッセージを取得するとログが膨大な量になってしまいます。
そこでExcel 2016でコピー&ペースト操作の後アクティブセルが太枠表示されないということから、「クリップボード」に関係するメッセージを取得してみようと当たりをつけて取得するメッセージを絞ったわけです。
次に上記、メッセージオプションダイアログの「出力」タブを選択します。
タブが切り替わったら、上記のように「生のメッセージパラメーター」と「生の戻り値」のチェックボックスを追加でONにします。
他のチェックボックスでONのものはそのままです。
「OK」ボタンを押下すると、ログの取得が開始され結果が「メッセージ(すべてのウィンドウ)」という子ウィンドウにリアルタイムで表示されます。
ログ取得を終了するには、メニューから「メッセージ」→「ログ終了」を選択します。
ログをクリアするには、メニューから「メッセージ」→「ログのクリア」を選択します。
ログを保存するには、メニューから「メッセージ」→「ファイルにログを保存」を選択します。
以上がSpyxx.exeの簡単なログ取得方法です。
上記「メッセージ(すべてのウィンドウ)」で、表示されたログについて簡単に説明します。
ちょうど選択してハイライト表示されている行が下記です。
<000003> 00020316 P WM_CLIPBOARDUPDATE wParam:0000000E lParam:00000000
2列目の 00020316 が、ウィンドウハンドルというメッセージが送られたウィンドウの名前です。
4列目の WM_CLIPBOARDUPDATE が、メッセージ名(種類)になります。
さて、本記事の冒頭で「コピー操作後に発生したWM_RENDERFORMATメッセージの直前にWM_CLIPBOARDUPDATE をポストされたプロセス(プログラム)が今回の現象の原因の可能性が高い」と言っています。
実際の皆様のPC環境での手順としては、ログの取得を開始後、コピー操作(明示的な貼り付けはしない)をして、アクティブセルが太枠表示されなくなったら、ログを終了し、「メッセージ(すべてのウィンドウ)」に表示されたログ中のWM_RENDERFORMATメッセージを探します。
見つかったらWM_RENDERFORMATメッセージの直前のWM_CLIPBOARDUPDATEの行を選択しハイライト表示させます。
(※直前といっても1つだけでなく複数のウィンドウに対してWM_CLIPBOARDUPDATEが複数行記録されている場合も多いのでそれら全て調べる必要があります)
選択しハイライト表示させた行が上記<000003>行と仮定して 00020316 のウィンドウを保持しているプロセス(プログラム)を探す例で説明します。
<000003>行が選択ハイライト表示された状態で、マウスを右クリックするとポップアップメニューが表示されます。
ポップアップメニューから「プロパティ...」を選択すると下記、「メッセージのプロパティ」が表示されます。
「ウィンドウハンドル: 0020316」の 0020316 をクリックすると、下記「ウィンドウプロパティ」ダイアログが表示されます。
上記ダイアログの「プロセス」タブを選択します。
「プロセスID: 000014A0」の 000014A0 をクリックすると、下記「プロセスプロパティ」ダイアログが表示されます。
「モジュール名: ONEDRIVE」と表示されています。
ONEDRIVEがプロセス名(プログラム名)です。
※Microsoft OneDrive(ONEDRIVE)は、Windowsにバンドルされたオンラインファイル共有プログラム。
ONEDRIVEを起動しないようにしてやって、WM_RENDERFORMATメッセージが発生しなくなれば、アクティブセルが太枠表示されなくなることはなくなると思うのですが皆様の環境ではいかがでしょうか。
※Spyxx.exeはプログラマの方でないとVisualStudioをインストール必要があり大変だと思われるので、根本原因となるプロセスを簡単に特定するためのツールをリリースしました。
詳しくは「Excel 2016で選択したアクティブセルが太枠表示されない原因調査ツールリリース」をご覧ください。