「wsh vbs excel ウィンドウ枠の固定 シート」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
Excelのウィンドウ枠の固定を行う、
VBScriptを探していた方による検索キーワードです。
ウィンドウ枠の固定を行うサンプルスクリプト
いつものように参考になりそうなスクリプトを作ってみました。
Const FREEZE_CELL = "A1" ' ウィンドウ枠を固定するセル
'-- begin main ----
Dim args
Set args = Wscript.Arguments
If args.Count < 1 Then
MsgBox "ウィンドウ枠を固定したいExcelファイルを、ドラッグ&ドロップしてください。"
Wscript.Quit
End If
Private xls
Set xls = CreateObject("Excel.Application")
xls.Visible = False
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim f_path ' ファイルのフルパス
For Each f_path in args
Select Case UCase(fso.GetExtensionName(f_path))
Case "XLS", "XLSX", "XLSM", "XLSB"
Call freezePanesAllWorksheets(f_path)
Case Else
MsgBox fso.GetFileName(f_path) & "はExcelファイルではありません。"
End Select
Next
Set fso = Nothing
xls.Quit
Set xls = Nothing
MsgBox "スクリプトが終了しました。"
'-- end main ----
Private Sub freezePanesAllWorksheets(ByVal bk_path)
With xls
Dim bk
Set bk = .Workbooks.Open(bk_path)
Dim ws
For Each ws In bk.Worksheets
If ws.Visible Then
ws.Select
.ActiveWindow.FreezePanes = False
.Range(FREEZE_CELL).Offset(1, 1).Select
.ActiveWindow.FreezePanes = True
End If
Next
bk.Save
bk.Close
Set bk = Nothing
End With
End Sub
上記のスクリプトを拡張子「.vbs」で保存して、Excelファイルをドラッグアンドドロップすると、非表示になっていないワークシートで、1行目1列目が固定されます。
サンプルスクリプトの解説
基本構造は、全シートを表示するVBScriptと同じですが、
For Each f_path in args
Select Case UCase(fso.GetExtensionName(f_path))
Case "XLS", "XLSX", "XLSM", "XLSB"
Call freezePanesAllWorksheets(f_path)
上記のFor Each~Nextループから呼んでいる、Subプロシージャが異なっています。
ウィンドウ枠の固定をVBA(Visual Basic for Applications)で実行する場合、Worksheetオブジェクトには該当するプロパティがなく、WindowオブジェクトのFreezePanesプロパティを利用します。
また、既にウィンドウ枠の固定が行われていた場合には、一旦解除する必要があります。
そのために、一旦ワークシートを選択して、
ws.Select
ウィンドウ枠の固定を解除して、
.ActiveWindow.FreezePanes = False
定数・FREEZE_CELLで指定されているA1セルの1行・1列右下のセルを選択して、
.Range(FREEZE_CELL).Offset(1, 1).Select
ウィンドウ枠の固定を行う処理を地道に行っています。
.ActiveWindow.FreezePanes = True
セルを選択する部分を、ついつい、
.ws.Range(FREEZE_CELL).Offset(1, 1).Select
と指定してしまいがちですが(私もやりました)、一旦ワークシートの選択をしてから、
ws.Select
セルの選択を行う必要があります。
.Range(FREEZE_CELL).Offset(1, 1).Select
ウィンドウ枠の固定を手動で行う場合、固定しない一番左上のセルを選択する必要がありますが、VBScriptから行う場合は、固定するセルを指定するほうがわかり良さそうに感じたので、定数をFREEZE_CELLという名前にして、おいて、
Const FREEZE_CELL = "A1" ' ウィンドウ枠を固定するセル
RangeオブジェクトのOffsetプロパティを使って、固定しない一番左上のセルを選択するようにしています。
.Range(FREEZE_CELL).Offset(1, 1).Select
選択する操作が入っているので、そもそも表示されているワークシートだけを処理対象にしています。
For Each ws In bk.Worksheets
If ws.Visible Then
また、Excel VBAではなくVBScriptであるため、
With xls
Set bk = .Workbooks.Open(bk_path)
.Range(FREEZE_CELL).Offset(1, 1).Select
.ActiveWindow.FreezePanes = True
のように、辿るオブジェクトの階層が深くなってしまうのが厄介なところです。
Excelのオブジェクトモデルが頭に入っていない方には、意外と難易度の高そうな処理だと感じます。
- Newer:コメントを削除するPowerPointマクロ
- Older:VBAでスライドマスターの最背面Shape色を変更する
Home » WSH・Windows Script Hostの使い方 » Excelのウィンドウ枠固定を行うVBScript