これは何?
Excelの非表示シートをすべて表示するスクリプト。複数ファイルの一括処理も対応。ファイルを開いてすべてのシートを表示状態にするだけで上書き保存はしないので注意。
おまけで、ブック毎シート毎にもともと表示/非表示のどちらだったかを一覧化する簡素レポート機能付き。
SendToフォルダに置いて使う。(%APPDATA%\Microsoft\Windows\SendTo)
Excelシートの表示と非表示
Excelのシートはシートタブ上で右クリック>「非表示」でシートを非表示にでき、同様に右クリック>「再表示」で非表示にしたシートを表示状態に戻すことができる。
「非表示」は複数シートを選択することで一括処理ができるが、「表示」は1シートずつしかできないため、たくさんのシートをまとめて表示したい欲求が出てくる。
非表示シートは情報漏えいのリスク源
非表示シートは作った人しか知らないし、作った人ですら忘れていることもありえる(というかあった)。最近のExcelは非表示シートがあると保存時に警告が出るはずなんだけど、やらかす人は無自覚のうちにチェック機能を無効化してしまうものだから困ったものだ。
コード
非表示シートを表示する(Excel).vbs
Option Explicit
Const xlWBATWorksheet = -4167
Dim FSO: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim WSH: Set WSH = CreateObject("WScript.Shell")
Main
WScript.Quit
'***********************************************************
' メイン関数
'***********************************************************
Sub Main()
Dim vbReturn
Dim flgReport
Dim objExcelApp
Dim wsReport
Dim strArgument
' レポート出力の確認
vbReturn = MsgBox("実施結果レポートを作成しますか?", vbYesNoCancel)
If vbReturn = vbYes Then
flgReport = True
ElseIf vbReturn = vbNo Then
flgReport = False
Else
Exit Sub
End If
' Excelを起動
Set objExcelApp = CreateObject("Excel.Application")
' Excelを可視化
objExcelApp.Visible = True
' レポート出力用のブックを作成
If flgReport = True Then
Set wsReport = objExcelApp.Workbooks.Add(xlWBATWorksheet).Worksheets(1)
Else
Set wsReport = Nothing
End If
' コマンドラインのファイルを順に処理する
For Each strArgument In WScript.Arguments.Unnamed
' ファイルを開いてすべてのシートを表示する (Excel)
Call ShowAllSheet(strArgument, wsReport, objExcelApp) ' ※すべてのファイルを1つのExcelプロセスで処理する場合
' Call ShowAllSheet(strArgument, wsReport, Nothing) ' ※ファイル毎にExcelプロセスを分けて処理する場合
Next
' 参照を解放する
' メモ:MSを信じれば(足を)すくわれる
Set wsReport = Nothing
Set objExcelApp = Nothing
End Sub
'***********************************************************
' ファイルを開いてすべてのシートを表示する (Excel)
'***********************************************************
Sub ShowAllSheet(strFile, opt_wsReport, opt_objExcelAppShare)
Dim objExcelApp
Dim wbTargetFile
Dim wsTargetFile
' Excelプロセスの選択
If opt_objExcelAppShare Is Nothing Then
' ファイル毎にExcelプロセスを分けて処理する場合
' Excelを起動
Set objExcelApp = CreateObject("Excel.Application")
' Excelを可視化
objExcelApp.Visible = True
Else
' すべてのファイルを1つのExcelプロセスで処理する場合
' 起動済みのExcelを使用
Set objExcelApp = opt_objExcelAppShare
End If
' Excelでファイルを開く
Set wbTargetFile = objExcelApp.Workbooks.Open(strFile)
' すべてのシートを表示する
For Each wsTargetFile In wbTargetFile.Sheets
' レポートを出力
If Not (opt_wsReport Is Nothing) Then
Call WriteReport(opt_wsReport, wsTargetFile)
End If
' シートを表示する
wsTargetFile.Visible = True
Next
' 参照を解放する
' メモ:MSを信じれば(足を)すくわれる
Set wsTargetFile = Nothing
Set wbTargetFile = Nothing
Set objExcelApp = Nothing
End Sub
'***********************************************************
' レポートを出力
'***********************************************************
Sub WriteReport(wsReport, wsTargetFile)
' レポート出力用のブックにフォーカスする
Call wsReport.Activate()
' (1列目) ファイル名
wsReport.Application.Selection = wsTargetFile.Parent.FullName
' (2列目) シート名
wsReport.Application.Selection.Offset(0, 1) = wsTargetFile.Name
' (3列目) 表示/非表示
If wsTargetFile.Visible Then
wsReport.Application.Selection.Offset(0, 2) = "表示"
Else
wsReport.Application.Selection.Offset(0, 2) = "非表示"
End If
' フォーカスを次の行に移動
wsReport.Application.Selection.Offset(1, 0).Select
End Sub