Отключение модуля VBA после функции «Сохранить как»

Когда шаблон открывается, он запускает модуль Auto_open.

 Sub Auto_Open()

 SaveAsUserForm.Show

 End Sub

Затем появляется пользовательская форма с надписью «Сохранить как» и кнопкой «ОК».

введите здесь описание изображения

Когда нажимается Ok, он запускает этот код.

Private Sub SaveAs_Click()

Dim bFileSaveAs As Boolean
bFileSaveAs = Application.Dialogs(xlDialogSaveAs).Show

If Not bFileSaveAs Then Unload Me

If bFileSaveAs Then    
    Dim x As Object
    Set x = Application.VBE.ActiveVBProject.VBComponents
    x.Remove VBComponent:=x.Item("Auto_Open")

    Unload Me

End Sub

Это удаляет модуль Auto_Open, поэтому форма сохранения как пользователя не появляется в новом файле, который только что был сохранен. Но я хочу, чтобы он был отключен только в том случае, если используется функция сохранения как (как с помощью модуля автоматического открытия, так и на вкладке файла

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

Таким образом, в основном, когда пользователь открывает шаблон, он не может ничего сделать или изменить, если он сначала не Сохранить как. Затем, как только он будет сохранен как и имя файла изменится, он отключит модуль Auto_Open, поэтому он не будет запрашивать сохранение каждый раз, когда новый файл открыт.


person Duraholiday    schedule 19.08.2015    source источник
comment
Рассматривали ли вы возможность проверки имени файла и пути и отображения сообщения только в том случае, если это исходный путь? Или, если вы пометите шаблон как только для чтения, вашим пользователям всегда нужно будет сохранять как...   -  person Tim Williams    schedule 19.08.2015
comment
Отметив его как прочитанное, они попросят их включить макросы. Просто нужен оператор, который говорит If file saved As Then remove the auto_open macro и if save function is used Then ask for password   -  person Duraholiday    schedule 19.08.2015
comment
Здесь можно использовать код: mrexcel.com/forum/excel-questions/   -  person Tim Williams    schedule 19.08.2015
comment
Я не думаю, что это мне поможет, я действительно использовал много этого кода с другими модулями.   -  person Duraholiday    schedule 19.08.2015
comment
Да, мой плохой: не прочитал ваш код полностью. Вы не проверяете значение bFileSaveAs перед удалением кода?   -  person Tim Williams    schedule 19.08.2015
comment
что значит проверить значение?   -  person Duraholiday    schedule 19.08.2015
comment
bFileSaveAs будет False, если пользователь отменит диалоговое окно сохранения как, и True, если он действительно использует его для сохранения файла.   -  person Tim Williams    schedule 19.08.2015
comment
Итак, If True Then Disable Unload Me If False Then Unload Me? Хорошо, это устраняет половину проблемы, но если я отменю и использую сохранение, как на вкладке «Файл», это не отключит автоматическое открытие.   -  person Duraholiday    schedule 19.08.2015


Ответы (1)


Вы можете изменить код во время выполнения. Вы можете использовать метод ReplaceLine, чтобы заменить строку, вызывающую SaveAsUserForm.Show, на комментарий:

Dim mdl As CodeModule
Set mdl = x.Item("Auto_Open")
mdl.ReplaceLine(3, "'SaveAsUserForm.Show")

Предостережение: если номер заменяемой строки когда-либо изменится, этот код перезапишет новую строку. Я предлагаю найти номер строки рассматриваемого текста, а затем использовать ReplaceLine с этим номером строки.

(Это должно быть просто, но это не так. По-видимому, вам нужно получить количество строк в модуле, прочитать все строки в модуле, передав количество строк, разделив текст построчно и найдя строку с совпадающим текстом.)

person Zev Spitz    schedule 19.08.2015
comment
Мне нечем заменить модуль Auto_Open, и его единственная задача — запрашивать пользовательскую форму. Я изучил использование before save, но это будет пытаться удалить Auto_Open каждый раз, когда кто-то сохраняет новый файл, и это приведет к ошибке, потому что он уже удалил его в первый раз, когда он был сохранен как. Это сработало для другого проекта Excel, так что спасибо за это! - person Duraholiday; 19.08.2015
comment
@Duraholiday Я не хочу заменять весь модуль, просто закомментируйте строку, вызывающую SaveAsUserForm.Show. - person Zev Spitz; 20.08.2015