Макрос excel разбить на листы

Разделение таблицы по листам

В Microsoft Excel есть много инструментов для сборки данных из нескольких таблиц (с разных листов или из разных файлов): прямые ссылки, функция ДВССЫЛ (INDIRECT), надстройки Power Query и Power Pivot и т.д. С этой стороны баррикад всё выглядит неплохо.

Но если вы нарвётесь на обратную задачу — разнесения данных из одной таблицы на разные листы — то всё будет гораздо печальнее. На сегодняшний момент цивилизованных встроенных инструментов для такого разделения данных в арсенале Excel, к сожалению, нет. Так что придется задействовать макрос на Visual Basic, либо воспольоваться связкой макрорекордер+Power Query с небольшой «доработкой напильником» после.

Давайте подробно рассмотрим, как это можно реализовать.

Постановка задачи

Имеем в качестве исходных данных вот такую таблицу размером больше 5000 строк по продажам:

Исходная таблица

Задача: разнести данные из этой таблицы по городам на отдельные листы этой книги. Т.е. на выходе нужно получить на каждом листе только те строки из таблицы, где продажа была в соответствующем городе:

Результаты разнесенные по листам

Подготовка

Чтобы не усложнять код макроса и сделать его максимально простым для понимания, выполним пару подготовительных действий.

Во-первых, создадим отдельную таблицу-справочник, где в единственном столбце будут перечислены все города, для которых нужно создать отдельные листы. Само-собой, в этом справочнике могут быть не все города, присутствующие в исходных данных, а только те, по которым нам нужны отчеты. Проще всего создать такую таблицу, используя команду Данные — Удалить дубликаты (Data — Remove duplicates) для копии столбца Город или функцию УНИК (UNIQUE) — если у вас последняя версия Excel 365.

Поскольку новые листы в Excel по умолчанию создаются перед (левее) текущего (предыдущего), то имеет смысл также отсортировать города в этом справочнике по убыванию (от Я до А) — тогда после создания листы-города расположатся по алфавиту.

Во-вторых, преобразуем обе таблицы в динамические («умные»), чтобы с ними было проще работать. Используем команду Главная — Форматировать как таблицу (Home — Format as Table) или сочетание клавиш Ctrl+T. На появившейся вкладке Конструктор (Design) назовём их таблПродажи и таблГорода, соответственно:

Таблица продаж и справочник по городам

Способ 1. Макрос для деления по листам

На вкладке Разработчик (Developer) нажмите на кнопку Visual Basic или используйте сочетание клавиш Alt+F11. В открывшемся окне редактора макросов вставьте новый пустой модуль через меню Insert — Module и скопируйте туда следующий код:

Sub Splitter()
    For Each cell In Range("таблГорода")
        Range("таблПродажи").AutoFilter Field:=3, Criteria1:=cell.Value
        Range("таблПродажи[#All]").SpecialCells(xlCellTypeVisible).Copy
        Sheets.Add
        ActiveSheet.Paste
        ActiveSheet.Name = cell.Value
        ActiveSheet.UsedRange.Columns.AutoFit
    Next cell
    Worksheets("Данные").ShowAllData
End Sub	

Здесь с помощью цикла For Each … Next реализован проход по ячейкам справочника таблГорода, где для каждого города происходит его фильтрация (метод AutoFilter) в исходной таблице продаж и затем копирование результатов на новый созданный лист. Попутно созданный лист переименовывается в то же имя города и на нем включается автоподбор ширины столбцов для красоты.

Запустить созданный макрос в Excel можно на вкладке Разработчик кнопкой Макросы (Developer — Macros) или сочетанием клавиш Alt+F8.

Способ 2. Создаем множественные запросы в Power Query

У предыдущего способа, при всей его компактности и простоте, есть существенный недостаток — созданные макросом листы не обновляются при изменениях в исходной таблице продаж. Если обновление «на лету» необходимо, то придется использовать связку VBA+Power Query, а точнее — создавать с помощью макроса не просто листы со статическими данными, а обновляемые запросы Power Query.

Макрос в этом случае частично похож на предыдущий (в нём тоже есть цикл For Each … Next для перебора городов в справочнике), но внутри цикла будет уже не фильтрация и копирование, а создание запроса Power Query и выгрузка его результатов на новый лист:

Sub Splitter2()

For Each cell In Range("таблГорода")
    ActiveWorkbook.Queries.Add Name:=cell.Value, Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Источник = Excel.CurrentWorkbook(){[Name=""таблПродажи""]}[Content]," & Chr(13) & "" & Chr(10) & "    #""Измененный тип"" = Table.TransformColumnTypes(Источник,{{""Категория"", type text}, {""Наименование"", type text}, {""Город"", type text}, {""Менеджер"", type text}, {""Дата сделки"", type datetime}, {""Стоимость"", type number}})," & Chr(13) & "" & Chr(10) & "    #""Строки с примененным фильтром"" = Table.Se" & _
        "lectRows(#""Измененный тип"", each ([Город] = """ & cell.Value & """))" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Строки с примененным фильтром"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=" & cell.Value & ";Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [" & cell.Value & "]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = cell.Value
        .Refresh BackgroundQuery:=False
    End With
    ActiveSheet.Name = cell.Value
Next cell
End Sub

После его запуска мы увидим те же листы по городам, но формировать их будут уже созданные запросы Power Query:

Созданные запросы для каждого города в Power Query

При любых изменениях в исходных данных достаточно будет обновить соответствующую таблицу правой кнопкой мыши — команда Обновить (Refresh) или обновить сразу все города оптом, используя кнопку Обновить всё на вкладке Данные (Data — Refresh All).

Ссылки по теме

  • Что такое макросы, как их создавать и использовать
  • Сохранение листов книги как отдельных файлов
  • Сборка данных со всех листов книги в одну таблицу

Предположим, у вас есть рабочий лист с огромными строками данных, и теперь вам нужно разбить данные на несколько рабочих листов на основе Имя и фамилия столбец (см. следующий снимок экрана), а имена вводятся случайным образом. Может быть, вы можете сначала отсортировать их, а затем скопировать и вставить их один за другим в другие новые рабочие листы. Но для повторного копирования и вставки потребуется ваше терпение. Сегодня я расскажу о некоторых быстрых приемах решения этой задачи.

документ разбивает данные по столбцам 1

Разделить данные на несколько листов на основе столбца с кодом VBA

Разделить данные на несколько рабочих листов на основе столбца с Kutools for Excel


Разделить данные на несколько листов на основе столбца с кодом VBA

Если вы хотите быстро и автоматически разделить данные на основе значения столбца, следующий код VBA — хороший выбор. Пожалуйста, сделайте так:

1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.

2. Нажмите Вставить > Модулии вставьте следующий код в окно модуля.

Sub Splitdatabycol()
'updateby Extendoffice
Dim lr As Long
Dim ws As Worksheet
Dim vcol, i As Integer
Dim icol As Long
Dim myarr As Variant
Dim title As String
Dim titlerow As Integer
Dim xTRg As Range
Dim xVRg As Range
Dim xWSTRg As Worksheet
Dim xWS As Worksheet
On Error Resume Next
Set xTRg = Application.InputBox("Please select the header rows:", "Kutools for Excel", "", Type:=8)
If TypeName(xTRg) = "Nothing" Then Exit Sub
Set xVRg = Application.InputBox("Please select the column you want to split data based on:", "Kutools for Excel", "", Type:=8)
If TypeName(xVRg) = "Nothing" Then Exit Sub
vcol = xVRg.Column
Set ws = xTRg.Worksheet
lr = ws.Cells(ws.Rows.Count, vcol).End(xlUp).Row
title = xTRg.AddressLocal
titlerow = xTRg.Cells(1).Row
icol = ws.Columns.Count
ws.Cells(1, icol) = "Unique"
Application.DisplayAlerts = False
If Not Evaluate("=ISREF('xTRgWs_Sheet!A1')") Then
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
Else
Sheets("xTRgWs_Sheet").Delete
Sheets.Add(after:=Worksheets(Worksheets.Count)).Name = "xTRgWs_Sheet"
End If
Set xWSTRg = Sheets("xTRgWs_Sheet")
xTRg.Copy
xWSTRg.Paste Destination:=xWSTRg.Range("A1")
ws.Activate
For i = (titlerow + xTRg.Rows.Count) To lr
On Error Resume Next
If ws.Cells(i, vcol) <> "" And Application.WorksheetFunction.Match(ws.Cells(i, vcol), ws.Columns(icol), 0) = 0 Then
ws.Cells(ws.Rows.Count, icol).End(xlUp).Offset(1) = ws.Cells(i, vcol)
End If
Next
myarr = Application.WorksheetFunction.Transpose(ws.Columns(icol).SpecialCells(xlCellTypeConstants))
ws.Columns(icol).Clear
For i = 2 To UBound(myarr)
ws.Range(title).AutoFilter field:=vcol, Criteria1:=myarr(i) & ""
If Not Evaluate("=ISREF('" & myarr(i) & "'!A1)") Then
Set xWS = Sheets.Add(after:=Worksheets(Worksheets.Count))
xWS.Name = myarr(i) & ""
Else
xWS.Move after:=Worksheets(Worksheets.Count)
End If
xWSTRg.Range(title).Copy
xWS.Paste Destination:=xWS.Range("A1")
ws.Range("A" & (titlerow + xTRg.Rows.Count) & ":A" & lr).EntireRow.Copy xWS.Range("A" & (titlerow + xTRg.Rows.Count))
Sheets(myarr(i) & "").Columns.AutoFit
Next
xWSTRg.Delete
ws.AutoFilterMode = False
ws.Activate
Application.DisplayAlerts = True
End Sub

3, Затем нажмите F5 нажмите клавишу для запуска кода, и появится окно подсказки, напоминающее вам о выборе строки заголовка, см. снимок экрана:

документ разбивает данные по столбцам 7

4. А затем нажмите OK и во втором поле запроса выберите данные столбца, которые вы хотите разделить на основе, см. снимок экрана:

документ разбивает данные по столбцам 8

5, Затем нажмите OK, и все данные на активном листе разбиваются на несколько листов по значению столбца. И разделенные листы названы с именами разделенных ячеек. Смотрите скриншот:

документ разбивает данные по столбцам 2

Внимание: Разделенные листы помещаются в конец книги, где находится главный рабочий лист.


Разделить данные на несколько рабочих листов на основе столбца с Kutools for Excel

Как новичку в Excel, этот длинный код VBA несколько сложен для нас, и большинство из нас даже не знает, как изменить код по своему усмотрению. Здесь я представлю вам многофункциональный инструмент —Kutools for Excel, Его Разделить данные Утилита не только может помочь вам разделить данные на несколько листов на основе столбца, но также может разделить данные по количеству строк.

Примечание:Чтобы применить это Разделить данные, во-первых, вы должны скачать Kutools for Excel, а затем быстро и легко примените эту функцию.

После установки Kutools for Excel, пожалуйста, сделайте так:

1. Выберите диапазон данных, которые вы хотите разделить.

2. Нажмите Кутулс Плюс > Рабочий лист > Разделить данные, см. снимок экрана:

документ разбивает данные по столбцам 3

3. В Разделить данные на несколько листов диалоговое окно, вам необходимо:

1). Выбрать Конкретный столбец вариант в Сплит на основе раздел и выберите значение столбца, по которому вы хотите разделить данные, в раскрывающемся списке. (Если у ваших данных есть заголовки, и вы хотите вставить их в каждый новый разделенный лист, проверьте У моих данных есть заголовки опция).

2). Затем вы можете указать имена разделенных листов под Имя нового листа раздел, укажите правила имен рабочих листов из Правила раскрывающийся список, вы можете добавить Префикс or Суффикс также для имен листов.

3). Щелкните значок OK кнопка. Смотрите скриншот:

документ разбивает данные по столбцам 4

4. Теперь данные разделены на несколько листов в новой книге.

документ разбивает данные по столбцам 5

Нажмите, чтобы скачать Kutools for Excel и бесплатная пробная версия прямо сейчас!


Разделить данные на несколько рабочих листов на основе столбца с Kutools for Excel

Kutools for Excel включает более 300 удобных инструментов Excel. Бесплатная пробная версия без ограничений в течение 30 дней. Загрузите бесплатную пробную версию прямо сейчас!


Связанная статья:

Как разбить данные на несколько листов по количеству строк?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

ДД!Есть таблица с данными (в примере кол-во строк и столбцов минимально, фактически столбцов больше 10, строк более 5000).Помогите написать макрос, чтобы одной кнопкой разбить данные по фактическому наличию- каждое место было на отдельном листе с названием этого места.Кол-во строк и столбцов может меняться.Необходимо для подготовки инвентаризационных описей, просто из описи укажу ссылки на эти страницы, используя формулы. Спасибо.


Доброго дня!
Ну, как-то так:

Sub toSheets()
    Dim nR As Long
    Dim nShe As Worksheet
    Dim nmWS As String

        nR = 2
    With ThisWorkbook
        Do

                Set nShe = Sheets.Add(After:=Worksheets(Worksheets.Count))
            With .Sheets("Общее")
                nmWS = .Cells(nR, 2).Text & " (" & .Cells(nR, 1).Text & ")"
                nShe.Name = nmWS
            End With

                        Set nShe = Nothing

                        nR = nR + 1
        Loop While .Sheets("Общее").Cells(nR, 1).Text <> ""
    End With
    nR = 0
End Sub

Путей к вершине — множество. Этот один из многих!


Цитата: GWolf от 10.12.2014, 16:17
Доброго дня!
Ну, как-то так:
….

Спасибо за ответ. Суть поняла, попробую исправить под себя. Правильно пишут администраторы, что надо точнее выражать, что необходимо сделать. :) Поясню, мне надо было чтобы на листы разбросалось «по фактическому наличию».,т.е. не каждое наименование на отдельном листе, а каждый «магазин» на отдельном листе и в нем таже таблица только с данными для этого «магазина».
Естетсвенно выдает ошибку, что не могут быть листы с одинаковым названием. Пытаюсь исправить, нужна помощь.


Цитата: lelicol от 10.12.2014, 19:34
… надо было чтобы на листы разбросалось «по фактическому наличию».,т.е. не каждое наименование на отдельном листе, а каждый «магазин» на отдельном листе …

Доброго дня!
Ну как то так:

Sub toSheetsShop()
    Dim nR As Long
    Dim nShe As Worksheet
    Dim nmShp1 As String, nmShp2 As String
    Dim flg As Boolean
    Dim i As Integer

        nR = 2
    With ThisWorkbook
        Do
            With .Sheets("Общее")
                nmShp1 = .Cells(nR, 1).Text
            End With

                        i = 0
            flg = False
            For i = 1 To .Sheets.Count
                If .Sheets(i).Name = nmShp1 Then
                    flg = True
                    Exit For
                End If
            Next i

                        If flg = False Then
                Set nShe = Sheets.Add(After:=Worksheets(Worksheets.Count))
                With .Sheets("Общее")
                    nShe.Name = nmShp1
                End With
                ' здесь транслируем данные во вновь созданный лист магазина
                Set nShe = Nothing
            Else
                'ну а здесь мы работаем по трансляции информации в уже имеющийся лист магазина.
            End If

                        nR = nR + 1
        Loop While .Sheets("Общее").Cells(nR, 1).Text <> ""
    End With
    nR = 0
End Sub

макрос проверяет список ранее созданных листов, т.о. если один и тот же магазин будет указан в разных, расположенных не подряд строках он эт о отследит …

Путей к вершине — множество. Этот один из многих!


Спасибо за помощь! Исправила, все работает. Теперь работаю дальше:-) Задача гораздо сложнее, если ничего не получится буду вновь консультироваться. ;)


Путей к вершине — множество. Этот один из многих!


so I have VBA code to do this:

  1. Copy from worksheet «Sheet1» column A1:L1001
  2. Paste them in worksheet «paste»
  3. Clean cells (some cells had «» in them)
  4. Remove any blank rows
  5. Copy data from «paste» A1:L1001
  6. Create new workbook in designated location, rename worksheet with date stamp, paste data from «paste» sheet and save the sheet

Now I want to add another step between 4-5 steps to:
4a. Count column A:A and if A:A>100 lines then split into another workbook and save it with a [date_stamp]_2 or whatever.

So if workbooks contains 340 line there will be 4 workbooks 1-100 lines 101-200, 201-300 and 301-340 lines.

Anyone any ideas?

Something like count A:A, if A:A>100, then take A1:L100, then count from A101:A1001 if >100 then A1 (header) A101:L200 …

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'~~> Copy A Range of Data
    Worksheets("OPT_REPORT").Range("A1:M1001").SpecialCells(xlCellTypeVisible).Copy

'~~> PasteSpecial Values Only
    Worksheets("paste").Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

'~~> Clear Clipboard
    Application.CutCopyMode = False

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'~~> Find "" and replace with pneumonoultramicroscopicsilicovolcanoconiosis

    Worksheets("paste").Range("A1:M1001").Cells.Replace What:="", Replacement:="pneumonoultramicroscopicsilicovolcanoconiosis", LookAt:= _
    xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

'~~> Find pneumonoultramicroscopicsilicovolcanoconiosis and replace with ""

    Worksheets("paste").Range("A1:M1001").Cells.Replace What:="pneumonoultramicroscopicsilicovolcanoconiosis", Replacement:="", LookAt:= _
    xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
    ReplaceFormat:=False

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'~~> Finds a space in column A and deletes entire row

    On Error Resume Next
    Worksheets("paste").Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Dim wbI As Workbook, wbO As Workbook
    Dim wsI As Worksheet, wsO As Worksheet
    Date1 = Now()

'~~> Source/Input Workbook

    Set wbI = ThisWorkbook

'~~> Set the relevant sheet from where you want to copy

    Set wsI = wbI.Sheets("paste")

'~~> Destination/Output Workbook

    Set wbO = Workbooks.Add

With wbO
    '~~> Set the relevant sheet to where you want to paste
    Set wsO = wbO.Sheets("Sheet1")

    '~~>. Save the file
    .SaveAs Filename:="C:FILESTest_" & Format(Date1, "ddmmyyyy-hhmmss") & ".xls", FileFormat:=56

    '~~> Copy the range
    wsI.Range("A1:M1001").SpecialCells(xlCellTypeVisible).Copy

    '~~> Paste it in say Cell A1. Change as applicable
    wsO.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, _
    SkipBlanks:=True, Transpose:=False

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Workbooks("Test_" & Format(Date1, "ddmmyyyy-hhmmss") & ".xls").Close SaveChanges:=True

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Sheets("paste").Range("A1:M1001").Clear

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    MsgBox "File Saved"

‘~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

MulTEx »

1 Май 2011              51077 просмотров

Разнесение данных на разные листы/книги

Данная функция является частью надстройки MulTEx


Вызов команды:
MulTEx -группа Книги/ЛистыКнигиРазнесение данных


Команда, делающее обратное Сбору данных с нескольких листов/книг MulTEx_Icons_Consolidation — разносит данные листа на несколько других листов либо книг. Количество листов/книг зависит от количества уникальных значений критериев для разнесения. Листы и Книги создаются при выполнении команды. Для чего это может быть нужно? Например, есть график отпусков сотрудников, который надо разбить по фамилии руководителя отдела и каждому руководителю отправить по почте список только его сотрудников:
График отпусков
Сидеть и выбирать данные каждого сотрудника на отдельные листы вручную долго и скучно. Плюс еще и отправить надо на указанный адрес. А команда Разнесение данных сама разобьет данные на листы и книги и отправит их по указанным адресам.

Основные
Разнесение данных - Основные
Разнести:

  • Все данные — при выборе будет произведено разнесение абсолютно всех данных, расположенных на листе.
  • Указанный диапазон — будут разнесены только те данные, которые расположены внутри указанного диапазона. Диапазон следует указывать без заголовка. Иначе заголовок будет определен как отдельный критерий и для него будет так же создан свой лист/книга.

Критерии:

  • На основании значений — разнесение данных происходит на основании значений в ячейках. На рисунках выше таблица разносится именно на основании значений и в качестве столбца с критериями указан столбец с фамилиями руководителей. Это значит, что после выполнения команды будет создана новая книга, содержащая ровно столько листов, сколько руководителей в таблице. И в каждом листе будут содержаться только те сотрудники, которые работают в отделе, подчиненном данному руководителю.
  • На основании цвета заливки — разнесение данных происходит на основании цвета заливки ячеек. В данном случае новым листам/книгам будет присвоено имя, равное числовому коду цвета заливки ячеек, а цвет ярлыков листов — равен цвету заливки ячеек.
  • На основании цвета шрифта — разнесение данных происходит на основании цвета шрифта. В данном случае новым листам/книгам будет присвоено имя, равное числовому коду цвета шрифта, а цвет ярлыков листов — равен цвету шрифта.
  • На фиксированное количество строк — данные будут разнесены пропорционально указанному количеству строк в окне напротив данной опции. Будут созданы листы/книги, количество строк с данными в которых будет равно указанному. При этом имена книг и листов будут называться диапазонами строк. Например, если выбрать разбиение диапазона по 10 строк, то результирующие листы или книги будут названы: 1-10, 11-20, 21-30 и т.д.

Поместить:

  • На разные листы одной книги — данные будут разнесены на разные листы одной книги. Книга создается в процессе выполнения команды. Количество листов соответствует количеству уникальных значений для разнесения. Имя каждого листа соответствует значению критерия, данные по которому занесены в этот лист. Если в качестве критерия выбрано На основании цвета заливки или На основании цвета шрифта, то именем листов будут числовые коды цвета заливки или шрифта ячеек.

    Примечание: если в значении критерия имеются символы, недопустимые в имени листа(:/?*[]), то эти символы удаляются. Если критерий содержит исключительно запрещенные символы, то они все будут удалены, а лист, на который будут помещены такие данные будет назван «_invalid_chars_».
    Если количество символов в значении превышает 30(максимально допустимое количество символов в имени листа — 31), то значение обрезается до 30 символов.

  • Каждый критерий в отдельной книге — данные будут разнесены на книги. Книги создаются в процессе выполнения команды и сохраняются в папку, указанную в поле ниже(Сохранять книги в папку). По умолчанию книги сохраняются на Рабочем столе пользователя. Количество книг соответствует количеству уникальных значений для разнесения. Имя каждой книги соответствует значению критерия, данные по которому в неё занесены. Если в качестве критерия выбрано На основании цвета заливки или На основании цвета шрифта, то именем книг будут числовые коды цвета заливки или шрифта ячеек.

    Примечание: если в значении критерия имеются символы, недопустимые в имени книги(:/?*»<>|), то эти символы удаляются. Если критерий содержит исключительно запрещенные символы, то они все будут удалены, а книга, на которую будут помещены такие данные будет названа «_invalid_chars_».
    Если количество символов в значении превышает 30, то значение обрезается до 30 символов(для большей «удобочитаемости», а так же для предотвращения ошибки, возникающей при длине пути к файлу, превышающей корректное определение файла операционной системой).

Номер столбца с критериями разнесения — указывается номер столбца, в котором расположены значения критериев для разнесения. Если на вкладке Основные выбрано Все данные — указывается номер столбца на листе. Т.е. если таблица данных расположена в диапазоне C3:G20 и критерии расположены в столбце D, то следует указать номер столбца 4. Если на вкладке Основные выбрано Указанный диапазон, то указывается номер столбца внутри выбранного диапазона. Т.е. если указан диапазон C3:G20 и критерии расположены в столбце D, то следует указать номер столбца 2.

Копировать только значения и форматы — в новые листы/книги будут скопированы только значения и форматы ячеек. Формулы будут заменены на значения, что позволяет избежать ошибочных значений #ССЫЛКА!(#REF!) при копировании формул со ссылками на другие листы.

Копировать заголовок на каждый лист — в новые листы/книги будет скопирован диапазон ячеек, указанный в поле. Диапазон для заголовков может быть расположен на любом листе любой открытой книги, а не обязательно на листе со значениями для разнесения. Рекомендуется указывать диапазон, ячейки самой нижней строки которого заполнены полностью. Это необходимо для корректного определения конца заголовка программой при вставке строк данных на лист.

Отправка
Если после разбиения данных на листы книги, необходимо отправлять созданные «нарезки» определенным адресатам — необходимо выбрать параметры рассылки на этой вкладке. Если по каким-то причинам какие-то данные не получится отправить — то будет создано сообщение, информирующее об этом.
Разнесение данных - Отправка

Отправлять создаваемые листы/книги — если установлен, то созданные листы/книги будут отправлены на указанные адреса e-mail. Адреса могут быть указаны как в самой таблице для разнесения, так и отдельным списком соответствия.

  • Брать адреса e-mail из столбца — указывается номер столбца. Если на вкладке Основные выбрано Все данные, то указывается номер столбца на листе, даже если сами данные для разнесения начинаются с 3 или любого другого столбца. Т.е. если таблица данных расположена в диапазоне C3:G20 и адреса e-mail при этом расположены в столбце G, то следует указать номер столбца 7. Если на вкладке Основные выбрано Указанный диапазон, то указывается номер столбца внутри выбранного диапазона. Т.е. если указан диапазон C3:G20 и адреса e-mail при этом расположены в столбце G, то следует указать номер столбца 5.
    В данном случае необходимо, чтобы в самой таблице для разнесения присутствовал столбец с корректными адресами e-mail, на которые необходимо отправлять созданные файлы. При этом необязательно указывать e-mail для каждой строки — достаточно, если e-mail будет записан один раз для каждого критерия.
  • Адреса по списку соответствия — при выборе данного пункта необходимо заранее подготовить список соответствия адресов e-mail критериям в таблице. На примере таблицы выше список может выглядеть так:
    Список e-mail
    При этом критерии и сами адреса e-mail должны располагаться в двух смежных столбцах: слева критерии, справа — адреса. На примере таблиц выше это столбцы B и C. Т.к. в качестве критерия разнесения на вкладке Основные выбраны были ФИО руководителя из столбца Руководитель, то в качестве списка соответствия необходимо указать диапазон B2:C5.

Отправка — в этом блоке указывается способ отправки файлов и тема письма.
Тема письма — произвольный текст, который будет указан в создаваемых письмах в качестве темы. Если не указан, то в качестве темы каждого письма будет имя отправляемого файла.

  • Отправлять средствами Excel — файлы будут отправлены почтовой программой, установленной по умолчанию. Аналогично стандартной отправке листов и книг из самого Excel:
    • Excel 2007: Кнопка ОфисОтправить(Send)Сообщение(E-mail)Как вложение(Send as attachment)
    • Excel 2010: Файл(File)Сохранить и отправить(Save & Send)Отправить(Send Using E-mail)Как вложение(Send as attachment)
  • Отправлять через Outlook — файлы будут отправлены при помощи почтовой программы Outlook. Будет создано стандартное сообщение с темой и в каждое сообщение будет вложен свой файл.
  • Отправлять через CDO — отправка файлов данным методом не требует наличия почтовой программы на компьютере. Отправка производится при помощи CDO(Collaboration Data Objects) — библиотеки, встроенной в операционную систему Windows. Для того, чтобы её использовать необходимо лишь знать настройки почтового сервера(Яндекс, Рамблер, Mail.ru и др.).
      Выбрать шаблон — имя шаблона. Сделано для удобство выбора настроек отправки, чтобы не вбивать каждый раз одни и те же настройки. Данный метод использует те же настройки, что и команда Отправка листа/книги по почте. Поэтому если ранее в команде Отправка листа/книги по почте были созданы шаблоны для отправки через CDO — то можно использовать любой из этих шаблонов. Выбрав значение из списка остальные поля заполнятся значениями, записанными для данного шаблона. Если шаблонов нет — то данные о сервере, порте, пользователе и пароле вбиваются вручную.

      Сервер — имя сервера SMTP. SMTP — Simple Mail Transfer Protocol — простой протокол передачи почты — это сетевой протокол, предназначенный для передачи электронной почты в сетях TCP/IP. Указывается почтовый сервер. Если у вас почтовый ящик на сервисе mail.ru заканчивается на inbox.ru, list.ru или bk.ru, то соответственно меняется и адрес SMTP-сервера(smtp.inbox.ru, smtp.list.ru и smtp.bk.ru). Точные значения для настроек серверов можно на сайте поставщика услуг(Яндекс, Mail и т.п.) в описаниях настроек для Outlook и найти тот параметр, который отвечает за SMTPserver(адрес SMTP-сервера, порт, а также правила авторизации).

      Пользователь — имя пользователя. Как правило совпадает с учетной записью для входа в почту.

      Пароль — пароль для входа в почту.

      Порт — порт сервера SMTP. У большинства равен 25 или 465. Точное значения порта можно узнать только на самом сервере. Большинство из них размещают информацию по подключению почтовых программ к серверу, откуда можно узнать точные данные.

      Использовать SSL — Secure Sockets Layer. Сейчас многие почтовые серверы используют шифрование методом SSL, что необходимо учитывать при настройке отправки. Если указанный почтовый сервер использует SSL и галка не будет поставлена — с большой долей вероятности письма просто не будет отправлены сервером. Точные значения для настроек серверов можно на сайте поставщика услуг(Яндекс, Mail и т.п.) в описаниях настроек для Outlook и найти тот параметр, который отвечает за SSL.

Также см.:
Создание отдельных книг из листов текущей книги


Расскажи друзьям, если статья оказалась полезной:

  Плейлист   Видеоинструкции по использованию надстройки MulTEx

Ооооо!)) Оооооо!)))
pashulka, Вы мой герой!)
Сегодня целый день работала с Вашим первым макросом)

Момент, когда я его запустила, мммм! Минута и 15 секунд на 12 тысяч строк! Шикааааарно!))
Я так вдохновилась, что нарисовала себе ещё один файлик-болванку, который бы брал данные из открытого файла (из примерно 200, которые сформировались) и делал то, что я делала обычно вручную (убирал дубликаты по столбцу, вставлял в таблицу, выделял строки на удаление) . Работала с ним сегодня цельный день, сделала 35 файлов даже с учётом двух макросов…

Если раньше по моим подсчётам у меня должно было уйти 14 дней (четырнадцааааать) , то сейчас я рассчитываю ещё примерно на 12 часов)
Боюсь представить, сколько будет, если использовать то, что Вы ещё написали!)) Пойду проверю!))
Спасибо-спасибо-спасибооооо!))

Введение

Предположим, у нас есть рабочий лист с большим количеством данных, и нам нужно разделить данные на отдельные книги Excel на основе столбца «Категория». Решить данную проблему возможно ручным способом, применяя инструмент фильтрации данных. Однако повторное копирование данных потребует терпения.

Как быстро разделить таблицу Excel на отдельные книги макросом. Пошаговый алгоритм

  • Сочетанием клавиш Alt+F11 открываем окно Visual Basic
  • Создаем новый модуль Insert -> Module
  • Вставляем код
Sub Разделить_столбец_по_книгам()
Const column = 2 'номер столбца, по которому будет происходить разделение.'
Const head = True
Set wbAct = ActiveWorkbook

Set dic = CreateObject("Scripting.Dictionary")

lr = Cells(Rows.Count, 1).End(xlUp).Row
lc = Cells(1, Columns.Count).End(xlToLeft).column

arr = Range("A1", Cells(lr, lc)).Value

If head Then fr = 2 Else fr = 1

For i = fr To UBound(arr)
    If Trim(arr(i, column)) <> "" Then dic.Item(arr(i, column)) = dic.Item(arr(i, column)) & "|" & i
Next

iPath = wbAct.Path & Application.PathSeparator & "Result" & Application.PathSeparator
'Result - название папки с результатами'
If Dir(iPath, vbDirectory) = "" Then MkDir iPath

arrDic = dic.keys
Set Rng = Nothing
Application.DisplayAlerts = False
For i = 0 To UBound(arrDic)
rrs = Split(Mid(dic.Item(arrDic(i)), 2), "|")
    If head Then Set Rng = Rows(1)
    For Each rr In rrs
        If Not Rng Is Nothing Then Set Rng = Union(Rows(rr), Rng) Else Set Rng = Rows(rr)
    Next
    Set wb = Workbooks.Add(1)
    Set sh = wb.Sheets(1)
    Rng.Copy
    sh.[A1].PasteSpecial xlPasteColumnWidths
    sh.[A1].PasteSpecial xlPasteAll
    Set Rng = Nothing
    wb.SaveAs iPath & Replace_symbols(arrDic(i)) & ".xlsx", xlOpenXMLWorkbook
    wb.Close False
Next
Application.DisplayAlerts = True
End Sub
'Замена запрещённых символов в имени файла или папки'
Function Replace_symbols(ByVal txt As String) As String
    St$ = "\/~!@#$%^&*=|`'"""
    For i% = 1 To Len(St$)
        txt = Replace(txt, Mid(St$, i, 1), "_")
    Next
    Replace_symbols = txt
End Function
  • На второй строке кода, цифру 2 замените на номер столбца, в котором содержится критерий для разбиения
  • Сохраните код Ctrl+S
  • Сохраните файл Excel, как книгу с поддержкой макросов xlsm
  • Выполните макрос Alt+F8

Папка с новыми файлами будет лежать по тому же пути, что и файл, в котором вы запускали макрос

Заключение

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

У нас Вы можете заказать выполнение задач по MS Excel и Google таблицам

А также, пройти бесплатные онлайн курсы по MS Excel с заданиями

Понравилась статья? Поделить с друзьями:
  • Макрос excel работа с текстом
  • Макрос excel протянуть формулу
  • Макрос excel проверка ячейки
  • Макрос excel примеры скачать
  • Макрос excel одинаковые строки