Home » WSH・Windows Script Hostの使い方 » Excelのウィンドウ枠固定を行うVBScript

WSH, VBScript, Excel

「wsh vbs excel ウィンドウ枠の固定 シート」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

Excelのウィンドウ枠の固定を行う、

Excelのウィンドウ枠固定を行うVBScript

VBScriptを探していた方による検索キーワードです。

[スポンサードリンク]

ウィンドウ枠の固定を行うサンプルスクリプト

いつものように参考になりそうなスクリプトを作ってみました。

Option Explicit

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.Worksheets(1).Select
  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プロパティを利用します。

Excelのウィンドウ枠固定を行うVBScript

また、既にウィンドウ枠の固定が行われていた場合には、一旦解除する必要があります。

そのために、一旦ワークシートを選択して、
    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のオブジェクトモデルが頭に入っていない方には、意外と難易度の高そうな処理だと感じます。

[スポンサードリンク]

Home » WSH・Windows Script Hostの使い方 » Excelのウィンドウ枠固定を行うVBScript

「WSH・Windows Script Hostの使い方」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.