1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

安全に(?)「ウィンドウ枠の固定」を行う

Last updated at Posted at 2016-11-18

追記(注意)

通常の方法(マクロの記録で得られるコードを実行するか、手動でウィンドウ枠の固定を行う)でウィンドウ枠の固定を行ったワークシートと行き来するとレイアウトが崩れるという問題が発生しました。引き続き検証しますが、しばらく以下のコードは使わない方がよさそうです。

はじめに

タイトルでお分かりいただけるかとは思いますが、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 がちらつく場合があります。

免責

コード例は説明のために極端に単純化している場合があります。コード例以外の部分で基本的な事柄の説明が省略されているかもしれません。

エラーを回避するのが目的だったためタイトルには「安全に」とか書きましたが、副作用が結構あるのでむしろ危険かもしれません。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?