teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

コードを記載させていただきました。 参照させて頂いたページは補足情報欄に記載しています

2021/10/04 08:58

投稿

takahiro_y2j
takahiro_y2j

スコア0

title CHANGED
File without changes
body CHANGED
@@ -14,15 +14,325 @@
14
14
 
15
15
  ```ここに言語名を入力
16
16
 
17
- https://qiita.com/irohamaru/items/6021327a5c39422fa2f4
17
+ Option Explicit
18
18
 
19
+ Const MAINSHEETNAME As String = "メイン"
20
+ Const SEARCHCELLRNG As String = "H3"
21
+ Const HEADERROW As Integer = 5
22
+ Const FOLDERCOL As String = "H"
23
+ Const FILENMCOL As String = "I"
24
+ Const RESULTCOL As String = "J"
25
+ Const CHECK_OK As String = "パスワード保護OK"
26
+ Const CHECK_NG As String = "パスワード保護NG"
27
+ Const NO_CHECK As String = "チェック対象外"
28
+ Const CHECK_ERROR As String = "チェックエラー"
29
+ Const MSG_EXCEL As String = "入力したパスワードが間違っています。"
30
+ Const MSG_PPT As String = "読み取りパスワードをもう一度入力してください"
31
+ Const MSG_WORD As String = "パスワードが正しくありません。"
19
- https://teratail.com/questions/240188
32
+ Const MSG_PDF As String = "パスワードが正しくありません。"
33
+ Const MSG_ZIP As String = "入力したパスワードが間違っています。"
20
34
 
35
+ ' パスワードチェック
21
- ```
36
+ Sub passCheck()
22
37
 
38
+ Dim mainSheet As Worksheet
39
+ Set mainSheet = Worksheets(MAINSHEETNAME)
40
+ Dim objFSO As Object
41
+ Set objFSO = CreateObject("Scripting.FileSystemObject")
23
42
 
43
+ ' チェック対象フォルダパス取得
44
+ Dim folderPath As String, folderExist As String
24
45
 
46
+ folderPath = mainSheet.Range(SEARCHCELLRNG).Value
47
+ folderExist = Dir(folderPath, vbDirectory)
25
48
 
49
+ ' フォルダ存在チェック
50
+ If folderExist = "" Then
51
+ MsgBox "チェック対象のフォルダが存在しません。" & vbCrLf & _
52
+ "処理を終了します。", vbExclamation
53
+ GoTo passCheckErr1
54
+ End If
55
+
56
+ ' ファイル一覧初期化
57
+ Call listClear(mainSheet)
58
+ ' ファイル一覧取得
59
+ Call FileSearch(objFSO.GetFolder(folderPath))
60
+
61
+ ' 最下行取得
62
+ Dim maxRow As Integer
63
+ If mainSheet.Range(FOLDERCOL & (HEADERROW + 1)).Value = "" Then
64
+ MsgBox "ファイルなしエラー"
65
+ GoTo passCheckErr1
66
+ Else
67
+ maxRow = mainSheet.Range(FOLDERCOL & HEADERROW).End(xlDown).Row
68
+ End If
69
+
70
+ ' パスワードチェック
71
+ Dim i As Integer
72
+ For i = HEADERROW + 1 To maxRow
73
+ ' チェック結果格納用
74
+ ' 1:チェックOK, 2:チェックNG, 3:チェック対象外ファイル
75
+ Dim checkResult As Integer
76
+
77
+ With mainSheet
78
+ ' ファイルパス取得
79
+ Dim f As String
80
+ f = .Range(FOLDERCOL & i).Value & "\" & .Range(FILENMCOL & i).Value
81
+
82
+ ' パスワードチェック
83
+ checkResult = IsLockedFile(f)
84
+
85
+ ' 結果記入
86
+ Select Case checkResult
87
+ Case 1
88
+ .Range(RESULTCOL & i).Value = CHECK_OK
89
+ Case 2
90
+ .Range(RESULTCOL & i).Value = CHECK_NG
91
+ .Range(RESULTCOL & i).Interior.Color = RGB(255, 0, 0)
92
+ Case 3
93
+ .Range(RESULTCOL & i).Value = NO_CHECK
94
+ .Range(RESULTCOL & i).Interior.Color = RGB(255, 255, 0)
95
+ Case Else
96
+ .Range(RESULTCOL & i).Value = CHECK_ERROR
97
+ .Range(RESULTCOL & i).Interior.Color = RGB(243, 152, 0)
98
+ End Select
99
+
100
+ End With
101
+
102
+ Next
103
+
104
+ passCheckErr1:
105
+ Set mainSheet = Nothing
106
+ Set objFSO = Nothing
107
+
108
+ MsgBox "パスワードチェックが完了しました。"
109
+
110
+ End Sub
111
+
112
+ ' ファイル一覧取得&記入
113
+ Sub FileSearch(ByVal folderPath As String)
114
+
115
+ Dim objFSO As Object
116
+ Set objFSO = CreateObject("Scripting.FileSystemObject")
117
+ Dim mainSheet As Worksheet
118
+ Set mainSheet = Worksheets(MAINSHEETNAME)
119
+
120
+ Dim objFolder, objSubFolders As Object
121
+ Set objFolder = objFSO.GetFolder(folderPath)
122
+ Set objSubFolders = objFolder.SubFolders
123
+
124
+ On Error Resume Next
125
+
126
+ Dim sf As Object
127
+ For Each sf In objSubFolders
128
+ FileSearch sf
129
+ Next
130
+ Set sf = Nothing
131
+
132
+ Dim f As Object
133
+ Dim rowNum, maxRow As Integer
134
+
135
+ ' 最下行取得
136
+ If mainSheet.Range(FOLDERCOL & (HEADERROW + 1)).Value = "" Then
137
+ maxRow = HEADERROW
138
+ Else
139
+ maxRow = mainSheet.Range(FOLDERCOL & HEADERROW).End(xlDown).Row
140
+ End If
141
+ rowNum = maxRow + 1
142
+
143
+ For Each f In objFolder.Files
144
+ With mainSheet
145
+ .Hyperlinks.Add Anchor:=.Range(FOLDERCOL & rowNum), _
146
+ Address:=objFSO.GetParentFolderName(f.Path), _
147
+ TextToDisplay:=objFSO.GetParentFolderName(f.Path)
148
+ .Hyperlinks.Add Anchor:=.Range(FILENMCOL & rowNum), _
149
+ Address:=f.Path, _
150
+ TextToDisplay:=objFSO.GetFileName(f.Path)
151
+ End With
152
+ rowNum = rowNum + 1
153
+ Next
154
+ Set f = Nothing
155
+
156
+ Set objSubFolders = Nothing
157
+ Set objFolder = Nothing
158
+ Set mainSheet = Nothing
159
+ Set objFSO = Nothing
160
+
161
+ End Sub
162
+
163
+
164
+ Private Sub listClear(ByVal sh As Worksheet)
165
+
166
+ ' セル一覧の最下行を取得し、セルをクリア
167
+ Dim maxRow As Integer
168
+
169
+ maxRow = sh.Range(FOLDERCOL & HEADERROW).End(xlDown).Row
170
+ sh.Range(FOLDERCOL & (HEADERROW + 1) & ":" & RESULTCOL & maxRow).Clear
171
+ sh.Range(FOLDERCOL & (HEADERROW + 1) & ":" & RESULTCOL & maxRow).Font.Name = "メイリオ"
172
+ sh.Range(FOLDERCOL & (HEADERROW + 1) & ":" & RESULTCOL & maxRow).Font.Size = 10
173
+
174
+ End Sub
175
+
176
+
177
+ 'パスワード保護されているブックで TRUE を返す
178
+ Function IsLockedFile(ByVal tgtPath As String) As Integer
179
+
180
+ Dim errDescription As String
181
+ Dim errNum As Long
182
+
183
+ Dim objFSO, objShell As Object
184
+ Set objFSO = CreateObject("Scripting.FileSystemObject")
185
+ Set objShell = CreateObject("Shell.Application")
186
+
187
+ Dim cnsMsg As String, ext As String, skipFlg As Boolean: skipFlg = False
188
+ ext = objFSO.GetExtensionName(tgtPath)
189
+
190
+ On Error Resume Next
191
+
192
+ Select Case ext
193
+ Case "xls", "xlsx", "xlsm"
194
+ cnsMsg = MSG_EXCEL
195
+
196
+ Dim objExcel, wb As Object
197
+ Set objExcel = CreateObject("Excel.Application")
198
+ Set wb = objExcel.Workbooks.Open(tgtPath, Password:=vbNullString)
199
+
200
+ errDescription = Err.Description
201
+ errNum = Err.Number
202
+
203
+ objExcel.DisplayAlart = False
204
+ wb.Close (False)
205
+ objExcel.DisplayAlart = True
206
+
207
+ Set wb = Nothing
208
+ objExcel.Quit
209
+ Set objExcel = Nothing
210
+
211
+ Case "ppt", "pptx", "pptm"
212
+ cnsMsg = MSG_PPT
213
+
214
+ Dim p, ppt As Object
215
+ Set p = CreateObject("PowerPoint.Application")
216
+ Set ppt = p.Presentations.Open(tgtPath & "::unknown", WithWindow:=msoFalse)
217
+
218
+ errDescription = Err.Description
219
+ errNum = Err.Number
220
+
221
+ ppt.Close
222
+ Set ppt = Nothing
223
+ p.Quit
224
+ Set p = Nothing
225
+
226
+ Case "doc", "docx", "docm"
227
+ cnsMsg = MSG_WORD
228
+
229
+ Dim wd, doc As Object
230
+ Set wd = CreateObject("Word.Application")
231
+ Set doc = wd.Documents.Open(tgtPath, passworddocument:="unknown", Visible:=False)
232
+
233
+ errDescription = Err.Description
234
+ errNum = Err.Number
235
+
236
+ doc.Close
237
+ Set doc = Nothing
238
+ wd.Quit
239
+ Set wd = Nothing
240
+
241
+ Case "pdf"
242
+ ' Excelのハイパーリンク押下⇒開いて確認で回避?
243
+
244
+ Case "zip"
245
+ Dim folderPath As String
246
+ folderPath = objFSO.GetParentFolderName(tgtPath)
247
+
248
+ ' 作業用フォルダ作成
249
+ Dim mkDirPath As String
250
+ Dim cnt As Integer: cnt = 0
251
+ While cnt < 10
252
+ mkDirPath = folderPath & "\" & "workfolder_" & Rnd
253
+ If Dir(mkDirPath, vbDirectory) = "" Then
254
+ MkDir (mkDirPath)
255
+ cnt = 10
256
+ End If
257
+ Wend
258
+
259
+ Dim objZip As Object
260
+ Dim result As Integer
261
+ 'なぜか二重カッコが必要
262
+ '進捗ダイアログを表示しない
263
+ objShell.Namespace((mkDirPath)).CopyHere objShell.Namespace((tgtPath)).Items, &H4 + &H40 + &H400
264
+
265
+ ' 一時フォルダ内のファイル数カウント
266
+
267
+
268
+
269
+ Dim buf As String, fileCount As Long
270
+
271
+ buf = Dir(mkDirPath & "*", vbDirectory)
272
+ Do While buf <> ""
273
+ If buf <> "." And buf <> ".." Then
274
+ fileCount = fileCount + 1
275
+ End If
276
+ buf = Dir()
277
+ Loop
278
+
279
+ Select Case fileCount
280
+ Case Is > 0
281
+ ' パスワードチェックNG
282
+ IsLockedFile = 2
283
+ Case Is = 0
284
+ ' パスワードチェックOK
285
+ IsLockedFile = 1
286
+ Case Else
287
+ ' パスワードチェックエラー
288
+ IsLockedFile = 4
289
+ End Select
290
+
291
+ ' 一時フォルダ削除
292
+ objFSO.DeleteFolder (mkDirPath)
293
+
294
+ skipFlg = True
295
+
296
+ Case Else
297
+ ' チェック対象外ファイルの場合
298
+
299
+ End Select
300
+
301
+ On Error GoTo 0
302
+
303
+ ' zipファイルチェック以外の場合のみ実行
304
+ If skipFlg = False Then
305
+ ' 対象外フォイルの場合
306
+ If cnsMsg = "" Then
307
+ IsLockedFile = 3
308
+ GoTo IsLockedFileClose
309
+ End If
310
+
311
+ If InStr(errDescription, cnsMsg) > 0 Then
312
+ ' パスワードチェックOK
313
+ IsLockedFile = 1
314
+
315
+ ElseIf Err.Number = 0 Then
316
+
317
+ ' パスワードチェックNG
318
+ IsLockedFile = 2
319
+
320
+ Else
321
+ Err.Raise errNum, , errDescription
322
+ End If
323
+ End If
324
+
325
+ IsLockedFileClose:
326
+ Set objShell = Nothing
327
+ Set objFSO = Nothing
328
+
329
+ End Function
330
+
331
+
26
332
  ### 補足情報(FW/ツールのバージョンなど)
27
333
 
28
- ここにより詳
334
+ 参照させていただいたのは下記サイト様です。
335
+
336
+ https://qiita.com/irohamaru/items/6021327a5c39422fa2f4
337
+
338
+ https://teratail.com/questions/240188