追記(注意)
通常の方法(マクロの記録で得られるコードを実行するか、手動でウィンドウ枠の固定を行う)でウィンドウ枠の固定を行ったワークシートと行き来するとレイアウトが崩れるという問題が発生しました。引き続き検証しますが、しばらく以下のコードは使わない方がよさそうです。
はじめに
タイトルでお分かりいただけるかとは思いますが、Excel の VBA です。Access, Word などは対象ではありません。
問題点
「ウィンドウ枠の固定」は頻繁に使用する機能ですが、ネットでよく見かけるサンプルおよびマクロの記録で得られるコードには以下のような落とし穴があります。
- セルの選択を伴う
- ユーザーが「時間がかかる処理だから」と、Excel を最小化しておくとエラーになる
- 基点がスクロール領域の外側にあるとおかしいことになる
解決した関数
これらの問題を解決した関数は、以下のようになります。
ウィンドウ枠の固定
Public Sub FreezePane(r As Long, c As Long)
With ActiveWindow
Dim saveWindowState As XlWindowState
saveWindowState = .WindowState
.WindowState = xlNormal
If .FreezePanes Then .FreezePanes = False
.SplitRow = r
.SplitColumn = c
.FreezePanes = True
.WindowState = saveWindowState
End With
End Sub
ウィンドウ枠の固定の解除
Public Sub UnfreezePane()
With ActiveWindow
Dim saveWindowState As XlWindowState
saveWindowState = .WindowState
.WindowState = xlNormal
.FreezePanes = False
.SplitRow = 0
.SplitColumn = 0
.WindowState = saveWindowState
End With
End Sub
副作用
SplitRow や SplitColumn を有効に使っているコードは、これらを無効にしてしまいます。ご注意ください。
Application.ScreenUpdating の設定如何にかかわらず、一瞬 Window がちらつく場合があります。
免責
コード例は説明のために極端に単純化している場合があります。コード例以外の部分で基本的な事柄の説明が省略されているかもしれません。
エラーを回避するのが目的だったためタイトルには「安全に」とか書きましたが、副作用が結構あるのでむしろ危険かもしれません。