Workbook.BeforeSave Event, определите, какой тип они сохраняют как - PullRequest
1 голос
/ 29 января 2020

Я создаю «шаблон», который наши разработчики должны заполнить, и я хочу, чтобы при его сохранении он запускал какое-то пользовательское поведение перед тем, как файл был сохранен. Есть две ячейки, которые определены формулой. Когда пользователь, о котором идет речь, сохраняет заполненный файл из шаблона в xlsx, я хочу, чтобы эти ячейки были значениями, а не формулами. (Это также означает, что я не хочу, чтобы макросы сохранялись вместе с файлом XLSX.)

Прекрасным примером является формула = TODAY (), которая, если вы сохраните файл Excel с этой формулой в ячейка 1 января 2020 г., когда она вновь откроется 1 февраля 2020 г., эта ячейка будет иметь значение 1 февраля 2020 г., а не 1 января 2020 г., когда она была создана и сохранена.

Поскольку исходный файл, который они будут открывать, является xltx, он заставит их сохранить его как xlsx или xlsm. Я хочу, чтобы шаблон (xltx) имел формулы (и макросы), но когда они сохраняют его как xlsx, он должен иметь только значения.

VB для копирования и вставки значений ячеек вместо forumlas basi c и я делал это много раз. Проблема заключается в том, что, когда я пытаюсь сохранить шаблон как измененный шаблон (xltx), событие BeforeSave запускается и изменяет ячейки обратно на значения вместо формул, разрушая всю цель. (catch-22)

Есть ли способ определить, что я сохраняю файл в формате xltx, или это мой единственный способ поставить точку останова в макросе события и "пропустить" эти строки, когда я сохранить шаблон?

Ответы [ 2 ]

3 голосов
/ 30 января 2020

Если вы установите точку останова в обработчике ThisWorkbook_BeforeSave, вы обнаружите, что эта точка останова будет достигнута до того, как отобразится пользовательский интерфейс "SaveAs", а параметр SaveAsUI будет True, и поскольку ThisWorkbook уже сохранен, то Name будет содержать имя файла и его расширение.

Таким образом, вы можете легко получить расширение .xltx, но проблема в том, что при В этот момент никто не знает, что пользователь хочет делать, а именно: хотите ли вы сохранить сам шаблон или его рабочую копию: BeforeSave запускается слишком рано для того, что вы пытаетесь сделать.

Вам нужно каким-то образом иметь мета-информацию в вашем распоряжении.

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

If Environ$("COMPUTERNAME") = "Your computer's name" Then Exit Sub
'...rest of the BeforeSave handler...

Это дает вам возможность запустить logi c, условно COMPUTERNAME или USERNAME ОС значения переменных среды.

1 голос
/ 29 января 2020

Используйте переменную класса для записи, когда был вызван диалог SaveAs, а затем используйте событие Workbook_AfterSave для внесения корректировок.

Событие Workbook.BeforeSave (Excel) SaveAsUI: True, если диалоговое окно Сохранить как отображается из-за изменений, которые необходимо сохранить в рабочей книге.

Private hasSaveAsUI As Boolean

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    Rem Check to see if the file has been saved as
    If hasSaveAsUI Then
        hasSaveAsUI = False
        Rem Do Something
    End If
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    hasSaveAsUI = SaveAsUI
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...