VBA — сохраненные копии скрыты

#excel #vba #save #hidden

#excel #vba #Сохранить #скрыто

Вопрос:

Каждый раз, когда я сохраняю свою книгу, мне нужно сохранять ту же книгу, но скрытую.

Теперь у меня есть этот код

 Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    ThisWorkbook.Saved = True
    On Error Resume Next
    If Not (Left(ThisWorkbook.Name, 2) = "Z_") Then
        Application.DisplayAlerts = False
        ThisWorkbook.SaveCopyAs ThisWorkbook.Path amp; "Z_" amp; ThisWorkbook.Name
        SetAttr ThisWorkbook.Path amp; "Z_" amp; ThisWorkbook.Name, vbHidden
        Application.DisplayAlerts = True
    End If
    SetAttr ThisWorkbook.Path amp; "Z_" amp; ThisWorkbook.Name, vbHidden
End Sub
  

Однако это работает только каждый второй раз. При первом сохранении WB создается файл и он становится скрытым, но при повторном сохранении скрытый файл удаляется.

Когда я использую SaveAs со свойством перезаписи, он сохраняет файл и активирует его, но я этого не хочу.

Почему это? Как это решить, пожалуйста?

Ответ №1:

Когда у вас возникает подобная проблема, первое, что нужно сделать, это прокомментировать On Error Resume Next и Application.DisplayAlerts = False . Это даст вам гораздо больше информации о том, что происходит.

В вашем случае у вас была проблема с ранее существующими файлами. Попробуйте это вместо этого:

 Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Dim HiddenFileName As String

    HiddenFileName = ThisWorkbook.Path amp; "Z_" amp; ThisWorkbook.Name

    ThisWorkbook.Saved = True

    On Error Resume Next
    If Not (Left(ThisWorkbook.Name, 2) = "Z_") Then

        Application.DisplayAlerts = False

        ' Unhide and delete existing file
        SetAttr HiddenFileName, vbNormal
        Kill HiddenFileName

        ' Save new copy and hide it
        ThisWorkbook.SaveCopyAs HiddenFileName
        SetAttr HiddenFileName, vbHidden
        Application.DisplayAlerts = True
    End If
    SetAttr HiddenFileName, vbHidden
End Sub
  

Он отображает и удаляет файл, прежде чем создать его снова. Это немного грязно, так как он не проверяет, существовал ли он раньше, но полагается на On Error Resume Next .