【SendTo】非表示シートを一括表示(Excel)

# これは何？
Excelの非表示シートをすべて表示するスクリプト。複数ファイルの一括処理も対応。ファイルを開いてすべてのシートを表示状態にするだけで上書き保存はしないので注意。
おまけで、ブック毎シート毎にもともと表示/非表示のどちらだったかを一覧化する簡素レポート機能付き。
SendToフォルダに置いて使う。(%APPDATA%\Microsoft\Windows\SendTo)


# Excelシートの表示と非表示
Excelのシートはシートタブ上で右クリック＞「非表示」でシートを非表示にでき、同様に右クリック＞「再表示」で非表示にしたシートを表示状態に戻すことができる。
「非表示」は複数シートを選択することで一括処理ができるが、「表示」は1シートずつしかできないため、たくさんのシートをまとめて表示したい欲求が出てくる。


# 非表示シートは情報漏えいのリスク源
非表示シートは作った人しか知らないし、作った人ですら忘れていることもありえる(というかあった)。最近のExcelは非表示シートがあると保存時に警告が出るはずなんだけど、やらかす人は無自覚のうちにチェック機能を無効化してしまうものだから困ったものだ。


# コード

~~~vb:非表示シートを表示する(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

	' 参照を解放する
	' メモ：ＭＳを信じれば(足を)すくわれる
	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

	' 参照を解放する
	' メモ：ＭＳを信じれば(足を)すくわれる
	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

~~~