VBA - SaveCopyAs скрыто - PullRequest
       20

VBA - SaveCopyAs скрыто

0 голосов
/ 12 марта 2019

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

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

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 & "\Z_" & ThisWorkbook.Name
        SetAttr ThisWorkbook.Path & "\Z_" & ThisWorkbook.Name, vbHidden
        Application.DisplayAlerts = True
    End If
    SetAttr ThisWorkbook.Path & "\Z_" & ThisWorkbook.Name, vbHidden
End Sub

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

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

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

1 Ответ

1 голос
/ 12 марта 2019

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

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

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

    HiddenFileName = ThisWorkbook.Path & "\Z_" & 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.

...