Как быстро разбить одну таблицу на отдельные листы в Excel

Иван Корнев·08.04.2026·4 мин

Чтобы разделить данные из одной общей таблицы на несколько листов по определенному критерию (например, по городам или менеджерам), проще всего использовать фильтр с последующим копированием для разовых задач или макросы VBA и Power Query для регулярной работы. Выбор метода зависит от объема данных и частоты обновления: ручное копирование подойдет для малых объемов, а скрипты автоматизируют процесс за секунды.

Ручной способ: Фильтр и копирование

Этот метод идеален, если нужно сделать разделение один раз и количество групп невелико (до 10–15 листов). Он не требует знаний программирования.

  1. Превратите ваш диапазон данных в «Умную таблицу», нажав Ctrl + T. Это зафиксирует шапку таблицы.
  2. Включите фильтр (ДанныеФильтр или Ctrl + Shift + L).
  3. Отфильтруйте столбец-критерий по первому значению (например, только «Москва»).
  4. Выделите видимые ячейки (нажмите Alt + ;, чтобы выделить только видимые строки, исключая скрытые фильтром).
  5. Скопируйте данные (Ctrl + C), создайте новый лист и вставьте их (Ctrl + V).
  6. Повторите процедуру для остальных значений.

Горячая клавиша Alt + ; критически важна при ручном копировании. Без неё вы скопируете также и скрытые строки, что испортит данные на новых листах.

Автоматизация через VBA: Макрос для мгновенного разделения

Если значений много (десятки или сотни) или операцию нужно повторять регулярно, используйте макрос. Он автоматически создаст листы для каждого уникального значения в выбранном столбце и распределит туда строки.

Вставьте этот код в редактор VBA (Alt + F11InsertModule):

Sub SplitDataToSheets()
    Dim wsSource As Worksheet
    Dim wsNew As Worksheet
    Dim dict As Object
    Dim lastRow As Long, i As Long
    Dim keyVal As Variant
    Dim colKey As Integer
    
    ' Настройки: измените номер столбца для разделения (1 = столбец A)
    colKey = 1 
    Set wsSource = ActiveSheet
    Set dict = CreateObject("Scripting.Dictionary")
    
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' Определяем последнюю строку
    lastRow = wsSource.Cells(wsSource.Rows.Count, colKey).End(xlUp).Row
    
    ' Собираем уникальные значения
    For i = 2 To lastRow
        keyVal = wsSource.Cells(i, colKey).Value
        If Trim(keyVal) <> "" Then
            If Not dict.Exists(keyVal) Then dict.Add keyVal, Nothing
        End If
    Next i
    
    ' Создаем листы и копируем данные
    For Each keyVal In dict.Keys
        ' Проверка имени листа (удаление запрещенных символов)
        Dim safeName As String
        safeName = Replace(Replace(Replace(Replace(keyVal, "\", ""), "/", ""), "?", ""), "*", "")
        If Len(safeName) > 31 Then safeName = Left(safeName, 31)
        
        On Error Resume Next
        Set wsNew = ThisWorkbook.Sheets(safeName)
        On Error GoTo 0
        
        If wsNew Is Nothing Then
            Set wsNew = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
            wsNew.Name = safeName
            ' Копируем заголовки
            wsSource.Rows(1).Copy Destination:=wsNew.Rows(1)
        Else
            ' Очищаем существующий лист, кроме заголовка
            wsNew.Rows("2:" & wsNew.Rows.Count).ClearContents
        End If
        
        ' Копируем строки (используем автофильтр внутри макроса для скорости)
        wsSource.ListObjects(1).Range.AutoFilter Field:=colKey, Criteria1:=keyVal
        wsSource.ListObjects(1).Range.SpecialCells(xlCellTypeVisible).Copy _
            Destination:=wsNew.Range("A2")
        wsSource.ListObjects(1).Range.AutoFilter ' Сброс фильтра
        Set wsNew = Nothing
    Next keyVal
    
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    MsgBox "Данные успешно разделены по листам!", vbInformation
End Sub

Имена листов в Excel не могут содержать символы \ / ? * [ ] и быть длиннее 31 знака. Макрос выше автоматически очищает имена, но если у вас специфические названия, проверьте результат.

Продвинутый уровень: Разделение через Power Query

Power Query подходит, если данные постоянно обновляются, и вам нужно, чтобы новые записи автоматически попадали на соответствующие листы без запуска макросов.

  1. Выделите таблицу и перейдите на вкладку ДанныеИз таблицы/диапазона.
  2. В редакторе Power Query выберите столбец для разделения.
  3. Перейдите на вкладку ГлавнаяРазделить запросПо значению.
  4. Выберите опцию «Один запрос для каждого значения».
  5. Нажмите Закрыть и загрузитьЗакрыть и загрузить в... → выберите «Таблица» и укажите место размещения.

К сожалению, стандартный интерфейс загружает все результаты на один лист или в модель данных. Для вывода каждого значения на отдельный физический лист через интерфейс потребуется сложная настройка параметров или использование функции Excel.CurrentWorkbook() с последующим развертыванием, поэтому для задачи «один критерий = один лист» VBA часто оказывается эффективнее и проще в поддержке.

Сравнение методов разделения данных

МетодКогда использоватьПлюсыМинусы
Ручной (Фильтр)Разовая задача, мало категорий (<10)Не нужны навыки кода, полный контрольДолго, высокая вероятность ошибки человека
Макрос VBAРегулярная работа, много категорийМгновенное выполнение, гибкостьТребует включения макросов в файле (.xlsm)
Power QueryПостоянное обновление исходных данныхНадежность, прозрачность логикиСложнее настроить вывод на разные листы без доп. формул

Частые ошибки при разделении таблиц

  • Отсутствие заголовков: При копировании на новые листы забывают перенести шапку таблицы, из-за чего данные теряют смысл. Всегда копируйте первую строку.
  • Некорректные имена листов: Попытка назвать лист датой в формате 01/01/2024 вызовет ошибку, так как символ / запрещен. Используйте формат 2024-01-01.
  • Переполнение книги: Создание сотен листов с небольшим количеством данных замедляет работу файла. Если категорий очень много, лучше оставить данные на одном листе и использовать Сводные таблицы с фильтрами (Срезы).
  • Потеря форматирования: При использовании простых скриптов копируются только значения. Если нужен цвет ячеек или шрифты, убедитесь, что макрос копирует весь объект строки или диапазона, а не только .Value.

FAQ

Можно ли разделить данные по нескольким критериям сразу? Да. В макросе можно создать составной ключ, объединив значения двух столбцов (например, Город + Отдел). Название листа тогда будет комбинированным (например, «Москва_Продажи»).

Что делать, если макрос выдает ошибку «Имя листа уже существует»? Проверьте, нет ли в книге скрытых листов с такими именами. Также убедитесь, что в исходных данных нет дубликатов названий с лишними пробелами («Москва » и «Москва» считаются разными значениями).

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