Как можно «разбить» файл Excel (.xlsx), содержащий несколько листов, на отдельный лист [n] .xlsx?

17

Я думаю, что название говорит все это для этого вопроса, но для уточнения немного дальше:

У меня есть файл .xlsx, который содержит несколько десятков листов. Я хочу вывести все эти листы в виде отдельных файлов .xlsx. Автоматическое присвоение им имен не требуется. Есть ли в Excel функция экспорта листов в отдельный файл?

eichoa3I
источник

Ответы:

17

Это не встроенная функция.

Однако, если вы запустите этот код, он должен сделать эту работу.

Sub SaveSheets()
    Dim strPath As String
    Dim ws As Worksheet

    Application.ScreenUpdating = False

    strPath = ActiveWorkbook.Path & "\"
    For Each ws In ThisWorkbook.Sheets
        ws.Copy
        'Use this line if you want to break any links:
        BreakLinks Workbooks(Workbooks.Count)
        Workbooks(Workbooks.Count).Close True, strPath & ws.Name & ".xlsx"
    Next

    Application.ScreenUpdating = True
End Sub

Sub BreakLinks(wb As Workbook)
    Dim lnk As Variant
    For Each lnk In wb.LinkSources(xlExcelLinks)
        wb.BreakLink lnk, xlLinkTypeExcelLinks
    Next
End Sub

Чтобы запустить код, сделайте следующее:

  1. Откройте редактор VBA ( Alt+ F11)
  2. В дереве в верхнем левом углу щелкните правой кнопкой мыши на своей книге и вставьте новый модуль.
  3. Скопируйте приведенный выше код в этот модуль
  4. Закройте редактор VBA
  5. В Excel нажмите Alt+ F8для запуска макросов и выберитеSaveSheets

или посмотреть Как мне добавить VBA в MS Office?

Питер Альберт
источник
Благодарность! А как насчет обратного? - собрать все вместе? Этот файл Excel, по-видимому, содержал «ссылки» (я не использовал эту функцию раньше), и после разделения Excel не может найти ссылки (он ищет первый лист); Есть ли возможность разделить их и обновить ссылки одновременно / или просто обновить ссылки?
eichoa3I
1
вопрос в том, как вы хотите обрабатывать ссылки. Вы можете легко заменить их значениями, вставив Workbooks(Workbooks.Count).BreakLinksпосле ws.Copy...
Peter Albert
После того, как я открыл одну книгу, всплывающее окно в Excel предложило мне исправить ссылки; Я щелкнул через это диалоговое окно, и теперь ссылки работают для всех файлов. Мне интересно, если это было сохранено в файле или локально ...
eichoa3I
Когда вы говорите, заменить их значениями с Workbooks (Workbooks.Coun) .BreakLinks вы имеете в виду, ссылки удалены, или ...? Я думаю, что лучший способ справиться с ними - просто покончить с ними (то есть, когда пользователи открывают разделенные теперь файлы Excel, они не видят предупреждение о неработающих ссылках).
eichoa3I
извините, попробуйте Workbooks(Workbooks.Count).BreakLink- без sв конце
Питер Альберт
11
  1. Если щелкнуть правой кнопкой мыши вкладку листа Excel, вы можете выбрать « Переместить» или «Копировать» ...

    введите описание изображения здесь

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

    введите описание изображения здесь

  3. Нажмите ОК . Ваш лист теперь находится внутри нового документа.

Der Hochstapler
источник
8

Я попробовал решение Питера Альберта, и оно не сработало для меня, поэтому я нашел решение в этом посте («Excel - сохранить рабочие листы как отдельные файлы») в « Дневнике компьютерного гика» .

Работает отлично. Вы должны переименовать листы, содержащие точки, чтобы получить правильно названные файлы с .xlsрасширениями.

Sub CreateNewWBS()
Dim wbThis As Workbook
Dim wbNew As Workbook
Dim ws As Worksheet
Dim strFilename As String

    Set wbThis = ThisWorkbook
    For Each ws In wbThis.Worksheets
        strFilename = wbThis.Path & "/" & ws.Name
        ws.Copy
        Set wbNew = ActiveWorkbook
        wbNew.SaveAs strFilename
        wbNew.Close
    Next ws
End Sub

Используйте инструкции для создания и запуска этого макроса из публикации Питера Альберта или из Как добавить VBA в MS Office?

hrvoj3e
источник
1
Я также попробовал решение Питера Альберта, и произошла ошибка «Ошибка времени выполнения 13»: несоответствие типов. К счастью, решение в этом ответе работает для меня.
Бин
как я могу заставить его перезаписать существующие файлы с тем же именем?
DAE
Мне это не нужно, потому что каждый дамп уходит в отдельную папку. Может быть, попробовать эту тему
hrvoj3e
Ваше решение сработало для меня :)
Мухаммед Вахид