Сохраните новый файл Excel по заданному пользователем пути с помощью FileDialog (msoFileDialogSaveAs) - PullRequest
0 голосов
/ 15 марта 2020

Я хотел бы сохранить Sheet1 из ActiveWorkbook в новой книге, путь будет предоставлен пользователем и именем, а затем закрою новую книгу.

Сначала я создаю копию листа в новой книге: ActiveWorkbook.Sheets("Sheet1").Copy, а затем вызываю FileDialog (msoFileDialogSaveAs). Но это сохраняет ActiveWorkbook с новым именем и оставляет вновь созданную книгу несохраненной, а Workbooks(FileName & ".xlsm").Close выдает ошибку.

Что я делаю не так?

Option Explicit

Sub Save_As()
    ActiveWorkbook.Sheets("Sheet1").Copy
    Dim Time As String
    Time = Format(Now, "ddmmyyyy_hhmmss")
    Dim FileName As String
    FileName = ActiveWorkbook.Name & "_" & Time
    Dim ObFD As FileDialog
    Set ObFD = Application.FileDialog(msoFileDialogSaveAs)
    With ObFD
        .Title = "Choose a path and export this file"
        .ButtonName = "E&xport"
        ObFD.InitialFileName = "C:\" & FileName
        ObFD.FilterIndex = 2
        ObFD.InitialView = msoFileDialogViewDetails
        If ObFD.Show <> 0 Then
            ObFD.Execute
            Application.DisplayAlerts = False
            Workbooks(FileName & ".xlsm").Close
            Application.DisplayAlerts = True
        End If
    End With
End Sub

1 Ответ

0 голосов
/ 16 марта 2020

Сначала получите путь и имя файла, используя свойство SelectedItems объекта FileDialog. Затем сохраните книгу, используя метод SaveAs объекта Workbook, а затем закройте ее, используя метод Close объекта Workbook.

Другие предложения

1) Включите ScreenUpdating в начале вашего макроса, чтобы все происходило в фоновом режиме и делало вещи более эффективными. Затем снова включите его в конце.

2) Предложите пользователю выбрать путь перед созданием копии листа. В противном случае у вас останется только что созданная рабочая книга, если пользователь отменит.

3) Нет необходимости указывать ObFD в операторе With/End With, поскольку оператор уже ссылается на ObFD. Так, например, вы должны использовать .InitialFileName вместо ObFD.InitialFilename.

4) Избегайте именования вашего свободного времени, так как в VBA есть функция с именем Time.

Вот ваш макрос, который были внесены соответствующие изменения ...

Option Explicit

Sub Save_As()

    Application.ScreenUpdating = False

    Dim MyTime As String
    MyTime = Format(Now, "ddmmyyyy_hhmmss")

    Dim FileName As String
    FileName = ActiveWorkbook.Name & "_" & MyTime

    Dim ObFD As FileDialog
    Set ObFD = Application.FileDialog(msoFileDialogSaveAs)

    With ObFD
        .Title = "Choose a path and export this file"
        .ButtonName = "E&xport"
        .InitialFileName = "C:\" & FileName
        .FilterIndex = 2
        .InitialView = msoFileDialogViewDetails
        .Show
        If .SelectedItems.Count = 0 Then
            Exit Sub
        Else
            Dim PathAndFilename As String
            PathAndFilename = .SelectedItems(1)
        End If
    End With

    ActiveWorkbook.Sheets("Sheet1").Copy

    ActiveWorkbook.SaveAs FileName:=PathAndFilename, FileFormat:=xlOpenXMLWorkbookMacroEnabled
    ActiveWorkbook.Close savechanges:=False

    Application.ScreenUpdating = True

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...