Workbook_Deactivateイベントを設定したファイルの致命的な使いにくさについて

スポンサーリンク

仕事でVBAを扱うことが増えてきて最近ハマった罠

最近マクロ・VBAを仕事で扱うことが増えてきて、自分自身で操作するプログラムを作るだけでなく、他の人にプログラムを使ってもらうことが増えてきたので利便性を求めてイベントプロシージャを使うことが増えました。

その中で罠とも思える仕様の問題にハマりましたので自分への記録として残しつつ、他の方への注意喚起としてブログに記載します。

イベントプロシージャとは

以前にこちらの記事で紹介したことがありますが、イベントプロシージャとは特定の操作をしたときに自動で実行されるマクロ(プログラム)のことです。

ファイルを開いたとき、シートの内容を変更したとき、カーソルを移動したときなど条件に合わせて色々な操作を組み合わせることができます。
標準モジュールに記載して自分たちで起動するマクロに比べて、マクロ・VBAについて知識がない人でもマクロ操作を誤ることが少なく、ファイルを共有する際に私はよく用いています。

スポンサーリンク

Workbook_Deactivateイベント設定時の不具合(不都合?)について

今回はイベントプロシージャの中で、Workbook_Deactivateイベントの不具合についてお伝えします。

Workbook_Deactivateイベントはファイルがアクティブでなくなったとき(=他のファイルがアクティブになったとき)に起動するマクロを記載する場所ですが、私がネットなどで調べた際下記のようなコードが表示されます。

Private Sub Workbook_Deactivate()

Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlDown

End Sub

また対になってこのファイルがアクティブになったときに実行される下記のコードも記載されています。

Private Sub Workbook_Activate()

Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlToRight

End Sub

これはEnterをクリックしたときの挙動を制御するコードで、普段は「下にカーソルを移動させる」がこのファイルだけ「右に移動させる」場合に使われるコードです。
このEnterクリック時の挙動の制御はファイルなどでよく使われるもので、私もよく使っているのですが、この設定をしたファイルにおいては、他のファイルからシートの内容をコピーペーストできなくなります。

おそらくこのコードを起動した際にコピーしたものを格納しておくクリップボードが空になるからだと思われますが、いくつかのファイルから資料をまとめたり情報を集めたりすることができなくなるためかなり扱いにくくなります。
私はこの設定したファイルを数人に配り、記入してもらった大量のデータを集計したことがあるのですが、普通にコピーペーストできず、かなり無駄な苦労をしました。

コピーペーストを使うファイルについては、Workbook_Deactivate、Workbook_Activateイベントではなく、下記のようにWorkbook_BeforeCloseとWorkbook_Openを使った方が使い勝手がよさそうです。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlDown

End Sub
Private Sub Workbook_Open()

Application.MoveAfterReturn = True
Application.MoveAfterReturnDirection = xlToRight

End Sub

これだとファイルを開いている間はEnterクリック時右にカーソルが移動します。
他のファイルにコピペすることも他のファイルからコピペすることも可能です。

閉じるまでこの設定が保持されてしまいますので、その際に開くファイルがEnterをクリックしたときに下にカーソルが移ってほしいファイルでなければ問題ないはずです。
他に良い解決法があればまたご紹介します。

コメント