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に組み込みその戻り値で判断する方法もあります。
VBAからコマンドプロンプトで命令を実行させ結果を取得する
コマンドプロンプトからコマンドを実行するといろんな結果が返ってきて便利ですし、サードパーティーからいろんなコマンドプロンプトでの実行タイプアプリケーションが…
実装は上記の記事の様になります。
VBAでコマンドプロンプトの起動とコマンドの実行を行う | Excel作業をVBAで効率化
コマンドプロンプトの起動とコマンドの実行をWshShellクラスで行う VBAでコマンドプロンプトの起動とコマンドの実行を行うには標準の機能だけでは実現できないため、WshShe…
コマンドプロンプトからのコマンド実行については上記を参考にさせていただきました。
コメント