コアダンプの数だけ強くなれるよ

見習いエンジニアの備忘log

VBScriptでWordファイルのページ数一覧を作ってみる

ある日、大量のWordファイルで作られた資料の中身を目視確認する必要に迫られました。

複数人で分担して実施するのですがファイル毎にボリューム(ページ数)が異なるためファイル数で割り振ると不公平が発生します。

そこで事前にファイル単位のページ数がわかるといいなぁということでページ数の一覧を生成するスクリプトを作ってみました。

ソースコード


作成したスクリプトはスクリプトを実行したディレクトリ配下にあるWordファイルを検索しページ数を取得して結果をファイル出力します。

Wordファイルのページ数はBuiltinDocumentPropertiesで取ってこれます。

下記を参考にしました。

www.relief.jp


文字コードはSJISなので注意です。(UTF-8だと実行時に日本語を扱っている行で怒られます。)

'
'VBScript File
'Character code is SJIS
'

Option Explicit

Call Main()

'
'@func Main
'@brief メイン関数
'
Sub Main()
  'ファイルシステムオブジェクトの生成
  Dim fso 
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  'カレントDIR配下にあるWordファイルのページ数を取得
  Dim result
  result = GetNumberOfWordFilePageAll(fso, fso.GetFolder("."))
  
  '結果をファイルに出力
  Dim ret
  ret = WriteResultToFile(fso, "result.csv", result)
  
End Sub

'
'@func GetNumberOfWordFilePageAll
'@brief カレントDIRにあるWordファイルのページ数を取得する
'@param[in] dir  ディレクトリパス
'@param[in] fso  ファイルシステムオブジェクト
'
Function GetNumberOfWordFilePageAll(fso, dir)
  
  Dim result
  result= ""
  
  ' カレントDIRにあるwordファイルのページ数を数える
  Dim File
  For Each File in dir.Files
    result= result& GetNumberOfWordPages(fso, File.path)
  Next
  
  ' カレントDIR配下にあるDIRに対して再帰的に実行する
  Dim Subdir
  For Each Subdir in dir.SubFolders
    ' 再帰呼び出し
    result= result& GetNumberOfWordFilePageAll(fso, Subdir)
  Next
  
  GetNumberOfWordFilePageAll = result
  
End Function

'
'@func GetNumberOfWordPages
'@brief Wordファイルのページ数を取得する
'@param[in] fso       ファイルシステムオブジェクト
'@param[in] filepath  対象ファイル
'
Function GetNumberOfWordPages(fso, filepath)
  
  '拡張子のチェック(wordファイル以外は対象外)
  Dim ExtName
  ExtName = UCase(fso.GetExtensionName(filepath))
  If Not (ExtName = "DOC" OR ExtName = "DOCX") Then
    Exit Function
  End If
  
  ' wordファイルを開く
  Dim wordApp
  Set wordApp = WScript.CreateObject("Word.Application")
  Dim doc
  Set doc = wordApp.Documents.Open(filepath)
  
  ' ファイル名,ページ数を返す
  GetNumberOfWordPages = filepath & "," & doc.BuiltInDocumentProperties(14) & vbNewLine
  
  ' wordファイルを閉じる
  doc.Close
  Set doc = Nothing
  wordApp.Quit
  Set wordApp = Nothing
  
End Function


' @func WriteResultToFile
' @brief 処理結果をファイルに出力
' @param[in] fso      ファイルシステムオブジェクト
' @param[in] filename 出力ファイル名
' @param[in] result   処理結果
'
Function WriteResultToFile(fso, filename, result)
  
  Dim file
  Set file = fso.CreateTextFile("." & "\" & filename)
  Dim header
  header = UCase("ファイル名, ページ数")
  file.WriteLine(header)
  file.WriteLine(result)
  file.close
  Set file = Nothing
  
  MsgBox "処理結果を '" & filename & "' に出力しました。"
  
End Function


実行結果


ちゃんと動作するか適当なワードファイルを用意して試してみます。

カレントにページ数が3のファイルを、サブディレクトリにページ数が1のファイルを作り配置します。

その他、Wordファイル以外を誤ってカウントしないか確認するためにダミーのテキストファイルを配置します。

f:id:segmentation-fault:20171125221856p:plain

f:id:segmentation-fault:20171125221904p:plain


こんな感じで配置しました。


ファイルの配置したらスクリプトをクリックして実行してみます。

f:id:segmentation-fault:20171125221908p:plain

f:id:segmentation-fault:20171125221911p:plain

ちゃんと動いてそうですね。

あとは記載内容のチェックもある程度自動化できればいいなぁ。

図とかは限界がありそうですが。