マクロを様々なExcelファイルで実行する際、そのファイルがどのように「ウィンドウ枠の固定」を設定しているかを知りたい場合があります。例えば、「ウィンドウ枠の固定を一旦解除し、処理後に元に戻す」といった丁寧なマクロを作成するには、元の固定位置を把握する必要があります。
VBAには固定位置を直接取得するプロパティはありませんが、ウィンドウ枠を固定した際に生成される**「ペイン(Pane)」**の情報を調べることで、どのセルを基準に固定が設定されたのかを特定できます。この記事では、その具体的な方法を解説します。
ウィンドウ枠固定と「ペイン」の関係
「ウィンドウ枠の固定」を実行すると、Excelのウィンドウは内部的に複数の領域(ペイン)に分割されます。
- 先頭行のみ固定: 2つのペイン(上下)に分割
- 先頭列のみ固定: 2つのペイン(左右)に分割
- 行と列を両方固定: 4つのペインに分割
このとき、私たちが普段スクロールして操作しているメインの領域は、常にインデックス番号が最も大きいペインになります。この性質を利用して、どのパターンであっても常にメインのスクロール領域を特定するのが、今回のテクニックの鍵です。
完成したVBAコード
以下が、ウィンドウ枠の固定位置を特定し、その基準となっているセルのアドレスを表示するVBAコードです。
Sub GetFreezePaneAddress()
' 変数を宣言します
Dim mainPane As Pane
Dim freezeBasisAddress As String
' ウィンドウ枠が固定されているかを確認
If ActiveWindow.FreezePanes = False Then
MsgBox "このウィンドウでは、ウィンドウ枠が固定されていません。", vbInformation
Exit Sub
End If
' --- 1. メインとなるペイン(右下のスクロール領域)を取得 ---
' Panes.Countで最後のペインを特定するのが、どの分割パターンにも対応できる確実な方法です
Set mainPane = ActiveWindow.Panes(ActiveWindow.Panes.Count)
' --- 2. ペインを左上までスクロールさせる ---
' これをしないと、現在のスクロール位置によって取得されるセルが変わってしまいます
With mainPane
.ScrollRow = 1
.ScrollColumn = 1
' --- 3. 表示されている領域の左上のセルアドレスを取得 ---
' スクロール後、VisibleRangeの最初のセルが基準セルになります
freezeBasisAddress = .VisibleRange.Cells(1, 1).Address(False, False)
End With
' --- 4. 結果を表示 ---
MsgBox "ウィンドウ枠の固定は、セル " & freezeBasisAddress & " を基準に設定されています。"
' オブジェクトを解放
Set mainPane = Nothing
End Sub
コードのポイント解説
① メインペインの特定: Panes(ActiveWindow.Panes.Count)
ActiveWindow.Panes.Count
は、ウィンドウがいくつのペインに分割されているかを返します(非分割時は1、行または列のみ固定時は2、両方固定時は4)。そして、主要なスクロール領域は常に最後のペインとなります。
したがって、ActiveWindow.Panes(ActiveWindow.Panes.Count)
と記述することで、どのような固定パターンであっても、常に右下のメインペインを確実に取得できます。
② ペインのスクロール: .ScrollRow
/ .ScrollColumn
.ScrollRow = 1
.ScrollColumn = 1
このステップは非常に重要です。もしユーザーがペイン内を下にスクロールした状態でマクロを実行すると、次に解説する.VisibleRange
が指す範囲が変わってしまいます。
処理の最初に、ペイン内のスクロール位置を強制的に一番左上(そのペイン内での1行目、1列目)に戻すことで、誰がどのような状態で実行しても、必ず同じ基準でセルを取得できるようにしています。
③ 基準セルの取得: .VisibleRange.Cells(1, 1)
.VisibleRange
: そのペイン内で、現在画面に表示されているセル範囲を返します。.Cells(1, 1)
: その範囲の中での最初のセル、つまり左上のセルを指します。
ペインを左上までスクロールさせた後なので、この.VisibleRange.Cells(1, 1)
が指すセルこそが、ウィンドウ枠の固定を設定した際の基準セル(固定した領域のすぐ右下のセル)となります。
まとめ
VBAでウィンドウ枠の固定位置を取得する手順は、以下の通りです。
- ウィンドウが分割されているかを確認する (
ActiveWindow.FreezePanes
)。 - メインの操作領域である、最後のペインを特定する (
ActiveWindow.Panes(Panes.Count)
)。 - そのペインを左上までスクロールさせる (
.ScrollRow = 1
,.ScrollColumn = 1
)。 - その状態で見えている範囲 (
.VisibleRange
) の最初のセルのアドレスを取得する。
この方法を使えば、マクロが実行されるシートの表示状態に左右されず、ウィンドウ枠の固定に関する情報を正確に把握することができます。