Excelファイルを開かずにパスワードロックを確認する方法

MSACCESS_eyecatch
SBMJOB

フォルダの中にたくさんのエクセルファイルがあるとしてその中にパスワードがかかっているエクセルファイルが混ざっているとしたら、自動化にかけると処理が止まる可能性が出てきます。この記事では事前にたくさんのエクセルファイルの中からパスワードロックがかかったファイルを特定する手順をご紹介します。

目次

スポンサーリンク

Excel VBAでの実装方法

考え方

ExcelファイルAとExcelファイルBがある場合、
ExcelでAファイルのセルに=[Bファイル]Sheet1!$A$1
と書いてExcelファイルを開かずに他のファイルのセル値を取得することができますよね?
それをexcelVBAで下の様に書くと、パスワードがかかったファイルは#Ref!になって検出できます。

コード

Sub ボタン1_Click() 
 Dim A As String
 Dim cnt As Long

 On Error Resume Next

 A = Dir("c:\Work\*.xlsx")
 Application.DisplayAlerts = False

 Do While A <> ""
  cnt = cnt + 1
  Cells(cnt, 1) = A
  SendKeys "{ESC}"
  Cells(cnt, 2) = "='c:\Work\[" & A & "]Sheet1'!A1"
  A = Dir()
 Loop
 
Application.DisplayAlerts = True

 With Range(Range("B1"), Range("B1").End(xlDown))
  .Value = .Value
 End With
End Sub

実行結果

workフォルダに中に複数のエクセルファイルがあり、それらのexcelファイルのA1セルを読み込みます、パスワードがかかっている場合には「#REF!」表示となりパスワードロックがかかっているファイルを判定することができます。このロジックを変更していけばパスワードロック検出機能が実装できるでしょう。

Access VBAでの実装

コード

Option Compare Database
Option Explicit

Private Sub cmdCreateExcelFiles_Click()
     Dim DesktopPath As String, FilePath As String, WSH As Variant
    Set WSH = CreateObject("Wscript.Shell")
    DesktopPath = WSH.SpecialFolders("Desktop")
    'FilePath = DesktopPath & "\work" & "\CreatedByVBAFile.xlsx"

    Dim i As Long
    For i = 1 To 100
        FilePath = DesktopPath & "\work" & "\CreatedByVBAFile" & i & ".xlsx"
        Call CreateExcelFiles(FilePath)
    Next i
    Set WSH = Nothing
End Sub

Private Sub cmdCheckPass_Click()

    Dim ExApp As Object
    Set ExApp = CreateObject("Excel.Application")
    ExApp.Visible = True
    Dim DesktopPath As String, FilePath As String, WSH As Variant
    Set WSH = CreateObject("Wscript.Shell")
    DesktopPath = WSH.SpecialFolders("Desktop")
    FilePath = DesktopPath & "\createdExcel.xlsx"

    ExApp.Workbooks.Add

    Dim A As String
    Dim cnt As Long

    On Error Resume Next

    A = Dir("C:\Users\ユーザー名\Desktop\work\*.xlsx")
    ExApp.DisplayAlerts = False
    Do While A <> ""
        cnt = cnt + 1
        ExApp.Workbooks(ExApp.Workbooks.Count).Sheets(1).Cells(cnt, 1) = A

        ExApp.SendKeys "{ESC 3}"
        
        ExApp.Workbooks(ExApp.Workbooks.Count).Sheets(1).Cells(cnt, 2) = "='C:\Users\ユーザー名\Desktop\work\[" & A & "]Sheet1'!A1"
       
        If (IsError(ExApp.Workbooks(ExApp.Workbooks.Count).Sheets(1).Cells(cnt, 2))) Then
            ExApp.Workbooks(ExApp.Workbooks.Count).Sheets(1).Cells(cnt, 3) = "Locked"
        Else
            ExApp.Workbooks(ExApp.Workbooks.Count).Sheets(1).Cells(cnt, 3) = "---"
        End If
        
        A = Dir()
    Loop


'    With Range(Range("B1"), Range("B1").End(xlDown))
'        .Value = .Value
'    End With


    With ExApp.Workbooks(ExApp.Workbooks.Count)
        
        .SaveAs FileName:=FilePath
        .Close
    End With


    ExApp.Quit

    Set ExApp = Nothing
    Set WSH = Nothing

End Sub



Private Sub CreateExcelFiles(getFileName As String)
    Dim ExApp As Object
    Set ExApp = CreateObject("Excel.Application")
    ExApp.Visible = False
    Dim DesktopPath As String, FilePath As String, WSH As Variant
    Set WSH = CreateObject("Wscript.Shell")
    DesktopPath = WSH.SpecialFolders("Desktop")
    FilePath = getFileName

    ExApp.Workbooks.Add
    With ExApp.Workbooks(ExApp.Workbooks.Count)
        .Sheets(1).Cells(1, 1) = Now()
        .SaveAs FileName:=FilePath
        .Close
    End With
    ExApp.Quit

    Set ExApp = Nothing
    Set WSH = Nothing
End Sub

Access VBAでも考え方は同じです。IsError演算子で条件判断で判定できます。

xPDFを使う方法

実装方法

上記XpdfをVBAに組み込みその戻り値で判断する方法もあります。

実装は上記の記事の様になります。

コマンドプロンプトからのコマンド実行については上記を参考にさせていただきました。

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次