下記記事でも書いていますが、xlsxやdocxといった、OOXML形式のOfficeファイルをZIP解凍すると、中にあるXMLファイルから様々な情報を取得することができます。
ファイル数が少なければ特に問題は無いのですが、ファイル数が多いとき、いちいち解凍してファイルを探してテキストエディタで開いて…というのは少々面倒臭く感じます。
そこで、ドラッグ&ドロップするだけでファイルの情報を取得できるよう、スクリプトを書くことにしました。
Option Explicit
Dim Args
Set Args = WScript.Arguments
If Args.Count < 1 Then
MsgBox "Officeファイルを当スクリプトファイルにドラッグ&ドロップしてください。", vbExclamation + vbSystemModal
WScript.Quit
End If
GetOpenXMLInfo Args(0)
Private Sub GetOpenXMLInfo(ByVal TargetFilePath)
Dim TmpFolderName
Dim TmpFolderPath
Dim TmpFileName
Dim TmpFilePath
Dim DpFolderPath
Dim AppFilePath
Dim CoreFilePath
Dim AppVersion
Dim dc_creator
Dim cp_lastModifiedBy
Dim dcterms_created
Dim dcterms_modified
Dim d1, d2
Const dp = "docProps"
Const app = "app.xml"
Const core = "core.xml"
'作業用フォルダ作成・作業用ファイル(zip)コピー
TmpFolderName = Replace(Now(), "/", "")
TmpFolderName = Replace(TmpFolderName, ":", "")
TmpFolderName = Replace(TmpFolderName, " ", "")
TmpFolderName = "tmp_" & TmpFolderName
With CreateObject("Scripting.FileSystemObject")
TmpFolderPath = AddPathSeparator(.GetFile(TargetFilePath).ParentFolder.Path) & _
TmpFolderName
If .FolderExists(TmpFolderPath) = True Then
MsgBox "作業用フォルダがすでに存在しています。" & vbNewLine & _
"処理を中止します。", vbExclamation + vbSystemModal
Exit Sub
End If
.CreateFolder TmpFolderPath
TmpFileName = .GetBaseName(.GetFile(TargetFilePath)) & ".zip"
TmpFilePath = AddPathSeparator(TmpFolderPath) & TmpFileName
.CopyFile TargetFilePath, TmpFilePath, True
End With
'zipファイルから[docProps]フォルダをコピー
With CreateObject("Shell.Application")
.Namespace(TmpFolderPath).CopyHere .Namespace(TmpFilePath).Items.Item(dp)
End With
'xmlファイルのパス取得
With CreateObject("Scripting.FileSystemObject")
DpFolderPath = AddPathSeparator(TmpFolderPath) & dp
If .FolderExists(DpFolderPath) = False Then
MsgBox "[docProps]フォルダが見つかりませんでした。" & vbNewLine & _
"処理を中止します。", vbExclamation + vbSystemModal
DelFolder TmpFolderPath
Exit Sub
End If
AppFilePath = AddPathSeparator(DpFolderPath) & app
CoreFilePath = AddPathSeparator(DpFolderPath) & core
If (.FileExists(AppFilePath) = False) Or _
(.FileExists(CoreFilePath) = False) Then
MsgBox "XMLファイルが見つかりませんでした。" & vbNewLine & _
"処理を中止します。", vbExclamation + vbSystemModal
DelFolder TmpFolderPath
Exit Sub
End If
End With
'xmlファイルから値を取得
With CreateObject("MSXML2.DOMDocument")
.async = False
If .Load(AppFilePath) = False Then
MsgBox app & "ファイルの読み込みに失敗しました。" & vbNewLine & _
"処理を中止します。", vbExclamation + vbSystemModal
DelFolder TmpFolderPath
Exit Sub
End If
On Error Resume Next
AppVersion = .SelectSingleNode("/Properties/AppVersion").Text
On Error GoTo 0
If .Load(CoreFilePath) = False Then
MsgBox core & "ファイルの読み込みに失敗しました。" & vbNewLine & _
"処理を中止します。", vbExclamation + vbSystemModal
DelFolder TmpFolderPath
Exit Sub
End If
On Error Resume Next
dc_creator = .SelectSingleNode("/cp:coreProperties/dc:creator").Text
cp_lastModifiedBy = .SelectSingleNode("/cp:coreProperties/cp:lastModifiedBy").Text
dcterms_created = .SelectSingleNode("/cp:coreProperties/dcterms:created").Text
d1 = Replace(dcterms_created, "T", " ")
d1 = Replace(d1, "Z", "")
dcterms_modified = .SelectSingleNode("/cp:coreProperties/dcterms:modified").Text
d2 = Replace(dcterms_modified, "T", " ")
d2 = Replace(d2, "Z", "")
On Error GoTo 0
End With
DelFolder TmpFolderPath
'結果表示
MsgBox "File:" & TargetFilePath & vbNewLine & _
"AppVersion:" & AppVersion & vbNewLine & _
"dc:creator:" & dc_creator & vbNewLine & _
"cp:lastModifiedBy:" & cp_lastModifiedBy & vbNewLine & _
"dcterms:created:" & dcterms_created & "(" & DateAdd("h", 9, CDate(d1)) & ")" & vbNewLine & _
"dcterms:modified:" & dcterms_modified & "(" & DateAdd("h", 9, CDate(d2)) & ")", vbInformation + vbSystemModal
End Sub
Private Sub DelFolder(ByVal TargetFolderPath)
With CreateObject("Scripting.FileSystemObject")
.DeleteFolder TargetFolderPath, True
End With
End Sub
Private Function AddPathSeparator(ByVal s)
If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92)
AddPathSeparator = s
End Function
上記コードをvbsファイルとして保存した後、Officeファイルをドラッグ&ドロップすると、ファイルを作成したアプリケーションのバージョンや作成者、更新日時といった情報がメッセージボックスで表示されます。


ファイルの情報が分かったからといってどうということもないのですが、上記コードを応用すると、Officeファイルに含まれる画像ファイルを抜き出したり、なんてこともできるかと思います。























この記事へのコメントはありません。