Выполнение макроса по событию

Автор Посетитель 04.04.2024, 03 октября 2024, 14:28

Посетитель 04.04.2024

Доброго времени суток.
Через макрорекордер, поиск в инете, далее методом проб и ошибок (не без помощи этого ресурса) написал такой код:

Код
Sub ЛС()
    ' Включение режима разметки страницы и переход в конец документа

    ActiveWindow.ActivePane.View.Type = wdPrintView
    Selection.EndKey Unit:=wdStory
    Selection.TypeParagraph
    Selection.ParagraphFormat.SpaceBefore = 18
    Selection.TypeText Text:="Исп. *****В.В., **-**-**" 'заменить на свои ФИО и телефон (в кавычках)
    Selection.EndKey Unit:=wdStory
    Selection.TypeParagraph
    Selection.TypeText Text:=Format(Now(), "dd/mm/yyyy") 'вставка текущей даты
    WordBasic.OpenOrCloseParaAbove
   
    'Изменение шрифта и цвета для исполнителя и даты
   
    Selection.MoveUp Unit:=wdLine, Count:=1, Extend:=wdExtend
    Selection.HomeKey Unit:=wdLine, Extend:=wdExtend
    Selection.Font.Size = 14
    Selection.Font.Color = wdColorAutomatic
    Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
    Selection.Font.Name = "Times New Roman"
    Selection.EndKey Unit:=wdStory
   
    Dim Таблица As Table
    Dim i As Long
 
    ' Удаление строк во второй таблице, не затрагивая пустые, если в документе есть две и более таблицы.
    ' В документе может не быть таблиц.
    If ActiveDocument.Tables.Count >= 2 Then
      Selection.MoveUp Count:=1
      Selection.HomeKey
      Selection.TypeBackspace
      Set Таблица = ActiveDocument.Tables(2)
      For i = Таблица.Rows.Count To 2 Step -1
          If Таблица.Cell(i, 4).Range.Text = Chr(13) & Chr(7) Then
          ElseIf Таблица.Cell(i, 4).Range.Text <> "Согласовано без замечаний " & Chr(13) & Chr(7) Then
                  Таблица.Rows(i).Delete
          End If
      Next i
    End If
   
    'Сохранение файла в формате "ЛС сформирован ДД.ММ.ГГГГ в ЧЧ.ММ"
         
    Dim Fn As String
     
    With Application.FileDialog(msoFileDialogSaveAs)
        .Title = "Сохранить как"
        .InitialFileName = "D:\Документы\ЛС сформирован " & Format(Date, "DD.MM.YYYY") & " в " & Format(Time, "HH.MM")
        If .Show = False Then
            Exit Sub
        End If
        Fn = .SelectedItems(1)
    End With
      ActiveDocument.SaveAs FileName:=Fn, FileFormat:=wdFormatXMLDocument
 
  End Sub
[свернуть]
В принципе, все чудесно, но есть проблемка. Макрос по умолчанию открывает окно "Сохранить как..." и, если нажать "Отмена", выполнить какие-то операции и снова нажать "Сохранить как...", то строка ".InitialFileName = "D:\Документы\ЛС сформирован " & Format(Date, "DD.MM.YYYY") & " в " & Format(Time, "HH.MM")" не выполнится, а хотелось бы, чтобы это условие выполнялось для всех документов, где в тексте есть словосочетание "Лист согласования" при выборе "Сохранить как..." или просто при закрытии документа.

То есть перед сохранением или закрытием макрос должен проверить текст и, если есть слова "Лист согласования", выполнить присвоение файлу указанного выше имени.

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

Заранее спасибо

Администратор

Я не смог понять вашу мысль.
У вас есть макрос, при чём здесь сохранение и закрытие документа? У вас проблема с макросом или с чем-то другим?

Администратор

У вас вопрос по вашему макросу или по чему-то другому?

Посетитель 04.04.2024

Здравствуйте.
Макрос нужно дописать в части алгоритма сохранения.
Сейчас он при запуске после редактирования открывает окно сохранения файла и присваивает файлу определенное имя. Но если в окне сохранения нажать "Отмена", после чего снова "Сохранить как...", то файлу имя уже не присвоится. А надо, чтобы присваивалось

Администратор

Цитата:
Но если в окне сохранения нажать "Отмена", после чего снова "Сохранить как...", то файлу имя уже не присвоится.

Подцитата:
после чего снова "Сохранить как..."

Пользователь запускает макрос, появляется диалог "Сохранить как", в диалоге правильно отображается полное имя. Пользователь нажимает Отмена.
Пользователь второй раз запускает макрос, появляется диалог "Сохранить как", но в диалоге уже неправильно отображается полное имя.
Правильно я понял ситуацию?

Посетитель 04.04.2024

Нет
1. Пользователь запустил макрос
2. Открылось окно "Сохранить как..."
3. Пользователь нажал "Отмена"
4. Пользователь нажал "Сохранить как..."
6. По событию запустился макрос, который проверил текст документа и, если в тексте находит словосочетание "Лист согласования", то выполняет команду InitialFileName = "D:\Документы\ЛС сформирован " & Format(Date, "DD.MM.YYYY") & " в " & Format(Time, "HH.MM", т.е. присваивает документу имя с текущей датой и временем.

Администратор

Сейчас первая задача: запустить макрос, когда пользователь нажимает стандартную кнопку "Сохранить как"?
Есть ещё кнопка "Сохранить". Поэтому нужно ещё уточнение, какую именно кнопку пользователь будет нажимать.

Посетитель 04.04.2024

Если нажать кнопку "Отмена" в диалоговом окне "Сохранить как..." (который открыт макросом), то файлу по умолчанию присвоится имя, сформированное системой, из которой файл выгружается в формате 20241003_154828.htm и сохраняется в папке по умолчанию (D:\Документы\SAP\SAP GUI).
Поэтому независимо от действий пользователя - нажмет ли он "Сохранить как...", "Сохранить" или просто закроет файл, должно открыться окно сохранения файла с выполнением InitialFileName = "D:\Документы\ЛС сформирован " & Format(Date, "DD.MM.YYYY") & " в " & Format(Time, "HH.MM

Посетитель 04.04.2024

Для Excel я бы воспользовался Private Sub Workbook_BeforeClose(Cancel As Boolean) и прочими "BeforeSave", а вот как это сделать в Word - не нашел