Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Разделить листы на книги - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Разделить листы на книги (Макросы/Sub)
Разделить листы на книги
Мурад Дата: Четверг, 13.04.2017, 15:08 | Сообщение № 1
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Добрый день!
В теме Разделить лист на книги представлен очень эффективный код, который делит лист на книги в соответствии с данными на одном листе:
[vba]
Код
Public Sub www()
    Dim i&, a
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        Sheets(1).Copy
        With ActiveSheet.[a1].CurrentRegion
            .AutoFilter 1, "<>" & a(i)
            .Offset(1).SpecialCells(12).EntireRow.Delete
            With .Parent
                .AutoFilterMode = 0: .Name = a(i)
                .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
                .Parent.Close
            End With
        End With
    Next
End Sub
[/vba]
Подскажите, что добавить в данный код, чтобы книги создавались сразу с несколькими листами в соответствии с одним и тем же уникальным полем на каждом листе?
Прикладываю пример. На первых 3 листах - исходная информация, а на следующих 3 листах - результирующий файл с нужными листами для значения "а1".
К сообщению приложен файл: 6326875.xlsx (17.5 Kb)
 
Ответить
СообщениеДобрый день!
В теме Разделить лист на книги представлен очень эффективный код, который делит лист на книги в соответствии с данными на одном листе:
[vba]
Код
Public Sub www()
    Dim i&, a
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        Sheets(1).Copy
        With ActiveSheet.[a1].CurrentRegion
            .AutoFilter 1, "<>" & a(i)
            .Offset(1).SpecialCells(12).EntireRow.Delete
            With .Parent
                .AutoFilterMode = 0: .Name = a(i)
                .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
                .Parent.Close
            End With
        End With
    Next
End Sub
[/vba]
Подскажите, что добавить в данный код, чтобы книги создавались сразу с несколькими листами в соответствии с одним и тем же уникальным полем на каждом листе?
Прикладываю пример. На первых 3 листах - исходная информация, а на следующих 3 листах - результирующий файл с нужными листами для значения "а1".

Автор - Мурад
Дата добавления - 13.04.2017 в 15:08
Manyasha Дата: Четверг, 13.04.2017, 16:15 | Сообщение № 2
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
Мурад, здравствуйте.
Если на всех листах набор уникальных значений одинаковый, можно так:
[vba]
Код
Public Sub www()
    Application.ScreenUpdating = False
    Dim i&, a, sh As Worksheet
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        ThisWorkbook.Sheets.Copy
        For Each sh In ActiveWorkbook.Sheets
            n = sh.Cells.Find(what:="столбец_уникальный", LookAt:=xlWhole).Column
            With sh.[a1].CurrentRegion
                .AutoFilter n, "<>" & a(i)
                .Offset(1).SpecialCells(12).EntireRow.Delete
                sh.AutoFilterMode = 0
            End With
        Next sh
        With ActiveWorkbook
            .SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
            .Close
        End With
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: 6326875-1.xlsm (22.9 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеМурад, здравствуйте.
Если на всех листах набор уникальных значений одинаковый, можно так:
[vba]
Код
Public Sub www()
    Application.ScreenUpdating = False
    Dim i&, a, sh As Worksheet
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        ThisWorkbook.Sheets.Copy
        For Each sh In ActiveWorkbook.Sheets
            n = sh.Cells.Find(what:="столбец_уникальный", LookAt:=xlWhole).Column
            With sh.[a1].CurrentRegion
                .AutoFilter n, "<>" & a(i)
                .Offset(1).SpecialCells(12).EntireRow.Delete
                sh.AutoFilterMode = 0
            End With
        Next sh
        With ActiveWorkbook
            .SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
            .Close
        End With
    Next
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Manyasha
Дата добавления - 13.04.2017 в 16:15
Мурад Дата: Четверг, 13.04.2017, 16:38 | Сообщение № 3
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Manyasha, спасибо большое!
Я так понял, это код для вставки в модуль книги, а не в личную книгу макросов.
Скажите, а числа 12 и 51 в коде что означают?
 
Ответить
СообщениеManyasha, спасибо большое!
Я так понял, это код для вставки в модуль книги, а не в личную книгу макросов.
Скажите, а числа 12 и 51 в коде что означают?

Автор - Мурад
Дата добавления - 13.04.2017 в 16:38
Мурад Дата: Четверг, 13.04.2017, 17:54 | Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Я применил данный код к своему массиву, но выходит ошибка "Метод Autofilter из класса Range завершен неверно". В моем массиве 4 листа. Уникальное поле расположено по порядку: в 1,1,2,1 столбцах каждого листа.
Если это важно, размеры данных на листах (Строки х Столбцы): 231х27, 6166х17, 443х10, 246х7
 
Ответить
СообщениеЯ применил данный код к своему массиву, но выходит ошибка "Метод Autofilter из класса Range завершен неверно". В моем массиве 4 листа. Уникальное поле расположено по порядку: в 1,1,2,1 столбцах каждого листа.
Если это важно, размеры данных на листах (Строки х Столбцы): 231х27, 6166х17, 443х10, 246х7

Автор - Мурад
Дата добавления - 13.04.2017 в 17:54
Мурад Дата: Четверг, 13.04.2017, 22:04 | Сообщение № 5
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Параметр n работает некорректно у меня. Не могу понять, почему.
К сообщению приложен файл: -2.xlsx (17.5 Kb)
 
Ответить
СообщениеПараметр n работает некорректно у меня. Не могу понять, почему.

Автор - Мурад
Дата добавления - 13.04.2017 в 22:04
_Boroda_ Дата: Пятница, 14.04.2017, 01:12 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
У Вас там нехорошие куски автофильтра стоят на листах 3 и 4
Макрос Марины можно вот так немного дополнить на этот случай (строки с дополнением обозначил ===)
[vba]
Код
Public Sub www()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = 0 '===чтобы не спрашивал при переписывании файла
    Dim i&, a, sh As Worksheet, n '===добавил объявление n на случай Option Explicit
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        ThisWorkbook.Sheets.Copy
        For Each sh In ActiveWorkbook.Sheets
            n = sh.Cells.Find(what:="ID_VUZ", LookAt:=xlWhole).Column '===поменял название столбца для проверки
            With sh.[a1].CurrentRegion
                If sh.AutoFilterMode Then '===если автофильтр на листе есть
                    .AutoFilter '===снимаем его
                End If '===
                .AutoFilter n, "<>" & a(i)
                .Offset(1).SpecialCells(12).EntireRow.Delete
                sh.AutoFilterMode = 0
            End With
        Next sh
        With ActiveWorkbook
            .SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
            .Close
        End With
    Next
    Application.DisplayAlerts = 1 '===
    Application.ScreenUpdating = True
End Sub
[/vba]
К сообщению приложен файл: -2_1.xlsm (25.0 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеУ Вас там нехорошие куски автофильтра стоят на листах 3 и 4
Макрос Марины можно вот так немного дополнить на этот случай (строки с дополнением обозначил ===)
[vba]
Код
Public Sub www()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = 0 '===чтобы не спрашивал при переписывании файла
    Dim i&, a, sh As Worksheet, n '===добавил объявление n на случай Option Explicit
    a = [a1].CurrentRegion
    With CreateObject("scripting.dictionary")
        For i = 2 To UBound(a): .Item(a(i, 1)) = "": Next
        a = .keys
    End With
    For i = 0 To UBound(a)
        ThisWorkbook.Sheets.Copy
        For Each sh In ActiveWorkbook.Sheets
            n = sh.Cells.Find(what:="ID_VUZ", LookAt:=xlWhole).Column '===поменял название столбца для проверки
            With sh.[a1].CurrentRegion
                If sh.AutoFilterMode Then '===если автофильтр на листе есть
                    .AutoFilter '===снимаем его
                End If '===
                .AutoFilter n, "<>" & a(i)
                .Offset(1).SpecialCells(12).EntireRow.Delete
                sh.AutoFilterMode = 0
            End With
        Next sh
        With ActiveWorkbook
            .SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51
            .Close
        End With
    Next
    Application.DisplayAlerts = 1 '===
    Application.ScreenUpdating = True
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 14.04.2017 в 01:12
Мурад Дата: Пятница, 14.04.2017, 09:44 | Сообщение № 7
Группа: Проверенные
Ранг: Ветеран
Сообщений: 513
Репутация: 18 ±
Замечаний: 0% ±

Excel 2007
Спасибо, Александр!
Все работает в лучших традициях :)
 
Ответить
СообщениеСпасибо, Александр!
Все работает в лучших традициях :)

Автор - Мурад
Дата добавления - 14.04.2017 в 09:44
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Разделить листы на книги (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!