目次
VisibleRange
今回の投稿は、エクセルのアプリケーションでウィンドウ枠の固定表示を行っている場合の VisibleRange プロパティの取得方法について書いてみたいと思います。
ExcelVBA のマクロを作成して取得を行ってみます。
ウインドウ枠の固定は、エクセルの「表示 ≫ ウインドウ枠の固定」で行う事ができます。
VisibleRange プロパティは、ウインドウに表示されているセル範囲を取得できるプロパティです。
例として以下の画像のワークシートを準備してみました。ウィンドウ枠の固定を行う前の状態です。
ウィンドウ枠の固定を行う前
まずは、ウィンドウ枠の固定を行う前の VisibleRange プロパティの値をマクロで取得してみたいと思います。以下のマクロのコードを作成してみました。
Sub ウィンドウ枠の固定を行う前のVisibleRangeプロパティの値を取得するマクロ()
Debug.Print ActiveWindow.VisibleRange.Address
End Sub
上記のマクロを実行するとイミディエイトウィンドウに以下のセル範囲が出力されました。
$A$1:$H$10
VisibleRange プロパティは、セルの一部分でも見えていれば、その範囲までを取得するようなので、 10 行目までが範囲として取得されているようです。
それをふまえると、上記の画像のワークシートの表示範囲と一致していますね。
「先頭行の固定」表示を行った後
次は、先頭行の固定表示を行った状態で VisibleRange プロパティの値を取得してみたいと思います。
例として以下の画像のワークシートを準備してみました。エクセルの「ファイル」メニューから「先頭行の固定」を行った後の状態です。
1 行目と 2 行目の間にウィンドウの分割線が表示されていますね。
上記の画像のワークシート上で以下のマクロを実行してみたいと思います。
Sub 先頭行の固定を行った後のVisibleRangeプロパティの値を取得するマクロ()
Debug.Print ActiveWindow.VisibleRange.Address
End Sub
マクロを実行してみると、イミディエイトウィンドウに以下の文字列が出力されました。
$A$2:$H$10
2 ~ 10 行目となっていて、下段のウィンドウの範囲が取得できていますね。
マクロ実行時に A1 セルを選択した状態になっていましたが、 $A$2:$H$10 の範囲が取得されました。
A1 セルを選択しておくことで上段のウィンドウがアクティブになっていて、上段のウィンドウの範囲が出力されると思っていましたが違うようです。
上側のウィンドウ
上下に二分割されている上側のウィンドウの VisibleRange プロパティ値も取得する下記マクロも作成してみました。
Panes(1) , Panes(2) となっている部分で 分割された 1 つ目、 2 つ目のウィンドウを指定しています。
Sub 先頭行の固定を行った後に上段下段のVisibleRangeプロパティの値を取得するマクロ()
Debug.Print ActiveWindow.Panes(1).VisibleRange.Address '上段( 1 つ目)のウィンドウ
Debug.Print ActiveWindow.Panes(2).VisibleRange.Address '下段( 2 つ目)のウィンドウ
End Sub
上のマクロを実行してみると以下の文字列がイミディエイトウィンドウに出力されました。
$A$1:$H$1
$A$2:$H$10
上段は 1 行目のみになっているので正しく取得できたようです。
Panes と Pane
ActiveWindow.Panes と ActiveWindow.Panes(1) がどんな種類のデータを返すのかを調べるマクロも作成してみました。
VarType 関数と TypeName 関数で情報を取得してみます。
Sub ActiveWindow_PanesとActiveWindow_Panes_1が返すデータの種類を調べてみるマクロ()
Debug.Print VarType(ActiveWindow.Panes)
Debug.Print TypeName(ActiveWindow.Panes)
Debug.Print VarType(ActiveWindow.Panes(1))
Debug.Print TypeName(ActiveWindow.Panes(1))
End Sub
上のマクロを実行すると、以下の文字列がイミディエイトウィンドウに出力されました。
9
Panes
9
Pane
VarType 関数の結果は両方「9」になっていますね。 VarType 関数の「9」は「Object」ということのようです。
TypeName 関数の結果は「Panes」と「Pane」になっていますので、「Panes」オブジェクトと「Pane」オブジェクトを返しているようです。
「先頭列の固定」表示を行った後
今度は、先頭列の固定表示を行った後に VisibleRange プロパティの値を取得してみたいと思います。以下の画像のワークシートを例にしたいと思います。
以下のマクロを作成してみました。左右に分割されたウィンドウを ActiveWindow.Panes(1) と ActiveWindow.Panes(2) で指定しています。
Sub 先頭列の固定を行った後に左側右側のVisibleRangeプロパティの値を取得するマクロ()
Debug.Print ActiveWindow.Panes(1).VisibleRange.Address '左側( 1 つ目)のウィンドウ
Debug.Print ActiveWindow.Panes(2).VisibleRange.Address '右側( 2 つ目)のウィンドウ
End Sub
マクロの実行結果は以下のようになりました。
$A$1:$A$10
$B$1:$H$10
A 列と B ~ H 列になっているので正常に取得できたようです。
「現在の選択範囲に基づいてウィンドウ枠の固定」表示を行った後
もうひとつのタイプとして、現在の選択範囲に基づいてウィンドウ枠の固定を行う事ができるので、その場合の VisibleRange プロパティの値の取得を行ってみたいと思います。
例として以下の画像のワークシートを準備してみました。
エクセルの操作画面で「C3」セルを選択した状態で、「表示 > ウィンドウ枠の固定(現在の選択範囲に基づいて)」をクリックすると以下の画像のように、上から 2 行分、左から 2 列分の位置でウィンドウ枠が固定されました。
以下のマクロを作成してみました。ウィンドウが 4 分割されているので、 ActiveWindow.Panes(1) から ActiveWindow.Panes(4) までの指定をしています。
4 分割された範囲がわかりやすいように背景色の塗りつぶしも行っています。
Sub 現在の選択範囲に基づいてウィンドウ枠の固定を行った後のVisibleRangeプロパティの値を取得するマクロ()
Debug.Print ActiveWindow.Panes(1).VisibleRange.Address '左上( 1 つ目)のウィンドウ
Debug.Print ActiveWindow.Panes(2).VisibleRange.Address '右上( 2 つ目)のウィンドウ
Debug.Print ActiveWindow.Panes(3).VisibleRange.Address '左下( 3 つ目)のウィンドウ
Debug.Print ActiveWindow.Panes(4).VisibleRange.Address '右下( 4 つ目)のウィンドウ
ActiveWindow.Panes(1).VisibleRange.Interior.ColorIndex = 1
ActiveWindow.Panes(2).VisibleRange.Interior.ColorIndex = 2
ActiveWindow.Panes(3).VisibleRange.Interior.ColorIndex = 3
ActiveWindow.Panes(4).VisibleRange.Interior.ColorIndex = 4
End Sub
上のマクロの結果は以下のようになりました。イミディエイトウィンドウの出力結果です。
$A$1:$B$2
$C$1:$H$2
$A$3:$B$10
$C$3:$H$10
4 分割されている範囲と一致していますね。
ワークシートの実行結果は以下のようになりました。 ColorIndex = 2 は白色の指定なのかわかりにくくなってしまいました。
テスト環境
- Windows 11 Home 64 ビット
- Microsoft Excel for Microsoft 365
あとがき
分割された個々のウインドウの操作はあまり行わないかもしれませんが、 Pane オブジェクトというものがあることを知らなかったので良い学習になりました。
以上、閲覧ありがとうございました。