Как отключить «Сохранить как» в открытой книге, но НЕ отключить «Сохранить»

Я не могу найти какой-либо код, который ТОЛЬКО отключает функцию сохранения как без отключения сохранения.

Перечисленный код очень эффективен при отключении СОХРАНЕНИЯ и СОХРАНЕНИЯ КАК, но я хочу, чтобы пользователи могли сохранять данные, но НЕ имели возможности СОХРАНИТЬКАК, чтобы они не могли создать версию рабочей книги. (копирование файла в файловом менеджере в этом случае не проблема - просто сохранить как проблема.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim xName As String
xName = "CancelBeforeSave"

If Not Evaluate("=ISREF('" & xName & "'!A1)") Then
    Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = xName & ""
    Sheets(xName & "").Move after:=Worksheets(Worksheets.Count)
    'To edit macros disable by changing to True
    'Need to open workbook first with macros disabled
    Sheets(xName & "").Visible = False
    Exit Sub
End If
    'To edit macros disable by changing to False
    'Need to open workbook first with macros disabled
    Cancel = True
End Sub

Я ожидаю, что открытая книга не позволит сохранять файлы, не затрагивая другие открытые книги.

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


person Simon Jacobs    schedule 29.03.2019    source источник


Ответы (1)


Просто проверьте, верно ли SaveAsUI, и отмените сохранение.

Option Explicit

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If SaveAsUI Then
        MsgBox "Save As is disabled", vbInformation
        Cancel = True
    End If
End Sub

В документации по событию Workbook.BeforeSave можно найти:

SaveAsUI
True, если диалоговое окно Сохранить как будет отображаться из-за внесенных изменений, которые необходимо сохранить в книге.

Обратите внимание, что это не функция безопасности.
Это не позволяет пользователям использовать диалоговое окно "Сохранить как". Но с некоторым кодом VBA на любом другом листе Excel вы можете легко обмануть это. Все, что вы делаете, чтобы запретить реальное сохранение как, можно обойти. Это не будет функцией безопасности. Это просто для предотвращения сохранения как "случайно". Любой, кто действительно хочет выполнить сохранение как и знает, как его обмануть, все равно сможет это сделать.

person Pᴇʜ    schedule 29.03.2019
comment
Итак, если SaveAs запускается с помощью трюка, может ли мой код VBA распознать, что было запущено сохранение, и, например, скрыть все критические листы в новом файле SaveAs ?? - person Simon Jacobs; 31.03.2019
comment
@SimonJacobs Нет, хитрость в том, чтобы отключить VBA, а затем использовать SaveAs. Таким образом, ваш VBA не может ничего инициировать, потому что он отключен. Если пользователь может открывать и читать файл, вы не можете запретить пользователю копировать или сохранять данные в другой файл. - person Pᴇʜ; 31.03.2019