VBA сохраняет рабочий лист как книгу по определенному пути

#excel #vba

Вопрос:

Поэтому я работал над сохранением листа в качестве рабочей книги по определенному пути. Когда я вставляю лист (лист 4) в новую книгу, первым листом в этой новой книге является лист 4. Это нормально, но второй лист, который не обязательно должен быть там, называется лист1 и пуст. Как я могу перезаписать лист1 в качестве листа, который я вставляю (лист4). Или можно ли удалить лист1 без появления предупреждения?

 Sub newWorkbook()

    Dim wb As Workbook
    Set wb = Workbooks.Add

    ThisWorkbook.Sheets(4).Copy Before:=wb.Sheets(1)
    wb.SaveAs "C:the path and file"

    Sheets(2).Delete

End Sub
 

Надеюсь, кто-нибудь сможет мне помочь 🙂

Обновить:

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

Делаю это для листа 4:

 Sub saveFile1()

    Dim PathToSave

    PathToSave = "C:the paththe file name.xlsm"
    ThisWorkbook.Sheets(4).Copy
    ActiveWorkbook.SaveAs Filename:=PathToSave, FileFormat:=xlOpenXMLWorkbookMacroEnabled
    ActiveWorkbook.Close False

End Sub
 

И то же самое сделано для листа5:

 Sub saveFile2()

    Dim PathToSave

    PathToSave = "C:the paththe file name.xlsm"
    ThisWorkbook.Sheets(5).Copy
    ActiveWorkbook.SaveAs Filename:=PathToSave, FileFormat:=xlOpenXMLWorkbookMacroEnabled
    ActiveWorkbook.Close False

End Sub
 

Комментарии:

1. Итак, вы хотите копировать только » Листы(4)»?

2. У меня есть рабочая тетрадь, где у меня 5 листов. Затем я хочу сохранить лист4 и лист5 как новую рабочую книгу, две разные. В первой новой книге лист4 должен быть единственным листом в этой книге, а во второй новой книге лист5 должен быть единственным в этой книге 🙂

3. Делает ли обновленный код то, что вам нужно? В вашем вопросе ничего не упоминалось о пятом листе…

4. Просто пытаюсь сделать это сейчас. И подумал о том, чтобы сделать 2 замены, по одной на каждый лист, но хорошо, если обе будут сохранены в одной и той же подложке

5. Вы это проверяли? Делает ли он то, что вам нужно?

Ответ №1:

Если вы хотите сохранить четвертый и пятый листы в качестве новой рабочей книги, пожалуйста, используйте следующий код:

 Sub newWorkbook()
 Dim PathToSave1 As String, PathToSave2 As String, wb As Workbook, arrSh(), shN, i As Long
    
    Set wb = ThisWorkbook
    arrSh = Array(wb.Sheets(4).Name, wb.Sheets(5).Name)
    PathToSave1 = ThisWorkbook.path amp; ""  'use here the path you need
    PathToSave2 = ThisWorkbook.path amp; "testFolder"
    For Each shN In arrSh
        wb.Sheets(shN).Copy
         i = i   1
        Application.DisplayAlerts = False
         ActiveWorkbook.saveas FileName:=IIf(i = 1, PathToSave1, PathToSave2) amp; _
                 shN amp; "_" amp; Format(Date, "dd_mm_yyyy") amp; ".xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
         ActiveWorkbook.Close False
        Application.DisplayAlerts = True
    Next
End Sub
 

Комментарии:

1. @Anonymous Обновил приведенный выше код, чтобы сохранить листы 4 и 5, используя их имя в качестве имени книги. Если вы хотите, чтобы он добавил текущую дату, это возможно, но не в этом формате («» является незаконным символом при именовании файла…). Адаптировал его для возврата текущей даты в формате, использующем подчеркивание в качестве разделителя. Это то, что тебе нужно?

2. @Anonymous Пожалуйста, протестируйте адаптированный код и отправьте несколько отзывов.

3. @Anonymous Я адаптировал код для перезаписи книги, если она существует. И сохраняет книгу при попытке (.xlsm)… Разве это не работает так, как вам нужно? Но будьте осторожны, чтобы закончить любой из используемых путей в «»

4. @Anonymous Теперь, мы здесь, когда кто-то отвечает на наш вопрос, установите флажок слева от кода, чтобы сделать его принятым ответом . Таким образом, кто-то другой, ищущий аналогичную проблему, будет знать, что предоставленное решение работает… Я также удалю свои комментарии.

Ответ №2:

Скопируйте один лист в Новую книгу

  • Ниже приведены некоторые (те, о которых я мог подумать) сюрпризы, с которыми вы можете столкнуться при копировании одного листа в новую книгу. Некоторые из них более или менее нелепы, но все же действительны.
 Option Explicit

Sub SheetToWorkbookTEST()
    Const ProcName As String = "SheetToWorkbookTEST"
    On Error GoTo ClearError
    
    Const dFolderPath As String = "C:Test"
    Dim wb As Workbook: Set wb = ThisWorkbook
    Dim sh As Object: Set sh = ActiveSheet ' wb.Sheets("Sheet4")
    SheetToWorkbook sh, dFolderPath, "File", Date

ProcExit:
    Exit Sub
ClearError:
    MsgBox "'" amp; ProcName amp; "': Unexpected Error!" amp; vbLf _
        amp; "    " amp; "Run-time error '" amp; Err.Number amp; "':" amp; vbLf _
        amp; "        " amp; Err.Description, vbCritical, ProcName
    Resume ProcExit
End Sub

Sub SheetToWorkbook( _
        ByVal SourcSheet As Object, _
        ByVal FolderPath As String, _
        ByVal FilePattern As String, _
        ByVal FileDate As Date, _
        Optional ByVal DateFormat As String = "yyyymmdd", _
        Optional ByVal PatternDateSeparator As String = " - ", _
        Optional ByVal SheetName As String = "Sheet1")
    Const ProcName As String = "SheetToWorkbook"
    On Error GoTo ClearError
    
    Dim pTitle As String: pTitle = "Sheet to Workbook"
    
    If SourcSheet Is Nothing Then
        MsgBox "No sheet (""Nothing"").", _
            vbCritical, pTitle
        Exit Sub
    End If
    
    If TypeName(SourcSheet) <> "Worksheet" Then
        If TypeName(SourcSheet) <> "Chart" Then
            MsgBox "The first argument has to be a sheet object " _
                amp; "(""Worksheet"" or ""Chart""), yet you have chosen " _
                amp; "an object of type """ amp; TypeName(SourcSheet) amp; """.", _
                vbCritical, pTitle
            Exit Sub
        End If
    End If
    'Debug.Print TypeName(SourcSheet)
    
    If Len(Dir(FolderPath, vbDirectory)) = 0 Then
        MsgBox "The folder '" amp; FolderPath amp; "' does not exist.", _
            vbCritical, pTitle
        Exit Sub
    End If
    
    Dim aSep As String: aSep = Application.PathSeparator
    Dim dFolderPath As String
    If Right(FolderPath, 1) = aSep Then
        dFolderPath = FolderPath
    Else
        dFolderPath = FolderPath amp; aSep
    End If
    'Debug.Print dFolderPath
    
    Dim dFilePath As String
    dFilePath = dFolderPath amp; FilePattern amp; PatternDateSeparator _
        amp; Format(FileDate, DateFormat) amp; ".xlsx"
    'Debug.Print dFilePath
    
    If SourcSheet.Visible <> xlSheetVisible Then
        MsgBox "The sheet '" amp; SourcSheet.Name amp; "' is not visible. " amp; vbLf _
            amp; "You can export a single sheet to a new workbook " _
            amp; "only if it is visible.", _
            vbCritical, pTitle
        Exit Sub
    End If
    
    Application.ScreenUpdating = False
    
    SourcSheet.Copy
    Dim dwb As Workbook: Set dwb = ActiveWorkbook
    Dim dsh As Object: Set dsh = dwb.Sheets(1)
    If dsh.Name <> SheetName Then
        dsh.Name = SheetName
    End If
    
    Dim SaveErrNum As Long
    Application.DisplayAlerts = False ' save without confirmation
    On Error Resume Next
    dwb.SaveAs dFilePath, xlOpenXMLWorkbook
    SaveErrNum = Err.Number
    On Error GoTo ClearError ' instead of 'On Error Goto 0'
    Application.DisplayAlerts = True
    dwb.Close SaveChanges:=False
    
    Application.ScreenUpdating = True
    
    If SaveErrNum <> 0 Then
        MsgBox "The file could not be saved as" _
            amp; vbLf amp; """" amp; dFilePath amp; """" amp; vbLf _
            amp; "Make sure the file name is valid.", _
            vbCritical, pTitle
        Exit Sub
    End If
    
    Dim msg As Long
    msg = MsgBox("Sheet '" amp; SourcSheet.Name amp; "' exported to workbook '" _
        amp; dFilePath amp; "'." amp; vbLf amp; "Do you want to browse its location?", _
        vbInformation   vbYesNo   vbDefaultButton2, pTitle)
    If msg = vbYes Then
        SourcSheet.Parent.FollowHyperlink dFolderPath
    End If
    
ProcExit:
    Exit Sub
ClearError:
    MsgBox "'" amp; ProcName amp; "': Unexpected Error!" amp; vbLf _
        amp; "    " amp; "Run-time error '" amp; Err.Number amp; "':" amp; vbLf _
        amp; "        " amp; Err.Description
    Resume ProcExit
End Sub
 

Комментарии:

1. Большое спасибо! И отлично справляется со всеми комментариями, очень помогает