フォルダ内の複数のブックに異なるパスワードをまとめて設定する。
VBAで指定したフォルダ内にある複数のブックに異なるパスワードを設定しています。
ただし処理中に元からブックにパスワードが設定されているブックがあった場合は、そのファイルは無視して処理を継続させています。
サンプルコードではパスワードには8桁のランダムな文字列を作成し、その文字列をパスワードとして設定しています。
またブックに設定されたパスワードをイミディエイトウィンドウにブックに設定したパスワードを表示しています。
●ファイルごとに異なるパスワードを設定
'******************************************************************
' Excelファイルのパスワード設定確認
'******************************************************************
Sub setBookPassword()
'フォルダの指定
Dim sSetDir As String
sSetDir = "C:\VBA\PassSet\"
'フォルダ内のブック全てにパスワードを設定
Debug.Print setBookPwdInDir(sSetDir)
MsgBox "完了"
End Sub
'******************************************************************
' フォルダ内のブック全てにパスワードを設定
' (パスワードはファイルごとに異なるように設定)
'------------------------------------------------------------------
' 第1引数:指定フォルダのパス
'------------------------------------------------------------------
' 戻り値 :実行結果
'******************************************************************
Function setBookPwdInDir(sDirPath As String) As String
Dim sRtn As String
'FileSystemObjectの作成
Dim oFso As Object
Set oFso = CreateObject("Scripting.FileSystemObject")
'フォルダオブジェクトの取得
Dim oDir As Object
Set oDir = oFso.GetFolder(sDirPath)
'表示とメッセージの制御
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'フォルダにあるファイル一覧の取得
Dim fFile As Object
For Each fFile In oDir.Files
'Excelファイルであれば処理(一時ファイル(~$)は処理対象外)
If (oFso.GetExtensionName(fFile.Name) Like "xls*") And _
(Left(fFile.Name, 2) <> "~$") Then
'ファイルパス取得
Dim sFilePath As String
sFilePath = sDirPath & fFile.Name
'対象のブックを開く
On Error Resume Next
Dim oWb As Object
'※既にパスワードが掛かっているファイルを見分けるために引数(Password)を指定。
Set oWb = Workbooks.Open(sFilePath, UpdateLinks:=0, password:="")
'既にパスワードが掛かっていないファイルのみ処理。
If Err.Number = 0 Then
'パスワード設定(8桁のランダムな文字列)
Dim sPassword As String
sPassword = RandomStrings(8)
oWb.SaveAs fileName:=sFilePath, password:=sPassword
oWb.Close
sRtn = sRtn & fFile.Name & " にパスワード(" & sPassword & ")を設定しました。" & vbCrLf
Else
sRtn = sRtn & fFile.Name & " は既にパスワードが設定されています。" & vbCrLf
End If
On Error GoTo 0
End If
Next
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Set oFso = Nothing
setBookPwdInDir = sRtn
End Function
'******************************************************************
' ランダムな文字列(パスワード)の作成
'******************************************************************
Function RandomStrings(lLen As Long) As String
'数字+英字(大・小文字)
Dim iChr As Integer
Dim sRtn As String
sRtn = ""
Do Until Len(sRtn) >= lLen 'lLen=桁数
iChr = getRndScope(48, 122)
Select Case iChr
Case 48 To 57, 65 To 90, 97 To 122
sRtn = sRtn & Chr(iChr)
End Select
Loop
RandomStrings = sRtn
End Function
'******************************************************************
' 指定した範囲の数値を乱数で作成
'------------------------------------------------------------------
' 第1引数:乱数を発生させる範囲の最小値
' 第2引数:乱数を発生させる範囲の最大値
'------------------------------------------------------------------
' 戻り値 :乱数値
'******************************************************************
Function getRndScope(lMinNum As Long, lMaxNum As Long) As Integer
Dim iRtn As Integer
Randomize
iRtn = Int((lMaxNum - lMinNum + 1) * Rnd() + lMinNum)
getRndScope = iRtn
End Function
■実行結果




