Страницы: 1
RSS
Разбивка данных из листа excel на новые книги по определенному признаку
 
доброго времени суток.
нужно решить следующую задачу
есть таблица в одном столбце адрес, в другом название города в котором находится этот адрес.
нужно создать книги с названиями городов из таблицы и перенести адреса, название города и другие возможные данные по этой строке.
при этом если город повторяется он должен быть в одной книге и чтобы в каждую книгу переносилась шапка таблицы
пример табл во вложении
всем заранее спасибо за ответы
 
Цитата
vera198907 написал:
нужно решить следующую задачу
   Макросом в каком-либо свободном столбце формируете уникальный список городов, встречающихся в столбце С,
затем делаете цикл по уникальным городам, создаете новую книгу с одним листом и ищете строки с очередным городом,
найденные строки переносите в новую книгу, книгу сохраняете с названием города.
 
А не пытались найти по форуму, по моему тут несколько тем похожих было, найдете и адаптируете под свои нужды.
"Все гениальное просто, а все простое гениально!!!"
 
vera198907, попробуйте вот так, может метры подправят я всего лишь учусь

Код
Sub test()
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
k = 0
Set a = Workbooks("Пример.xlsm").Sheets("Лист3")
For i = 2 To lLastRow
k = Cells(i, 3)
If Len(Dir(Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx")) > 0 Then
Workbooks.Open Filename:=Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx"
Set b = ActiveWorkbook.Sheets("Лист1")
lLastRowb = b.Cells(Rows.Count, 1).End(xlUp).Row
For q = 2 To lLastRowb + 1
If b.Cells(q, 1) = "" Then
b.Cells(q, 1) = b.Cells(q - 1, 1) + 1
Exit For
End If
Next q
b.Cells(q, 2) = a.Cells(i, 2)
b.Cells(q, 3) = a.Cells(i, 3)
ActiveWorkbook.Close True
Else
Workbooks.Add
ActiveWorkbook.SaveAs Filename:=Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx"
Set b = ActiveWorkbook.Sheets("Лист1")
For q = 1 To 3
b.Cells(1, q) = a.Cells(1, q)
If q = 1 Then
b.Cells(2, q) = 1
Else
b.Cells(2, q) = a.Cells(i, q)
End If
Next q
ActiveWorkbook.Close True
End If
Next i
End Sub
 
Nordheim, похожие темы и вправду есть. цели немного отличаются есть например вот такой код
Код
Sub nb() 
Application.ScreenUpdating = False 
Set tb = ThisWorkbook.Sheets(1) 
myPath = ThisWorkbook.Path 
For i = 2 To tb.Cells(Rows.Count, 2).End(xlUp).Row 
Set newwb = Workbooks.Add 
Set ns = newwb.Sheets(1) 
arrrng = tb.Range(tb.Cells(i, 1), tb.Cells(i, 20)) 
ns.Range("A1:T1") = arrrng 
newwb.SaveAs (myPath & "\" & tb.Cells(i, 3) & ".xlsx") 
newwb.Close False 
Next 
End Sub

но он создает книгу только с одной строкой не ищет еще совпадения
а vba не владею хорошо
не хватает навыков переделать под себя
 
garnik, во-первых огромное что откликнулись

при отработки кода выдается ошибка
Цитата
run-time error 9
subskrit out of range
 
vera198907, Поместите файл примера в папку и откройте его с папки, запустите отработку
 
garnik, работает
спасибо огромное
есть несколько вопросов
1. новые книги сохраняются в ту же папку где находится исходник?
2. если количество столбцов увеличится что нужно будет изменить в коде?
 
vera198907,
Ответ на первый вопрос: Да, файлы сохраняются там где исходник, но можно изменить путь в строках 7, 8 и 22.
Ответ на второй вопрос:
1. Необходимо увеличить цикл в строке кода 24 до нужного количества столбцов
2. После строки 18 добавить код присвоения ячейкам активной книги значения дополнительных столбцов
Изменено: garnik - 30.11.2018 22:04:00
 
Мой вариант макроса
Код
Sub Razbivka()
Dim iLastRow As Long
Dim iLR_Unic As Long
Dim i As Long
Dim Town As String
Dim FoundTown As Range
Dim FAdr As String
Dim n As Integer
Dim IsxodList As Worksheet
  'отключаем обновление экрана, предупреждения и автоматическое вычисление
With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .Calculation = xlManual
   Set IsxodList = ThisWorkbook.ActiveSheet
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 Range("H1:H" & iLastRow).ClearContents
 Range("C1:C" & iLastRow).AdvancedFilter xlFilterCopy, CopyToRange:=Range("H1"), Unique:=True
    iLR_Unic = Cells(Rows.Count, 8).End(xlUp).Row
  For i = 2 To iLR_Unic    'цикл по уникальным городам
    Town = Cells(i, 8)     'очередной город
     Set FoundTown = Columns(3).Find(Town, , xlValues, xlWhole)
          If Not FoundTown Is Nothing Then               'нашли город в столбце С
            FAdr = FoundTown.Address                     'адрес первого вхождения
            Workbooks.Add (xlWBATWorksheet)              'создать книгу с одним листом
             IsxodList.Range("A1:C1").Copy Range("A1")   'копируем шапку
              n = 1
            Do
                n = n + 1
              IsxodList.Range("A" & FoundTown.Row & ":C" & FoundTown.Row).Copy Cells(n, "A")
              Columns("A:C").AutoFit
              Columns("B:B").HorizontalAlignment = xlLeft
                Set FoundTown = IsxodList.Columns(3).FindNext(FoundTown)
            Loop While FoundTown.Address <> FAdr
              ActiveWorkbook.SaveAs ThisWorkbook.Path & "\" & Town & ".xls"
              ActiveWorkbook.Close SaveChanges:=True
          End If
  Next
'включаем все, что отключали
    .Calculation = xlAutomatic
    .DisplayAlerts = True
    .ScreenUpdating = True
End With
End Sub
 
garnik, т е если у меня в таблице будет 6 столбцов код будет выглядеть так

изменения выделены комментариями
Код
Sub test()lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
k = 0
Set a = Workbooks("Пример.xlsm").Sheets("Лист3")
For i = 2 To lLastRow
k = Cells(i, 3)
If Len(Dir(Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx")) > 0 Then
Workbooks.Open Filename:=Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx"
Set b = ActiveWorkbook.Sheets("Лист1")
lLastRowb = b.Cells(Rows.Count, 1).End(xlUp).Row
For q = 2 To lLastRowb + 1
If b.Cells(q, 1) = "" Then
b.Cells(q, 1) = b.Cells(q - 1, 1) + 1
Exit For
End If
Next q
b.Cells(q, 2) = a.Cells(i, 2)
b.Cells(q, 3) = a.Cells(i, 3)
b.Cells(q, 3) = a.Cells(i, 4) ' =============== изменено
b.Cells(q, 3) = a.Cells(i, 5) ' =============== изменено
b.Cells(q, 3) = a.Cells(i, 6) ' =============== изменено
ActiveWorkbook.Close True
Else
Workbooks.Add
ActiveWorkbook.SaveAs Filename:=Workbooks("Пример.xlsm").Path & "\" & k & ".xlsx"
Set b = ActiveWorkbook.Sheets("Лист1")
For q = 1 To 6 ' =============== изменено
b.Cells(1, q) = a.Cells(1, q)
If q = 1 Then
b.Cells(2, q) = 1
Else
b.Cells(2, q) = a.Cells(i, q)
End If
Next q
ActiveWorkbook.Close True
End If
Next i
End Sub
 
vera198907, не совсем. Прошу Вас оформляйте коды в сообщениях согласно правил форума.

Строки:
Код
b.Cells(q, 2) = a.Cells(i, 2)
b.Cells(q, 3) = a.Cells(i, 3)
b.Cells(q, 3) = a.Cells(i, 4)
b.Cells(q, 3) = a.Cells(i, 5)
b.Cells(q, 3) = a.Cells(i, 6)


Должны выглядеть вот так:

Код
b.Cells(q, 2) = a.Cells(i, 2)
b.Cells(q, 3) = a.Cells(i, 3)
b.Cells(q, 4) = a.Cells(i, 4)
b.Cells(q, 5) = a.Cells(i, 5)
b.Cells(q, 6) = a.Cells(i, 6)
 
garnik, прошу прощения за неверный формат
и последний вопрос
если я захочу поменять столбец по которому называются книги
что мне нужно будет изменить?
 
Цитата
vera198907 написал:
если я захочу поменять столбец по которому называются книги
Какие книги?  :D vera198907, у Вас там адреса и города. Пишите в личку сможем разобраться
 
Kuzmich, спасибо огромное

сориентируйте пожалуйста что нужно менять при изменении количества столбцов и строк в таблице
а так же при изменении уникального столбца данными из которого называются новые книги excel  
 
Цитата
что нужно менять при изменении количества столбцов и строк в таблице
Сколько у вас будет столбцов?
В каком столбце будут города?
Количество строк в таблице определяется строкой кода
Код
   iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 
Kuzm0ich, количество столбцов может меняться от 4 до 10 в зависимости от таблицы
города будут в 4 столбце
но в ряде таблиц столбец данными которого называют новые книги excel может сменятся
например может потребоваться создать книги excel по вновь добавленному столбцу способ доставки
в столбце будут строки типа - авиа/жд/авто и т д
 
Цитата
vera198907 написал: сориентируйте пожалуйста что нужно менять
Нужно в сообщениях оформлять код с помощью кнопки <...>
 
  В макросе список уникальных городов формируется в столбце Н. Если у вас будет 10 столбцов, то формируйте список в любом столбце после 10-ого.
Поиск города в макросе идет в столбце С, если города будут в 4-ом столбце, то строка кода будет
Код
     Set FoundTown = Columns(4).Find(Town, , xlValues, xlWhole)
и дальше
Код
     Set FoundTown = IsxodList.Columns(4).FindNext(FoundTown)
В коде есть комментарии, попробуйте разобраться.
Страницы: 1
Наверх