Страницы: 1
RSS
Автоматическое разделение одного файла Excel на несколько файлов, Автоматическое разделение одного файла Excel на несколько файлов
 
Всем привет. Помогите, пожалуйста, решить задачу. Есть реестр со списком звонков по разным регионам (пример во вложении). Обычно реестр содержит большое кол-во строк. Можно ли данные из реестра разделить на разные файлы в которых будет отдельно перенесены звонки по каждому региону? То есть Москва в новый файл Москвы, все строки по Воронежу в файл Воронежа и тд. Обычно в реестре не менее 50 регионов, через CTRL+C уходит уйма времени ((. Заранее большое спасибо за помощь.  
 
Дело конечно не мое, но обычно возникает обратная задача - собрать все данные в один файл и провести какой-то анализ по ним)
Думаете в 50+ файлах будет легче разобраться?
Может быть Сводной таблицы на другом листе Вам будет достаточно?
Если нет, то посмотрите эти статьи
Разделение таблицы по листам
Сохранение листов книги как отдельных файлов
Согласие есть продукт при полном непротивлении сторон
 
Здравствуйте.
Попробуйте мой вариант макросом.
 
Ещё вариант
Сохраняет в папку Region которая находится в том же каталоге, что и файл с реестром звонков, если такой папки нет, то создает её.
Жмите на кнопку, появится запрос, в файле где находятся регионы выберите ячейку в столбце где находятся города (в вашем файле это столбец Е)
Если такой файл уже существует в папке Region, то сохранит с индексом. Если будет открыт файл с тем же именем, что и сохраняемый, то закроет открытый файл без сохранения
Код
Sub Разбивка_по_листам()
    Dim a As Variant, b As Variant
    Dim wb As Workbook, ws As Worksheet
    On Error GoTo Inform
    Set sd_sys = CreateObject("Scripting.Dictionary")
    Set a = Application.InputBox("Укажите столбец с регионом:", "Запрос данных", Type:=8)
    Set wb = Workbooks(a.Parent.Parent.Name)
    Set ws = wb.Worksheets(a.Parent.Name)
    rn = a(1).Address(0, 0)
    rw = 2 'Range(rn).Row
    cl = Range(rn).Column
    With ws
        If .AutoFilterMode Then .AutoFilterMode = False
        lr = .Cells(.Rows.Count, cl).End(xlUp).Row 'если в столбце регион будут пустые ячейки, то лучше использовать вместо cl номер столбца без пустых ячеек
        .Range("A" & rw - 1 & ":AF" & lr).AutoFilter
        arr_sys = .Range(.Cells(rw, cl), .Cells(lr, cl))
        For n = LBound(arr_sys) To UBound(arr_sys)
            If arr_sys(n, 1) = "" Then arr_sys(n, 1) = "(Пустые)"
            If Not sd_sys.Exists(arr_sys(n, 1)) Then sd_sys.Add arr_sys(n, 1), arr_sys(n, 1)
        Next
        If sd_sys.Count = 1 Then MsgBox "Всего одна система": Exit Sub
        ReDim arr_sp(0 To sd_sys.Count - 2)
        For Each y In sd_sys
            .Copy
            m = 0
            For Each y_1 In sd_sys
                If Not y = y_1 Then
                    If y_1 = "(Пустые)" Then y_1 = ""
                    arr_sp(m) = y_1
                    m = m + 1
                End If
            Next
            If y = "(Пустые)" Then sFlnm = "пусто" Else sFlnm = y
            sFldr = wb.Path & "\Region"
            ActiveSheet.Range(Cells(rw, cl), Cells(lr, cl)).AutoFilter Field:=cl, Criteria1:=Array(arr_sp), Operator:=xlFilterValues
            DeleteFilteredRows
            ActiveSheet.ShowAllData
            SaveAsAndClose sFldr, sFlnm
            wb.Activate
            .Select
        Next
    End With
    Exit Sub
Inform:
    MsgBox "Диапазон не выбран"
End Sub

Sub DeleteFilteredRows()
    Dim rng As Range
    On Error Resume Next
    Set rng = ActiveSheet.AutoFilter.Range.Offset(1).SpecialCells(xlCellTypeVisible)
    On Error GoTo 0
    If Not rng Is Nothing Then
        rng.EntireRow.Delete
    End If
End Sub

Sub SaveAsAndClose(sFldr, sFlnm)
'Application.DisplayAlerts = False
    Dim wb_1 As Workbook
    Set wb_1 = ActiveWorkbook
    If Dir(sFldr, vbDirectory) = "" Then MkDir sFldr
    n = 1
    sFlnm_1 = sFlnm
    Do While Dir(sFldr & "\" & sFlnm_1 & ".xlsx") <> ""
        sFlnm_1 = sFlnm & " (" & n & ")"
        n = n + 1
        If n = 10 Then Exit Sub
    Loop
    If IsBookOpen(sFlnm_1 & ".xlsx") Then Workbooks(sFlnm_1 & ".xlsx").Close SaveChanges:=False 'True
    wb_1.SaveAs Filename:=sFldr & "\" & sFlnm_1 & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    wb_1.Close SaveChanges:=False
'Application.DisplayAlerts = True
End Sub

'https://www.excel-vba.ru/chto-umeet-excel/kak-proverit-otkryta-li-kniga/
Function IsBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook
    For Each wbBook In Workbooks
        If wbBook.Name <> ThisWorkbook.Name Then
            If Windows(wbBook.Name).Visible Then
                If wbBook.Name = wbName Then IsBookOpen = True: Exit For
            End If
        End If
    Next wbBook
End Function
 
Добрый день. Спасибо большое за ответ. Мне нужно именно разделить, чтоб потом каждый файл отправить в регион. Сделала все по инструкции, не очень дружу с макросами (... но выдает ошибку (скрин прилагаю). Буду признательна если подскажите, что я делаю не так.
 
Msi2102, огромное спасибо! Кажется работает!  
 
Ещё вариант. откройте файл и выполните макрос "Seporate".
В папке с исходным файлом будет создана (заменена) папка "Regions" с требуемыми файлами.
Код
Sub Seporate()
    Dim i As Long, x As Range, ws As Worksheet, p As String, q As New Collection, fso
    Application.ScreenUpdating = False: Application.DisplayAlerts = False
    Set fso = CreateObject("Scripting.FileSystemObject")
    p = ThisWorkbook.Path & "\Regions"
    On Error Resume Next: fso.DeleteFolder p: On Error GoTo 0
    fso.CreateFolder p
    Set ws = ActiveSheet
    On Error Resume Next
    For Each x In Range("E2:E" & Cells(Rows.Count, "E").End(xlUp).Row)
        q.Add x, CStr(x)
    Next
    On Error GoTo 0
    For i = 1 To q.Count
        ws.[E:E].AutoFilter Field:=1, Criteria1:=q(i)
        Workbooks.Add (xlWBATWorksheet): ActiveSheet.Name = q(i)
        ws.Columns("A:E").Copy
        Columns("A:E").PasteSpecial Paste:=xlPasteColumnWidths
        ws.UsedRange.Copy [A1]: [A1].Select
        ActiveWorkbook.SaveAs p & "\" & q(i): ActiveWorkbook.Close
    Next
    Selection.AutoFilter
End Sub
Изменено: SAS888 - 14.08.2026 07:25:07
Чем шире угол зрения, тем он тупее.
Страницы: 1
Читают тему
Наверх