2017-01-04 2 views
1

У меня есть следующий код в Excel 2010 книги:VBA код в Workbook_BeforeClose работает, но не имеет никакого эффекта

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    Dim FileName As String 

    FileName = ActiveWorkbook.Name 

    If FileName = "False" Then Exit Sub 

    If FileName <> "Shipping Manifest SaveAS Update.xlsm" Then 
     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
     Application.DisplayAlerts = True 
    End If 

End Sub 

код выполняется, если вставить контрольную точку и запустить его линия за линией, но когда я повторно открыть книгу, он не запрашивает пароль «abc123» для открытия не в режиме «Только для чтения» - он просто открывается. Что я делаю не так? Я уверен, что макросы включены.

+1

Не будучи грубо, но он меня поймал раньше, вы открываете правильный, чтобы проверить? если вы посмотрите в папке «Документы» (обычно C: \ users \ [USERNAME] \ документы \ [FileN \ me] .xlsm), она может быть там, вы не указали полный путь, поэтому можете помещать его в свои документы 'по умолчанию. –

+0

Хорошая точка, но она экономит на ожидаемом месте. – JeffK627

ответ

1

Вы подавили оповещения с Application.DisplayAlerts = False. Удалите эту строку, и вы увидите, в чем проблема.

Когда предупреждения отключены, Excel использует параметр по умолчанию. В этом случае вы будете предупреждены, что файл уже существует, и Excel хочет, чтобы вы подтвердили, что это нормально, чтобы перезаписать. Параметр по умолчанию для этого «Да/Нет/Отмена» - «Нет», поэтому может показаться, что файл фактически не сохраняется.

Другая потенциальная проблема заключается в том, что вы можете ввести в заблуждение ThisWorkbook и ActiveWorkbook. Событие _BeforeClose будет запускаться только из книги, в которой он находится, поэтому нет причин делать какие-либо проверки имени, предполагая, что вы всегда хотите сохранить книгу, в которой находится этот код, когда вы ее закрываете.

Вместо этого попробуйте:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 
    With ThisWorkbook 
     .WritePassword = "abc123" 
     .ReadOnlyRecommended = True 
     .Save 
    End With 
End Sub 

выше предположение не может иметь место, если рабочая книга закрывается программно, в этом случае вы может необходимо проводить различие между ThisWorkbook и ActiveWorkbook, но это трудно себе представить, почему при закрытии этой книги вы хотите сохранить другую (активную) книгу.

Кроме того, в комментарии Гэри выше (и я протестировал это), если вы не предоставляете полный путь, файл будет сохранен в папке «Документы» (по крайней мере, для меня в Excel 2013).

Вам может понадобиться сделать:

ActiveWorkbook.SaveAs FileName:=ActiveWorkbook.FullName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 

В своем коде, как:

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    If ActiveWorkbook.Name <> "Shipping Manifest SaveAS Update.xlsm" Then 
     Application.DisplayAlerts = False 
     ActiveWorkbook.SaveAs FileName:=ActiveWorkbook.FullName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
     Application.DisplayAlerts = True 
    End If 

End Sub 
+0

Ваше решение частично работает. Он применяет ReadOnlyRecommended, но не WritePassword. Я не могу использовать WriteResPasswords, это не метод события BeforeClose. – JeffK627

+0

ОК, затем с минимальными изменениями сделайте свой код: 'ActiveWorkbook.SaveAs FileName: = ActiveWorkbook.FullName, FileFormat: = xlOpenXMLWorkbookMacroEnabled, WriteResPassword: =" abc123 ", ReadOnlyRecommended: = True' –

+1

Использование FullName. Это будет запускаться приложением, которое откроет шаблон и сохранит его под новым именем. Одним из требований является то, что новый файл может быть открыт только для редактирования людьми, знающими пароль; для всех остальных он будет открыт только для чтения. У нас не может быть открытия шаблона только для чтения, поэтому сравнение имен. – JeffK627

-1

я удалил "отменить, как логическое" и она работала отлично

Private Sub Workbook_BeforeClose() 
Dim FileName As String 



FileName = ActiveWorkbook.Name 

If FileName = "False" Then Exit Sub 


If FileName <> "Shipping Manifest SaveAS Update.xlsm" Then 
    Application.DisplayAlerts = False 
    ActiveWorkbook.SaveAs FileName:=FileName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, WriteResPassword:="abc123", ReadOnlyRecommended:=True 
    Application.DisplayAlerts = True 
End If 

End Sub 
+0

Нет, это не так. Если этот код действительно работает, вы разместили процедуру события в стандартном модуле, и он не будет запускаться как событие. Вы не можете удалить аргумент «Отменить» из события BeforeClose, это необходимо, поэтому, если у вас есть этот код в модуле Workbook, вы получите ошибку компиляции. –

+0

Я уступлю, что я знаю гораздо меньше об этом, чем вы продемонстрировали. это из-за этого: мой побежал. это спасло. и после повторного открытия подскажите мне указанный пароль. ¯ \ _ (ツ) _/¯ – Stoploss

+0

Да, если вы удаляете Cancel As Boolean из события, это вызывает ошибки. – JeffK627

Смежные вопросы