フォルダ内のExcel・Word・Powerpointファイルのパスワードを一括解除するマクロ

Unprotest Files For Excel/Word/Powerpoint Automatically


2018.07.10 追記

こちらのマクロは単独フォルダのファイルに対するパスワードを解除するマクロです。

複数フォルダのファイルに対するパスワードを解除するマクロは別ページにあります。こちらのページをご覧ください。


 

はじめに

このマクロは「フォルダ内のExcel・Word・Powerpointファイルにパスワードを一括設定するマクロ」と対をなすマクロです。まずはそちらをお読みください。こちらのマクロは、一括設定とは違う一括解除に特有な部分を解説します。

・エクセルで動くマクロです。
・動作は無保証です。
・動作確認は、Windows 10 + Microsoft Excel 2016でおこなっています。
・参照設定は、「Microsoft Scripting Runtime」「Microsoft Word 16.0 Object Library」「Microsoft Powerpoint 16.0 Object Library」に対して参照設定してください(Excel 2016の場合)。

 

パスワードを一括解除するマクロ

Option Explicit

Sub UnprotectFilesForExcelWordPowerpoint()
  Dim TargetPath As String
  With Application.FileDialog(msoFileDialogFolderPicker)
    .AllowMultiSelect = False
    If .Show = True Then
      TargetPath = .SelectedItems(1) & "\"
    Else
      Exit Sub
    End If
  End With

  Dim TargetPassword As Variant
  TargetPassword = InputBox _
    ("解除するパスワードを入力してください", "パスワード入力")
  If TargetPassword = False Then Exit Sub

  Call S_UnprotectFilesForExcel(TargetPath, TargetPassword)
  Call S_UnprotectFilesForWord(TargetPath, TargetPassword)
  Call S_UnprotectFilesForPowerpoint(TargetPath, TargetPassword)

  MsgBox "パスワード解除完了", vbOKOnly + vbInformation, "パスワード一括解除マクロ"
End Sub

Sub S_UnprotectFilesForExcel _
  (ByRef FilePath As String, ByRef FilePassword As String)
  With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
  End With

  Dim buf As String
  Dim myBook As String
  Dim TargetBook As Workbook
  buf = Dir(FilePath & "*.xls*")
  myBook = ThisWorkbook.Name
  Do While buf <> ""
    Set TargetBook = Workbooks.Open _
        (Filename:=(FilePath & buf), Password:=FilePassword)
    With TargetBook
      If .Name <> myBook Then
        .SaveAs Filename:=(FilePath & buf), Password:=""
        .Close
      End If
    End With
    buf = Dir()
  Loop

  With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
  End With
End Sub

Sub S_UnprotectFilesForWord _
  (ByRef FilePath As String, ByRef FilePassword As String)
  Dim wdApp As Object
  Set wdApp = CreateObject("Word.Application")
  With wdApp
    .DisplayAlerts = False
    .Visible = False
  End With

  Dim buf As String
  Dim TargetDoc As Document
  buf = Dir(FilePath & "*.doc*")
  Do While buf <> ""
    Set TargetDoc = Documents.Open _
        (Filename:=(FilePath & buf), PasswordDocument:=FilePassword)
    With TargetDoc
      .Saved = False
      .SaveAs2 Filename:=(FilePath & buf), Password:=""
      .Close
    End With
    buf = Dir()
  Loop

  wdApp.Quit
  Set wdApp = Nothing
End Sub

Sub S_UnprotectFilesForPowerpoint _
  (ByRef FilePath As String, ByRef FilePassword As String)
  Dim fso As Object
  Dim TargetFolder As Folder
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set TargetFolder = fso.GetFolder(FilePath)

  Dim ppApp As Object
  Set ppApp = CreateObject("Powerpoint.Application")
  ppApp.DisplayAlerts = ppAlertsNone

  Dim TargetFile As Object
  Dim TargetExtension As String
  Dim buf As Object
  For Each TargetFile In TargetFolder.Files
    TargetExtension = LCase(fso.GetExtensionName(TargetFile.Name))
    Select Case TargetExtension
      Case "ppt", "pptx", "pptm"
        Set buf = ppApp.Presentations.Open _
          (Filename:=(TargetFolder & "\" & TargetFile.Name & "::" & FilePassword), _
           WithWindow:=msoFalse)
        buf.Password = ""
        buf.Save
        buf.Close
        Set buf = Nothing
    End Select
  Next

  ppApp.Quit
  Set ppApp = Nothing
  Set TargetFolder = Nothing
  Set fso = Nothing
End Sub

 

メイン処理の解説

構成としては、「メイン処理+エクセル部分のサブルーチン+ワード部分のサブルーチン+パワポ部分のサブルーチン」から成立しています。メイン処理では、パスワードを一括解除するフォルダとそのパスワードを取得し、そのフォルダ名とパスワード文字列をサブルーチンに渡して、それぞれのサブルーチンで自動的にパスワードを入力してファイルを開き、パスワードを解除し、ファイルを保存して閉じるという作業を繰り返しています。メイン部分で一括設定と違う部分はメッセージで「設定」という文字が「解除」に変わってる点だけで、処理自体は一括設定の場合とまったく同じです。

Call S_UnprotectFilesForExcel(TargetPath, TargetPassword)
Call S_UnprotectFilesForWord(TargetPath, TargetPassword)
Call S_UnprotectFilesForPowerpoint(TargetPath, TargetPassword)

「S_UnprotectFilesForExcel」「S_UnprotectFilesForWord」「S_UnprotectFilesForPowerpoint」という3つのサブルーチンを呼び出しています。それぞれエクセル、ワード、パワポのファイルを呼び出し、パスワードを解除して開き、保存しています。

 

エクセル部分のサブルーチンの解説

Dim buf As String
Dim myBook As String
Dim TargetBook As Workbook
buf = Dir(FilePath & "*.xls*")
myBook = ThisWorkbook.Name
Do While buf <> ""
  Set TargetBook = Workbooks.Open _
      (Filename:=(FilePath & buf), Password:=FilePassword)
  With TargetBook
    If .Name <> myBook Then
      .SaveAs Filename:=(FilePath & buf), Password:=""
      .Close
    End If
  End With
  buf = Dir()
Loop

「Set TargetBook = Workbooks.Open(Filename:=(FilePath & buf), Password:=FilePassword)」パスワード付きでファイルを開き、保存するときは「Password:=””」とパスワードに空の文字列を渡して保存しています。

 

ワード部分のサブルーチンの解説

Dim buf As String
Dim TargetDoc As Document
buf = Dir(FilePath & "*.doc*")
Do While buf <> ""
  Set TargetDoc = Documents.Open _
      (Filename:=(FilePath & buf), PasswordDocument:=FilePassword)
  With TargetDoc
    .Saved = False
    .SaveAs2 Filename:=(FilePath & buf), Password:=""
    .Close
  End With
  buf = Dir()
Loop

ワードの場合は、ファイルを開くときの名前付き引数が「Password」ではなく、「PasswordDocument」となっている点に注意が必要です。また、ファイルを名前を付けて保存するメソッドでパスワードを渡す名前付き引数は「Password:=””」です。

 

パワポ部分のサブルーチンの解説

Dim TargetFile As Object
Dim TargetExtension As String
Dim buf As Object
For Each TargetFile In TargetFolder.Files
  TargetExtension = LCase(fso.GetExtensionName(TargetFile.Name))
  Select Case TargetExtension
    Case "ppt", "pptx", "pptm"
      Set buf = ppApp.Presentations.Open _
        (Filename:=(TargetFolder & "\" & TargetFile.Name & "::" & FilePassword), _
         WithWindow:=msoFalse)
      buf.Password = ""
      buf.Save
      buf.Close
      Set buf = Nothing
  End Select
Next

パワポの部分はファイルを開く部分を調べるのに非常に苦労しました。パワポの「Open」メソッドには「Password:=」に相当する名前付き引数が存在しません。じゃあ、どうやってパスワード付きのファイルをマクロで開くのか? 大変苦労して調べた結果、ファイル名に続けて「::」と「パスワードの文字列」を設定すればマクロで開くことができると判明しました。解除するには「buf.Password = “”」としてから保存して閉じます。

 

おわりに

このマクロではパスワード付きのパワポファイルをマクロで開くのに非常に苦労しました。パスワードを一括設定するマクロにくらべれて需要は低いかもしれませんが、やはり対になるマクロはあったほうがいいと思い、公開に至りました。このマクロを使ってくださると大変うれしいです。

コメントを残す