Столкнулся с такой задачей - регулярно приходится разбивать один файл, включающий несколько поставщиков, на отдельные файлы для каждого из них.
Т.е., когда получается 5-6 вендоров, можно и руками все сделать, но дело доходит до 30 и более, что вгоняет в депрессию)
Может быть есть какой-либо способ автоматизировать процесс?
Пример во вложении: 2 листа, разбивка определеяется по столбцу "VENDOR", т.е., в итоге должно быть столько файлов, сколько этих вендоров. При этом, для каждого вендора заполняется и первый и второй лист. Желательно, чтобы и названия файлов были по вендору.
Нашел на excelvba как создавать текстовые файлы с копированием, но неясно, как задавть имена файлов по номеру вендора и как выбирать данные, относящиеся только к определенному вендору.
Заранее благодарен.
Здравствуйте!
Столкнулся с такой задачей - регулярно приходится разбивать один файл, включающий несколько поставщиков, на отдельные файлы для каждого из них.
Т.е., когда получается 5-6 вендоров, можно и руками все сделать, но дело доходит до 30 и более, что вгоняет в депрессию)
Может быть есть какой-либо способ автоматизировать процесс?
Пример во вложении: 2 листа, разбивка определеяется по столбцу "VENDOR", т.е., в итоге должно быть столько файлов, сколько этих вендоров. При этом, для каждого вендора заполняется и первый и второй лист. Желательно, чтобы и названия файлов были по вендору.
Нашел на excelvba как создавать текстовые файлы с копированием, но неясно, как задавть имена файлов по номеру вендора и как выбирать данные, относящиеся только к определенному вендору.
Сделать не сложно - Вам на планете уже подсказывали как. Но нудно... И кстати я так и не увидел ответ на мой вопрос (может и был, но тему там я больше не вижу, "ушла за горизонт" ): вендоры на обоих листах строго синхронны? Можно их определять по одному листу, или для надёжности нужно просмотреть оба?
Сделать не сложно - Вам на планете уже подсказывали как. Но нудно... И кстати я так и не увидел ответ на мой вопрос (может и был, но тему там я больше не вижу, "ушла за горизонт" ): вендоры на обоих листах строго синхронны? Можно их определять по одному листу, или для надёжности нужно просмотреть оба?Hugo
я там ответил, просто вставил ваш ник, подумал там оппонента надо заводить:
Список всех возможных вендоров, в принципе, у меня есть. По синхронности так - на втором листе все вендоры, а на первом часть из них. Я не пойму, "фильтруете листы и отобранное копируете в созданную макрсом книгу" - это подразумевается, лично фильтрую каждый вендор и копирую сам, или это делает макрос? Ящик пива - 1000р, в эквиваленте) Пивом, как бы, красивее, но как его доставлять)
я там ответил, просто вставил ваш ник, подумал там оппонента надо заводить:
Список всех возможных вендоров, в принципе, у меня есть. По синхронности так - на втором листе все вендоры, а на первом часть из них. Я не пойму, "фильтруете листы и отобранное копируете в созданную макрсом книгу" - это подразумевается, лично фильтрую каждый вендор и копирую сам, или это делает макрос? Ящик пива - 1000р, в эквиваленте) Пивом, как бы, красивее, но как его доставлять)backbeat
Сообщение отредактировал backbeat - Четверг, 15.11.2012, 13:49
a = twb.Sheets(2).UsedRange.Columns(2).Value With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(1).[a1] .AutoFilter End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(2).[a1] .AutoFilter End With
Application.StatusBar = False Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
[/vba]
Правда почему-то у меня под 2003 генерятся файлы под 3 мб. Дома ещё проверю - может локальный глюк... P.S. глюк исправил - виноват был Ваш файл Код заменил.
Готово.
[vba]
Code
Sub tt() Dim twb As Workbook, wb As Workbook, a(), i&, el, cnt& Dim strDate$, SaveAsName$
a = twb.Sheets(2).UsedRange.Columns(2).Value With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(1).[a1] .AutoFilter End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(2).[a1] .AutoFilter End With
Application.StatusBar = False Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
[/vba]
Правда почему-то у меня под 2003 генерятся файлы под 3 мб. Дома ещё проверю - может локальный глюк... P.S. глюк исправил - виноват был Ваш файл Код заменил.Hugo
нет, я взял файл, который сюда прикрепил первый лист: PART_NO VENDOR SUMM PART_NAME_ENG PART_NAME_RUS и второй: PART_NO VENDOR ON_ORDER IN_TRANSIT ON_DOCK BACK_ORDER STOCK DMDA_01 DMDA_02 DMDA_03 DMDA_04 DMDA_05 DMDA_06 DMDA_07 DMDA_08 DMDA_09 DMDA_10 D MDA_11 DMDA_12 PART_NAME_ENG PART_NAME_RUS
нет, я взял файл, который сюда прикрепил первый лист: PART_NO VENDOR SUMM PART_NAME_ENG PART_NAME_RUS и второй: PART_NO VENDOR ON_ORDER IN_TRANSIT ON_DOCK BACK_ORDER STOCK DMDA_01 DMDA_02 DMDA_03 DMDA_04 DMDA_05 DMDA_06 DMDA_07 DMDA_08 DMDA_09 DMDA_10 D MDA_11 DMDA_12 PART_NAME_ENG PART_NAME_RUSbackbeat
With twb.Sheets(2) a = Intersect(.Range("B1").CurrentRegion, .UsedRange.Columns(2)).Value End With
With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next Erase a
For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(1).[a1] .AutoFilter End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(2).[a1] .AutoFilter End With
With twb.Sheets(2) a = Intersect(.Range("B1").CurrentRegion, .UsedRange.Columns(2)).Value End With
With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next Erase a
For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(1).[a1] .AutoFilter End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter .AutoFilter Field:=2, Criteria1:=el Intersect(.CurrentRegion, .SpecialCells(xlCellTypeVisible)).Copy wb.Sheets(2).[a1] .AutoFilter End With
офигительно! Только один нюанс, я так понимаю, что файлы создаются на основе второго листа, т.е. сколько на нем вендоров, столько и файлов. Можно завязать на вендоров первого листа, пжл?
офигительно! Только один нюанс, я так понимаю, что файлы создаются на основе второго листа, т.е. сколько на нем вендоров, столько и файлов. Можно завязать на вендоров первого листа, пжл?backbeat
With twb.Sheets(1) a = .Range("B1").CurrentRegion.Columns(2).Value End With
With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next Erase a
For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter Field:=2, Criteria1:=el .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(1).[a1] End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter Field:=2, Criteria1:=el .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(2).[a1] End With
With twb.Sheets(1) a = .Range("B1").CurrentRegion.Columns(2).Value End With
With CreateObject("scripting.dictionary") .comparemode = 1 For i = 2 To UBound(a): .Item(Trim(a(i, 1))) = 0&: Next Erase a
For Each el In .keys cnt = cnt + 1 Application.StatusBar = "Working with " & el & ", " & cnt & " of " & .Count Set wb = Workbooks.Add(1) With twb.Sheets(1).Range("B1") .AutoFilter Field:=2, Criteria1:=el .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(1).[a1] End With wb.Sheets.Add After:=wb.Worksheets(1) With twb.Sheets(2).Range("B1") .AutoFilter Field:=2, Criteria1:=el .CurrentRegion.SpecialCells(xlCellTypeVisible).Copy wb.Sheets(2).[a1] End With