Сохраните каждый лист с форматированием в цикле

#excel #vba

Вопрос:

У меня есть файл шаблона и 4 исходных документа, которые я использую для заполнения шаблона. Для каждой строки листа 2 я создаю новый пустой шаблон и заполняю его, в результате чего получается где-то между 10-100 файлами. Я хочу сохранить их в цикле, но у меня возникли проблемы с принудительным закрытием Excel. До сих пор это мой код, переработанный из другого проекта.

 
    Dim w As Long, wb As Workbook
    Dim fp As String, fn As String
    Dim folderName As String
    Dim fsoFSO

    On Error GoTo bm_Safe_Exit
    'Application.ScreenUpdating = False   'stop screen flashing
    Application.DisplayAlerts = False    'stop confirmation alerts

    'start with a reference to ThisWorkbook
    With ThisWorkbook

    folderName = Format(Date, "ddmmyyyy")

    'set path to save
    'fp = "<PATH HERE>" amp; folderName
    fp = "C:UsersUsernameOneDrive - CompanyNameDocumentsProjectsThisProjectcsvOutput" amp; folderName


    Set fsoFSO = CreateObject("Scripting.FileSystemObject")
    If fsoFSO.FolderExists(fp) Then
        MsgBox "FOLDER - " amp; fp amp; " ALREADY EXISTS, DELETE CONTENTS TO PROCEED"
        Exit Sub
    Else
        fsoFSO.CreateFolder (fp)
    End If

        'cycle through each of the worksheets
        For w = 6 To Worksheets.Count
            With Worksheets(w)
                .Copy
                'the ActiveWorkbook is now the new workbook populated with a copy of the current worksheet
                With ActiveWorkbook
                    fn = .Worksheets(1).Name

                Cells.Select
                Selection.SpecialCells(xlCellTypeVisible).Copy
                Worksheets.Add after:=Sheets(Sheets.Count)
                Range("A1").Select
                ActiveSheet.Paste
                Worksheets(1).Delete
                Worksheets(1).Name = fn

                    .SaveAs Filename:=fp amp; Chr(92) amp; fn, FileFormat:=51
                    .Close savechanges:=False   '<~~ already saved in line above
                End With
            End With
        Next w
    End With

bm_Safe_Exit:
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True

End Sub ```
 

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

1. В вашем комментарии говорится «установите путь для сохранения CSV» — какой формат файла вы ожидаете? Если вам нужен CSV, то CSV-файлы не имеют форматирования. Кроме того, этот код, похоже, не соответствует вашему описанию процесса.

2. Этот код взят из другого процесса, в котором я сохраняю серию рабочих листов. Подраздел, который выполняет форматирование и заполнение файла шаблона, является другим подразделом. Я просто хочу адаптировать эту функцию сохранения, чтобы сохранить форматирование каждого созданного рабочего листа шаблона. Действительно ли это так просто, как перейти на .xlsx? В коде установлен формат файла 51

Ответ №1:

Приведенный ниже код сработал для меня: не уверен, где именно может возникнуть проблема с вашим опубликованным кодом, но в ваших With блоках не все доступно для блока с использованием ведущего .

 Sub Test()

    Dim w As Long, wb As Workbook, wbNew As Workbook
    Dim fp As String, fn As String
    Dim fsoFSO

    On Error GoTo bm_Safe_Exit
    Set wb = ThisWorkbook

    fp = "C:UsersUsernameOneDrive - CompanyNameDocumentsProjects" amp; _
         "ThisProjectcsvOutput" amp; Format(Date, "ddmmyyyy") amp; ""
    
    Set fsoFSO = CreateObject("Scripting.FileSystemObject")
    If fsoFSO.FolderExists(fp) Then
        MsgBox "FOLDER - " amp; fp amp; " ALREADY EXISTS, DELETE CONTENTS TO PROCEED"
        Exit Sub
    Else
        fsoFSO.CreateFolder fp
    End If

    'cycle through each of the worksheets
    For w = 6 To wb.Worksheets.Count
        
        'explicitly create a new single-sheet workbook as the destination
        Set wbNew = Workbooks.Add(Template:=xlWBATWorksheet)
        wb.Worksheets(w).Copy before:=wbNew.Sheets(1)
        DeleteSheet wbNew.Sheets(2)
        
        With wbNew
            fn = .Worksheets(1).Name
            .Worksheets.Add after:=.Worksheets(.Worksheets.Count)
            .Worksheets(1).Cells.SpecialCells(xlCellTypeVisible).Copy _
                                Destination:=.Worksheets(2).Range("A1")
            
            DeleteSheet .Worksheets(1)
            
            .Worksheets(1).Name = fn
            .SaveAs Filename:=fp amp; fn, FileFormat:=51
            .Close savechanges:=False   '<~~ already saved in line above
        End With
    Next w
    Exit Sub
    
bm_Safe_Exit:
    MsgBox Err.Description

End Sub

'utility sub
Sub DeleteSheet(ws As Worksheet)
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
End Sub


 

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

1. Это по какой-то причине ничего не сохраняет, а также закрывает мой экземпляр excel вместе со всеми другими открытыми книгами. Я прокомментировал это . Инструкция Close, и она все равно закрыла мой экземпляр excel.

2. Попробуйте прокомментировать обработчик ошибок и посмотрите, есть ли ошибка

3. Я прокомментировал обработку ошибок, и она сохранила первые 4 листа (исходные таблицы данных) без ошибок. Однако листы, которые я хочу сохранить, составляют от 6 до 10.количество. Я изменил цикл на w = 6 На wb.Рабочие листы. Посчитайте, и это спасло только 6-й лист. Он по-прежнему закрывает все экземпляры Excel, которые я изо всех сил пытаюсь понять. Можно ли заставить его просто перейти от w = 6 к wb.листам. Посчитайте, не удаляя их все или не закрывая мой excel? Должен ли я прокомментировать это . Рабочие листы(1). Удалить?

4. Что ты пытаешься сделать? Сохраните каждый рабочий лист (начиная с 6>конец) в отдельный файл или что-то еще?

5. …1 остался после моего тестирования, и я забыл переключить его обратно на 6.