🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の FreezePanes — 誤った行を固定せずにヘッダー行を固定する

|

Excel VBA の FreezePanes — 誤った行を固定せずにヘッダー行を固定する

TL;DRActiveWindow.FreezePanes = True は、アクティブセルの上と左にあるものすべて を固定 し、残りがスクロールしても動かないようにします。人を驚かせるのは二点です。固定は選択されているセル を基準に効くので、先にアクティブセルを配置しなければなりません(A2 を選べば 1 行目、B2 を選べば 1 行目と A 列を固定)。そして固定はシートではなく ウィンドウ に宿るので、ActiveWindow.FreezePanes になり、同じファイルの二つ目のウィンドウは独自の固定を持ちます。オフにするには = False を使い、別 の場所で固定し直す前には必ず解除します。

' FreezePanes はアクティブセルの上と左にあるものすべてを固定する。
Application.Goto Range("A2"), Scroll:=True  ' 先頭行を固定:アクティブセルをその下に置く
ActiveWindow.FreezePanes = True

' 先頭行 と 最初の列 を固定:アクティブセルを B2 に
Worksheets("Report").Activate
Range("B2").Select
ActiveWindow.FreezePanes = True

' 解除:
ActiveWindow.FreezePanes = False

FreezePanes は、表示 > ウィンドウ枠の固定 のコード版です——千行のデータをスクロールして下がって も、ヘッダー行を画面に留めておく、あの設定です。数字の壁を、人が実際に読めるものに変えてくれるので、 すべてのレポートマクロにスクリプトとして組み込む価値のある、数少ないビュー調整の一つです。同時に、 正当な理由で アクティブセルとアクティブウィンドウに触れなければならない、数少ない VBA プロパティの 一つでもあり——だからこそ、人を戸惑わせる振る舞いをするのです。

この記事で学べること

  • 考え方の軸——固定は ビュー の角を固定し、ウィンドウに宿る
  • 最も大事なルール——固定は アクティブセル を基準に効くので、先に配置する
  • なぜ ActiveWindow.FreezePanes なのか、そして新しいウィンドウごとに独自の固定を持つ理由
  • オフにすること、そしてなぜ固定し直す前に解除しなければならないのか
  • FreezePanesSplit の違い、そして SplitRow を通した選択のいらない道
  • レポートマクロで固定が属する場所——最後、たった今組み立てたシートの上で

考え方の軸:ビューの角を固定する

ウィンドウ枠を固定しても、データも、シートも、一つのセルも変わりません——変わるのは、あなたが覗いてい る ウィンドウ です。グリッドが一本の水平線と一本の垂直線で四つの区画に分かれる様子を思い描いてくだ さい。左上の区画はピン留めされ、残りの三つはその下をスクロールします。FreezePanes はその線を引き、角 をピン留めします。それがすべての考えで、他のすべてを説明する二つの帰結を伴います。分割は どこかに 位 置づけられなければならないこと、そして分割は ウィンドウ に属すること——スクロールをするのはウィンド ウだからです。

「これはウィンドウ上のビュー設定だ」を握れば、二つの定番の驚き——誤った行を固定すること、固定が定着し ないこと——は謎ではなくなります。

最も大事なルール:アクティブセルの位置で固定される

ほとんどの「誤った行を固定してしまった」というバグの裏には、この間違いがあります。FreezePanes は行番 号も範囲も取りません。設定する瞬間に アクティブになっているセルの上と左にあるものすべて を固定しま す。つまりアクティブセルが操作の要であり、それを配置しなければ、カーソルがたまたまあった場所で固定して しまいます。

ActiveWindow.FreezePanes = True   ' 現在の選択位置で固定される - それがどこであろうと

ルールは、固定したいものの ちょうど下と右 にアクティブセルを置いてから、プロパティを設定することです。

  • 先頭行 を固定 → A2 を選ぶ(2 行目より上がすべて固定される)。
  • 最初の列 を固定 → B1 を選ぶ。
  • 先頭行と最初の列の 両方 を固定 → B2 を選ぶ。

だから記録されたマクロには、いつも ActiveWindow.FreezePanes = True の直前に Range(...).Select が現 れるのです。固定は、セルを選ぶことがコードの臭いにならない稀なケースの一つです——選択が 引数そのもの だからです。アクティブセルを正しく決めれば、固定は狙いどおりの場所に着地します。

それはシートではなく、ウィンドウに宿る

オブジェクトに注目してください。ActiveWindow.FreezePanes であって、Worksheet.FreezePanes ではあり ません。固定は、シートを見る ウィンドウ のプロパティです——そしてシートは複数のウィンドウに表示できま す。同じブックで 表示 > 新しいウィンドウ を開くと、独自の 固定状態を持つ二つ目のウィンドウが得ら れます。一方は先頭行を固定し、もう一方は固定していない、ということが起こります。これが、固定が「定着し ない」ように見える理由です。あるウィンドウに設定して、別のウィンドウを見ているのです。

マクロにとっての実務上の帰結は、固定したいシートが、設定するウィンドウの中で アクティブ でなければな らないということです——ユーザーが見ていないシートのウィンドウ枠を確実に固定することはできません。これ が、ActiveWindowActivate に手を伸ばすのが横着ではなく正しい、数少ない場面の一つである理由です。 ウィンドウこそが、まさに設定している当のものだからです。シートをアクティブにし、アクティブセルを配置し、 プロパティを設定しましょう。

オフにして、固定し直す

解除はただの代入です。

ActiveWindow.FreezePanes = False

微妙なのは固定し直すほうです。ウィンドウ枠が すでに 固定されているときに FreezePanes = True を設定 しても何も起きません——Excel は既存の固定を新しいアクティブセルへ動かしてくれないのです。だから固定を 動かすには、まず解除し、アクティブセルを置き直し、それからもう一度設定しなければなりません。

ActiveWindow.FreezePanes = False   ' 古い固定を解除する
Range("C3").Select                 ' 位置を変える
ActiveWindow.FreezePanes = True    ' 新しい角で固定する

= False の行を飛ばすと、「新しい」固定は無視され、古いものが黙って残ります。前回の実行で設定したかも しれない固定をマクロが再適用するときは、いつでも解除を最初の一手にしましょう。

FreezePanes 対 Split、そして選択のいらない道

FreezePanes はウィンドウ枠をがっちり固定します。ActiveWindow.SplitSplitRowSplitColumn を 伴う)は、代わりにドラッグできる分割 バー を作ります——区画は分かれますが、ユーザーがサイズを変えら れ、固定はされません。ほとんどのレポートマクロが欲しいのは分割ではなく固定です。とはいえ、分割プロパテ ィは、セルを選択 せずに 固定する、すっきりした方法を与えてくれます。読みやすさのためにこちらを好む人 もいます。

ActiveWindow.SplitRow = 1        ' 1 行目の下で分割
ActiveWindow.SplitColumn = 1     ' A 列の後ろで分割
ActiveWindow.FreezePanes = True  ' 分割を固定に変える - Select は不要

SplitRow / SplitColumn を設定してから FreezePanes = True にすると、分割位置で固定されるので、アク ティブセルには一切触れません。どちらのスタイルでもかまいません——あなたにとってより明快に読めるほうを 使いましょう。選択のいらない版は、マクロの実行後にユーザーを意外なセルの上に残すのを避けられます。

レポートマクロで固定はどこに置くか

固定は仕上げの一手なので、最後 に置きます——データを書き、数値書式を適用し、AutoFit を走らせたあとです。早く固定してから行を挿入・削除すると、固定が着地する場所がずれることがあります。信 頼できるパターンはこうです。シートを組み立て、サイズを整え、組み立てたシートをアクティブにし、アクティ ブセルを配置(または分割を設定)し、それから ActiveWindow.FreezePanes = True。別のシートレイアウトで 記録機能が書いた、決め打ちの Range("A2").Select を信用してはいけません——実際に生成したレポートから 固定の角を決め、そこへ意図的にアクティブセルを置きましょう。

ExcelMaster の活用

Freeze Panes は、生成したレポートを一目で使えるものにする設定であり、同時に、アクティブセルが思わぬ場 所にあったせいで 1 行目から 40 行目までを黙って固定してしまったり、誤ったウィンドウに設定されて効かな いように見えたり、古い固定が解除されなかったせいで動くのを拒んだりする設定でもあります。

ExcelMaster には、画面に留め ておきたいものをそのまま言えます——「ヘッダー行を固定して」「最初の二列と先頭行を固定して」——すると固 定をルーチンの最後の手順として書きます。正しいシートをアクティブにし、分割が意図どおりの場所に着地する ようアクティブセルを配置(または選択のいらない固定のために SplitRow / SplitColumn を設定)し、新し い固定を適用する前に古い固定を解除します。ブックとコードはあなたの手元に残ります。

よくある質問

VBA が誤った行を固定するのはなぜ?

FreezePanes が行番号ではなく アクティブセル を基準に固定し、そのアクティブセルが思っていた場所にな かったからです。選択の上と左にあるものすべてを固定します。先にアクティブセルを配置します——先頭行を固定 するには A2、先頭行と最初の列を固定するには B2 を選び——それから ActiveWindow.FreezePanes = True を設定します。

VBA で先頭行を固定するには?

アクティブセルを A2(ヘッダーの一行下)にしてから固定します。Range("A2").Select に続けて ActiveWindow.FreezePanes = True です。あるいは選択を完全に省いて、ActiveWindow.SplitRow = 1 のあと ActiveWindow.FreezePanes = True とします。設定するウィンドウの中で、シートがアクティブでなければなり ません。

VBA でウィンドウ枠の固定を解除するには?

プロパティを False に設定します——ActiveWindow.FreezePanes = False。固定を 動かす には先に解除しな ければならないことに注意してください——ウィンドウ枠がすでに固定されているときに FreezePanes = True を 設定しても何も起きないので、古い固定を解除し、アクティブセルを置き直し、それからもう一度設定します。

ActiveWindow.FreezePanes が効かないのはなぜ?

たいてい三つのうちのどれかです。固定したいシートが現在のウィンドウでアクティブでない——先にアクティブ にします。あるいはウィンドウ枠がすでに固定されていて、もう一度 True を設定しても無視される——False にし、置き直し、それから True にします。あるいは設定したウィンドウとは別のウィンドウを見ている——固定 はウィンドウごとのプロパティで、新しいウィンドウ は独自の状態を持つ二つ目のウィンドウを作ります。

FreezePanes はワークシートとウィンドウのどちらにある?

ウィンドウです。ワークシートのプロパティではなく ActiveWindow.FreezePanes なのは、固定がウィンドウの シート上でのスクロールのしかたを設定するからです。同じシートを二つのウィンドウ(表示 > 新しいウィン ドウ 経由)で表示すると、異なる固定状態を持てます。これもまた、設定するウィンドウの中でシートがアクテ ィブでなければならない理由です。

検証環境

検証環境: Excel 365 (Windows 11), VBA 7.1 — 最終確認 2026-09-10。

関連ガイド: VBA AutoFit · VBA 折り返し表示 · VBA Worksheets · VBA 列幅と行の高さ · VBA Range