ティムは、わずかに異なる列ヘッダーを持つ2つの別々のセクション(上部セクションと下部セクションと呼びましょう)を持つワークシートをいくつか持っています。下にスクロールしている間、上部のセクションヘッダーが表示されるように上部の行をフリーズしましたが、特定のポイントを超えてスクロールした後、ティムは上部のヘッダーがまだ上部にある下部のデータを見ることになります。彼は、下部セクションのデータのみが表示されるポイントまでスクロールダウンしたときに、そのフリーズされたヘッダー行を切り替えて下部セクションのヘッダーを表示する方法があるかどうかを知りたいと考えています。

はい、これを行う方法はありますが、マクロを使用する必要があります。

マクロベースのソリューションを検討する前に、各セクションが異なるワークシート上にあるようにデータを再構築することを検討することをお勧めします。 (設計の観点からは、これが最も簡単な解決策です。)これが不可能な場合は、マクロを調べる必要があります。

簡単な方法の1つは、選択した行に応じて、ワークシートの一番上の行(行1)に格納されているものを変更することです。たとえば、次のマクロは、アクティブセルの場所に基づいて一番上の行を変更します。行40の前にある場合は、1セットのヘッダーが最初の行に詰め込まれます。行40の後に、別のヘッダーのセットが詰め込まれている場合。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim iBottomData As Integer

iBottomData = 40

If ActiveCell.Row < iBottomData Then         Cells(1, 1).Value = "Last Name"

Cells(1, 2).Value = "First Name"

Cells(1, 3).Value = "Address"

Cells(1, 4).Value = "Balance"

Else         Cells(1, 1).Value = "Account"

Cells(1, 2).Value = "Sales Rep"

Cells(1, 3).Value = "Status"

Cells(1, 4).Value = ""

End If End Sub

マクロを使用するには、2つのデータセクションを含むワークシートのコードウィンドウにマクロを配置してください。また、iBottomData変数に割り当てられた値を変更して、下部のデータセクションが始まる行番号を反映する必要があります。

ワークシートを下に移動するときにフリーズした行を実際に変更する場合は、マクロをもう少し堅牢にする必要があります。実際には、次の2つのマクロがあり(どちらもワークシートのコードウィンドウに表示されます)、選択したセルを変更したり、ワークシートを右クリックしたりすると、マクロが実行されます。

Private Sub Worksheet_BeforeRightClick(ByVal _   Target As Range, Cancel As Boolean)

Application.ScreenUpdating = False     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.EnableEvents = False     Application.Goto Cells(1, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     Application.Goto Cells(Target.Row - 1, _       Target.Column), scroll:=True     Application.EnableEvents = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(-1, 1 - Target.Column).Select     ' so the right click menu doesn't popup     ' only if this is the second header row.

Cancel = True      Application.EnableEvents = True End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Application.ScreenUpdating = False     If Cells(Target.Row, 1).Value <> "title2" Then Exit Sub     ActiveWindow.FreezePanes = False     ActiveWindow.Split = False     Application.Goto Cells(Target.Row, 1), scroll:=True     With ActiveWindow         .SplitColumn = 0         .SplitRow = 1     End With     ActiveWindow.FreezePanes = True     On Error Resume Next        'MUST reenable events     Application.EnableEvents = False     ActiveCell.Offset(1, 1 - Target.Column).Select     Application.EnableEvents = True End Sub

Worksheet_SelectionChangeイベントハンドラーは、アクティブセルカーソルがその行に当たると、フリーズした分割を見出しの2番目の行の下に自動的に移動します。この行は、行の最初のセルにテキスト「title2」が含まれているかどうかを確認するIfステートメントで検出されます。

(明らかに、これはその最初のセルに実際に何が含まれるかを反映するように変更する必要があります。)

Worksheet_BeforeRightClickイベントハンドラーは、フリーズした分割を最初の見出しのセットに戻しますが、アクティブなセルは2番目の見出しのセットの上の行に残します。

このヒントに示されている両方のマクロソリューションは、実際にワークシートをスクロールし、選択したセルを変更することを前提としていることを理解する必要があります。 (つまり、下矢印キーを押してスクロールします。)垂直スクロールバーを使用してワークシートに表示される内容を変更するだけの場合、固定された見出しは変更されないため、変更されません。選択したセルとイベントハンドラーはトリガーされません。

より広範なソリューションを作成することは、実際のオペレーティングシステムとのインターフェースを伴うため、このヒントの範囲を超えます。

ただし、このルートに興味がある場合は、ChipPearsonのWebサイトの次のページから始めるとよいでしょう。

http://www.cpearson.com/excel/DetectScroll.htm

注:

このページ(または_ExcelTips_サイトの他のページ)で説明されているマクロの使用方法を知りたい場合は、役立つ情報を含む特別なページを用意しました。

_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。

このヒント(3446)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。