У меня есть проект, в котором я должен пройти более 1000+ файлов excel в папке и посмотреть, какие из них защищены паролем, а какие нет. Для того, чтобы сэкономить время, я написал макрос, чтобы сделать это, который выглядит следующим образом:Excel VBA Password Protection check
Sub CheckWbook()
Dim Value As String, a As Single, myfolder as string
With Application.FileDialog(msoFileDialogFolderPicker)
.Show
myfolder = .SelectedItems(1) & "\"
End With
Range("C4") = myfolder
Range("B7:C" & Rows.Count) = ""
a = 0
Value = Dir(myfolder)
Do Until Value = ""
If Value = "." Or Value = ".." Then
Else
If Right(Value, 3) = "xls" Or Right(Value, 4) = "xlsx" Or Right(Value, 4) = "xlsm" Then
On Error Resume Next
Workbooks.Open Filename:=myfolder & Value, Password:="zzzzzzzzzzzz"
If Err.Number > 0 Then
Range("C7").Offset(a, 0).Value = "Yes"
End If
Workbooks(Value).Close False
On Error GoTo 0
Range("B7").Offset(a, 0).Value = Value
a = a + 1
End If
End If
Value = Dir
Loop
End Sub
Проблема у меня в том, что всплывающее окно для ввода пароля все еще присутствует: он не заполняет пароль , Любая помощь будет высоко оценен. -А
Редактировать изменил код немного, и миновали сообщение об ошибке, но теперь я застрял в пароля всплывающего окна, который останавливает макрос полностью работает, несмотря на On Error Resume Next особенность ,
Тогда, я наткнулся на этот код, который я думал, может помочь:
Option Explicit
Public Sub ProcessBatch()
Dim strFileName As String
Dim strFilePath As String
Dim oDoc As Document
' Set Directory for Batch Process
strFilePath = "C:\Test\"
' Get Name of First .doc File from Directory
strFileName = Dir$(strFilePath & "*.doc")
While Len(strFileName) <> 0
' Set Error Handler
On Error Resume Next
' Attempt to Open the Document
Set oDoc = Documents.Open(_
FileName:=strFilePath & strFileName, _
PasswordDocument:="?#[email protected]$")
Select Case Err.Number
Case 0
' Document was Successfully Opened
Debug.Print strFileName & " was processed."
Case 5408
' Document is Password-protected and was NOT Opened
Debug.Print strFileName & " is password-protected " & _
"and was NOT processed."
' Clear Error Object and Disable Error Handler
Err.Clear
On Error GoTo 0
' Get Next Document
GoTo GetNextDoc
Case Else
' Another Error Occurred
MsgBox Err.Number & ":" & Err.Description
End Select
' Disable Error Handler
On Error GoTo 0
'-------------------------------------
'-------------------------------------
'---Perform Action on Document Here---
'-------------------------------------
'-------------------------------------
' Close Document
oDoc.Close
' Clear Object Variable
Set oDoc = Nothing
GetNextDoc:
' Get Next Document from Specified Directory
strFileName = Dir$()
Wend
End Sub
, но это не может распознать oDoc как документ. Любые идеи о том, как заставить его работать?
'Application.DisplayAlerts = False' не работает, так как открывать от ОР. Один из подходов - отправить сообщение WM_CLOSE во всплывающее диалоговое окно: использовать SendMessage в API Windows для этого. Но не так просто встраивать в свой код. Другой подход * мог бы заключаться в том, чтобы кодировать приведенное выше в VBScript, стараясь сохранить состояние видимости объекта Excel.Application в False. Я никогда не пробовал это, поэтому не могу гарантировать, что всплывающее диалоговое окно не будет отображаться. – Bathsheba
Странно, я пробовал ваш макрос, он отлично работает. Так что проблема не в макросе, а в чем-то esle. Не могли бы вы более точно описать, когда возникает проблема, в которой итерация ... Как не связанный отзыв, я бы рекомендовал использовать опцию Application.ScreenUpdating = False, которая может повысить производительность вашего макроса. – lbeliarl