Автор Тема: VBA Макросы: Сохранить как в текущем каталоге.  (Прочитано 639 раз)

Оффлайн Rengame113

  • Посетитель форума
  • Сообщений: 65
Как сделать так, чтобы при запуске макроса выскочило предложение сохранить документ в текущей папке?
Под текущей папкой я понимаю папку, в которой находится активный файл.

То есть макрос должен сделать действия, аналогичные этим. Юзер запускает макрос - появляется диалоговое окно "Сохранение документа", в этом диалоге должна быть открыта текущая папка.

Онлайн Администратор

  • Administrator
  • Сообщений: 1605
Чтобы в диалоге "Сохранение файла" отобразилась нужная папка, используйте параметр "InitialFileName" и на конце ставьте левый слеш.

Если в параметре "InitialFileName" на конце указать имя файла, то в диалог будет вставлено это имя.

Способ 1. Использование диалога "Сохранение файла" и метода "SaveAs".
Этот способен удобен, чтобы обработать ситуацию, если файл может существовать.

Sub Макрос()
   
    Dim FN As String
   
    ' Запуск диалога "Сохранение файла".
    With Application.FileDialog(msoFileDialogSaveAs)
        ' Настраиваем, чтобы в диалоге была открыта нужная папка.
        .InitialFileName = ActiveDocument.Path & "\"
        ' Если юзер щёлкнул "Отмена" или закрыл диалог крестиком.
        If .Show = 0 Then
            Exit Sub
        End If
        ' Запись в переменную полного имени (путь + имя) файла, который надо сохранить.
        FN = .SelectedItems(1)
    End With
   
    ' Сохранение файла.
    ActiveDocument.SaveAs FileName:=FN, FileFormat:=wdFormatXMLDocument
   
End Sub

PS. В новых версиях экселя метод "SaveAs" скрыт, а вместо него предлагают использовать "SaveAs2".
Но в новых версиях экселя метод "SaveAs" работает.

Способ 2. Использование только диалога "Сохранение файла".
Этот способ аналогичен диалогу, как в программе "Word".

Sub Макрос()
   
    ' Запуск диалога "Сохранение файла".
    With Application.FileDialog(msoFileDialogSaveAs)
        ' Настраиваем, чтобы в диалоге была открыта нужная папка.
        .InitialFileName = ActiveDocument.Path & "\"
        ' Если юзер щёлкнул "Отмена" или закрыл диалог крестиком.
        If .Show = 0 Then
            Exit Sub
        End If
        ' Сохранение.
        .Execute
    End With
   
End Sub

Оффлайн Rengame113

  • Посетитель форума
  • Сообщений: 65
Спасибо.
Для чего может пригодиться способ 1? Я разницы между двумя способами не заметил.

Онлайн Администратор

  • Administrator
  • Сообщений: 1605
Используйте способ 2. Если вдруг способ 2 вам не подойдёт, то используйте способ 1.
Сейчас вы все возможные ситуации не представляете, поэтому используйте то, что работает в вашей задаче.

Способ 1 может, например, понадобится, если надо автоматически добавить порядковый номер к имени файла, если файл с таким именем существует. Способ 2 такой возможности не даёт; при этом способе юзер должен сам поставить порядковый номер вручную.
Возможно есть и другие ситуации - я все ситуации в данный момент не могу представить.