午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

午後ツールその54、ウィンドウ枠の固定を引き継いで新しいウィンドウを開く

 
2017/01/07
新しいウィンドウを開いて整列ボタンで
元のウィンドウにウィンドウ枠固定があった場合には、新しいウィンドウにも同じ位置に枠固定するようにした
 
 
イメージ 1
この水平2分割整列ボタンと、その隣の垂直2分割整列ボタンの動きを変更した
 
 
イメージ 2
スクロールしても一番上の行と左の2列が隠れないように
C2セルの位置でウィンドウ枠の固定をしている状態のブック
これを水平2分割整列すると…
 
前回までは
イメージ 3
新しいウィンドウを開くで開かれたウィンドウにはウィンドウ枠の固定がなくなっていた
 
 
今回のバージョンでは
イメージ 4
新しく開かれたウィンドウにも元のウィンドウと同じ位置で
枠固定するようにした
 
イメージ 6
アクティブシート以外の枠固定も引き継ぐ
 
 
イメージ 5
垂直2分割整列でも同じく引き継ぐ
 
これでうっかり元のウィンドウを閉じてしまって、また新たにウィンドウ枠の固定をする手間が省けるようになった!どちらを閉じてもOK!
 
 
マクロでウィンドウ枠の固定
イメージ 7
C2セルがアクティブの状態で
↓を実行すると
'アクティブセルの位置でウィンドウ枠の固定
Sub testfreeze()
    ActiveWindow.FreezePanes = True
End Sub
↓C2の位置で枠固定される
イメージ 8
 
WindowのFreezePanesプロパティにTrueを指定すると
そのWindowのアクティブシートのアクティブセルの位置で固定されるみたい
逆に言うと固定したい位置のセルがアクティブセルではないときには順番に
WindowをActive、SheetをActive、cellをActiveにしないとできない?
めんどくさすぎる
枠の解除はFreezePanesにFalseを指定するだけなんだよねえ
 
枠固定位置の取得
Sub testfreezeaddress()
    r = ActiveWindow.SplitRow
    c = ActiveWindow.SplitColumn
    MsgBox r & "行目、" & c & "列目"
End Sub
これをさっきC2で固定したウィンドウで実行すると…
 
イメージ 9
取得できる
WindowのSplitRow、SplitColumnでそれぞれ行列の位置を取得できる
取得できるなら設定もできるんじゃないかと
枠固定を解除してから
Sub testsplitrow()
    ActiveWindow.SplitRow = 3
End Sub
これを実行すると
イメージ 10
なんか違う
これは
イメージ 11
このウィンドウの分割
ってことで枠固定はアクティブセルの位置でしかできないみたい
 
 
垂直2分割整列ボタンのマクロ
'元のウィンドウ枠固定があった場合に新しいウィンドウにも同じ位置で枠固定
Sub SplitFreezePanes()
    If ActiveWorkbook.Windows.Count <> 1 Then Exit Sub
    Dim oldW As Window: Set oldW = ActiveWindow
    Dim newW As Window
    Set newW = ActiveWindow.NewWindow '新しいウィンドウを開く
    Dim activeS As Worksheet
    Set activeS = ActiveSheet 'アクティブシートを記録
     '元のウィンドウにウィンドウ枠固定があった場合
     '新しいウィンドウも同じ位置で枠固定する
     'これをシートごとに設定する
    Application.ScreenUpdating = False
    Dim splitR As Long, splitC As Long
    Dim ss As Worksheet
    For i = 1 To oldW.SheetViews.Count
        '元の枠固定位置を取得
        'ウィンドウとシートをアクティブにしないと取得できない
        oldW.Activate
        Set ss = oldW.SheetViews.Item(i).Sheet
        ss.Activate
        If oldW.FreezePanes = True Then '枠固定されているものだけ
            splitR = oldW.SplitRow      '行位置
            splitC = oldW.SplitColumn   '列位置
            '新しく開かれたウィンドウに枠固定指定
            newW.Activate 'アクティブにしないと設定できない
            Set ss = oldW.SheetViews.Item(i).Sheet
            ss.Activate
            Dim r As Range
            Set r = ss.Cells(splitR + 1, splitC + 1)
            r.Activate '枠固定はアクティブセルの位置のみで指定できる
            newW.FreezePanes = True 'アクティブセルの位置で枠固定
        End If
    Next
    '元のアクティブシートをそれぞれのウィンドウでアクティブにする
    oldW.Activate
    activeS.Activate
    newW.Activate
    activeS.Activate
    '水平2分割整列
    ActiveWorkbook.Windows.Arrange xlArrangeStyleHorizontal
    Application.ScreenUpdating = True
End Sub
 
元のウィンドウのシート全部を一枚づつ切り替えて枠固定の有無を確認して
あったら新しく開かれたウィンドウの同じシートに切り替えて枠固定の設定している
取得も設定もWindowをActive、SheetをActiveってしないとできないので
かなり冗長な感じになっている
 
 
ダウンロード
 
 
前回の記事は5日前
午後ツールその53、ウィンドウの整列、異なるブック(ウィンドウ)の整列 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14655664.html
 
次回は24日後
午後ツールその55、選択セル範囲を図形のテキストボックスにする、印刷用の点線を消すマクロを追加 ( Windows ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/14715274.html