Страницы: 1
RSS
Макрос для сохранения листов в книге в отдельные файлы
 
Здравствуйте, помогите пожалуйста, с макросом, про макросы написано много но чтобы все нужное мне в одном макросе не нашел, а собрать все в кучу ума не хватает.
Имеется книга в ней 5 листов, нужно сохранить в отдельный файл третий лист только значения ячеек (без формул) и сохранить четвертый и пятый лист (два листа) в другой отдельный файл также только значения (без формул) все два файла сохранить в текущую папку, а название файлов берется из определенных ячеек, к примеру A1 и B1 со второго листа
Изменено: Павел - 11.10.2024 20:23:34
 
Код
Sub SaveSheetsAsValues()
    Dim wb As Workbook
    Dim wsName As Worksheet
    Dim wsSource As Worksheet
    Dim newBook1 As Workbook
    Dim newBook2 As Workbook
    Dim i As Integer
    
    
    AccelerateBegin
    ' Указать активную книгу Excel с помощью надстройки
    Set wb = ActiveWorkbook
    
    ' Указать второй лист для извлечения названий
    Set wsName = wb.Sheets(2)
    
    ' Получить название для новых книг
    Dim fileName1 As String
    Dim fileName2 As String
    fileName1 = wsName.Range("A1").Value
    fileName2 = wsName.Range("B1").Value
    
    ' Создать новые книги Excel для четвертого и пятого листов
    Set newBook1 = Workbooks.Add
    Set newBook2 = Workbooks.Add
    
    With wb
        ' Сохранить третий лист в первую новую книгу на первый лист с сохранением форматов и ширин столбцов
        Set wsSource = .Sheets(3)
        CopyRangeWithFormat wsSource.UsedRange, newBook1.Sheets(1).Range("A1")
        newBook1.Sheets(1).Name = wsSource.Name
        
        ' Сохранить четвертый лист во вторую новую книгу на первый лист с сохранением форматов и ширин столбцов
        Set wsSource = .Sheets(4)
        CopyRangeWithFormat wsSource.UsedRange, newBook2.Sheets(1).Range("A1")
        newBook2.Sheets(1).Name = wsSource.Name
        
        ' Добавить второй лист во вторую новую книгу
        newBook2.Sheets.Add After:=newBook2.Sheets(1)
        
        ' Сохранить пятый лист во вторую новую книгу на второй лист с сохранением форматов и ширин столбцов
        Set wsSource = .Sheets(5)
        CopyRangeWithFormat wsSource.UsedRange, newBook2.Sheets(2).Range("A1")
        newBook2.Sheets(2).Name = wsSource.Name
    End With
    
    ' Сохранить новые книги
    newBook1.SaveAs wb.Path & "\" & fileName1 & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    newBook2.SaveAs wb.Path & "\" & fileName2 & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    
    ' Закрыть новые книги
    newBook1.Close False
    newBook2.Close False
    
    AccelerateEnd
End Sub

Private Sub CopyRangeWithFormat(rngSource As Range, rngDestination As Range)
    rngSource.Copy
    rngDestination.PasteSpecial Paste:=xlPasteValues
    rngDestination.PasteSpecial Paste:=xlPasteColumnWidths
    rngDestination.PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
End Sub

Private Sub AccelerateBegin()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    ActiveSheet.DisplayPageBreaks = False
    Application.DisplayStatusBar = False
    Application.DisplayAlerts = False
    Application.AskToUpdateLinks = False
End Sub

Private Sub AccelerateEnd()
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    ActiveSheet.DisplayPageBreaks = True
    Application.DisplayStatusBar = True
    Application.DisplayAlerts = True
    Application.AskToUpdateLinks = True
End Sub

Это сохранить в виде надстройки.
 
OffTop. Ого, вот это простыня... Видать неправильно задали запрос боту...
 
Цитата
написал:
Видать неправильно задали запрос боту...
Может добавите конкретики? Что лишнего, что неправильно или чего не хватает?
 
Цитата
Евгений Корнилов написал:
Может добавите конкретики
Нет проблем:
Код
Option Explicit

Sub ForPavelSaveSheetsAsValues()
    Dim rng         As Range
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    ThisWorkbook.Worksheets(3).Copy
    
    With ActiveWorkbook.Sheets(1)
        .UsedRange.Value = .UsedRange.Value
    End With
    
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Worksheets(2).Range("A1").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close False

    ThisWorkbook.Worksheets(4).Copy
    
    With ActiveWorkbook
        ThisWorkbook.Worksheets(5).Copy After:=.Sheets(1)
        
        With .Sheets(1)
            .UsedRange.Value = .UsedRange.Value
        End With
        
        With .Sheets(2)
            .UsedRange.Value = .UsedRange.Value
        End With
    
    End With
    
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Worksheets(2).Range("B1").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook
    ActiveWorkbook.Close False

    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub
И зачем
Цитата
Евгений Корнилов написал:
сохранить в виде надстройки
 
Я в excel по 10 часов в день. Мне допустим не нужны данные только в значениях. Я предположил что нужно убрать именно формулы, а не оставить голый лист. Поэтому добавил сохранение форматов, которые можно убрать комментированием в функции.
У Вас макрос исключительно для одной книги, у меня сделан в виде надстройки для любой книги
Функции, которые убирают алерты и прочее использую постоянно, поэтому менять не стал(оставил как есть).
Оба макроса выполняют одно и тоже, только мой написан для разных книг, Ваш написан для одной

P.S. Пересмотрел Ваш код. По поводу форматов я загнул :D  
Изменено: Евгений Корнилов - 12.10.2024 09:19:49
 
MikeVol, Евгений Корнилов, мужчины, спасибо огромное, реально выручили
 
Цитата
написал:
КодOption Explicit

Sub ForPavelSaveSheetsAsValues()
   Dim rng         As Range
   Application.ScreenUpdating = False
   Application.DisplayAlerts = False

   ThisWorkbook.Worksheets(3).Copy
   
   With ActiveWorkbook.Sheets(1)
       .UsedRange.Value = .UsedRange.Value
   End With
   
   ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Worksheets(2).Range("A1").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook
   ActiveWorkbook.Close False

   ThisWorkbook.Worksheets(4).Copy
   
   With ActiveWorkbook
       ThisWorkbook.Worksheets(5).Copy After:=.Sheets(1)
       
       With .Sheets(1)
           .UsedRange.Value = .UsedRange.Value
       End With
       
       With .Sheets(2)
           .UsedRange.Value = .UsedRange.Value
       End With
   
   End With
   
   ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & ThisWorkbook.Worksheets(2).Range("B1").Value & ".xlsx", FileFormat:=xlOpenXMLWorkbook
   ActiveWorkbook.Close False

   Application.DisplayAlerts = True
   Application.ScreenUpdating = True
End Sub
уважаемые форумчане помогите пожалуйста изменить этот макрос так чтобы при сохранении в новых файлах корректно отображались числа которые начинаются на ноль, а то в новых файла ноль пропадает если он первый стоит, сам пробовал через ИИ сделать, в итоге в новых файлах то даты начинают некорректно отображать, то формулы становится видно
Изменено: Павел - 02.11.2024 16:43:49
 
Павел,
попробуйте перед каждой строкой
Код
.UsedRange.Value = .UsedRange.Value

добавить строку
Код
.UsedRange.NumberFormat = "@"

чтобы получилось вот так:
Код
.UsedRange.NumberFormat = "@"
.UsedRange.Value = .UsedRange.Value
Изменено: New - 03.11.2024 00:51:15
 
New, спасибо, что откликнулись, но не помогло, точнее ноль в конечном файле сохраняется, но даты перестали корректно отображаться, в принципе решил вопрос в исходном файле перед числом с первым нолем просто добавил ' (одинарную кавычку) и в конечном файле ноль стал сохраняться, но если все таки кто то поможет с макросом будет очень хорошо, не будет этого колхоза в одинарной кавычкой )
Страницы: 1
Наверх