Всем добрый вечер, навеяло на создание данной темы, мой прошлый вопрос в разделе VBA.
Данный макрос делит лист на книги по условию с нужного Вам столбца в котором находятся какие либо данные.
Не привык присваивать чужие заслуги, поэтому говорю сразу данный код, 98 его процентов, принадлежитKuklP Но у меня давно было желание получить такой код в универсальном виде, поэтому я его немножко подправил, внёс несколько дополительных переменных и заменил кое что.
Итак сам код в откорректированном виде: [vba]
Код
Public Sub CutFile() Dim i&, a Dim Shapka%, ident%, lastRow, lastCol
lastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row lastCol = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Shapka = InputBox("Укажите номер строки шапки таблицы") ident = InputBox("Укажите номер столбца по которому будет происходить деление файла")
a = Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) With CreateObject("scripting.dictionary") For i = 2 To UBound(a): .Item(a(i, ident)) = "": Next a = .keys End With For i = 0 To UBound(a) Sheets(1).Copy With Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) .AutoFilter 1, "<>" & a(i) .Offset(1).SpecialCells(12).EntireRow.Delete With .Parent .AutoFilterMode = 0: .Name = a(i) .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51 .Parent.Close End With End With Next End Sub
[/vba]
я заменил изначальный CurrentRegion на Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) Объясню почему, у меня в таблице ситуация такая, что строчка над шапкой таблицы имеет записи и таким образом при установке фильтра он устанавливался не в шапке, а строкой выше, для этого нужен был офсет и танцы с бубном, чтоб от этого уйти, решил правильнее указывать готовый диапазон всей таблицы. Также добавил два InputBox для того чтоб указать в какой строке у Вас находится шапка и по какому столбцу будем делить файл. Для большего понимая прилаживаю примерчик.
Всем добрый вечер, навеяло на создание данной темы, мой прошлый вопрос в разделе VBA.
Данный макрос делит лист на книги по условию с нужного Вам столбца в котором находятся какие либо данные.
Не привык присваивать чужие заслуги, поэтому говорю сразу данный код, 98 его процентов, принадлежитKuklP Но у меня давно было желание получить такой код в универсальном виде, поэтому я его немножко подправил, внёс несколько дополительных переменных и заменил кое что.
Итак сам код в откорректированном виде: [vba]
Код
Public Sub CutFile() Dim i&, a Dim Shapka%, ident%, lastRow, lastCol
lastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row lastCol = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Shapka = InputBox("Укажите номер строки шапки таблицы") ident = InputBox("Укажите номер столбца по которому будет происходить деление файла")
a = Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) With CreateObject("scripting.dictionary") For i = 2 To UBound(a): .Item(a(i, ident)) = "": Next a = .keys End With For i = 0 To UBound(a) Sheets(1).Copy With Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) .AutoFilter 1, "<>" & a(i) .Offset(1).SpecialCells(12).EntireRow.Delete With .Parent .AutoFilterMode = 0: .Name = a(i) .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51 .Parent.Close End With End With Next End Sub
[/vba]
я заменил изначальный CurrentRegion на Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) Объясню почему, у меня в таблице ситуация такая, что строчка над шапкой таблицы имеет записи и таким образом при установке фильтра он устанавливался не в шапке, а строкой выше, для этого нужен был офсет и танцы с бубном, чтоб от этого уйти, решил правильнее указывать готовый диапазон всей таблицы. Также добавил два InputBox для того чтоб указать в какой строке у Вас находится шапка и по какому столбцу будем делить файл. Для большего понимая прилаживаю примерчик.DJ_Marker_MC
Немного подправил код. Не работал отбор, если столбец был не первым... Теперь всё ок, где бы не находилась шапка или столбец по которому нужно делить, всё делит без проблем:
[vba]
Код
Public Sub CutFile() Dim i&, a Dim Shapka%, ident%, lastRow, lastCol
lastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row lastCol = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Shapka = InputBox("Укажите номер строки шапки таблицы") ident = InputBox("Укажите номер столбца по которому будет происходить деление файла")
a = Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) With CreateObject("scripting.dictionary") For i = 2 To UBound(a): .Item(a(i, ident)) = "": Next a = .keys End With For i = 0 To UBound(a) Sheets(1).Copy With Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) .AutoFilter ident, "<>" & a(i) .Offset(1).SpecialCells(12).EntireRow.Delete With .Parent .AutoFilterMode = 0: .Name = a(i) .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51 .Parent.Close End With End With Next End Sub
[/vba]
Немного подправил код. Не работал отбор, если столбец был не первым... Теперь всё ок, где бы не находилась шапка или столбец по которому нужно делить, всё делит без проблем:
[vba]
Код
Public Sub CutFile() Dim i&, a Dim Shapka%, ident%, lastRow, lastCol
lastRow = Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row lastCol = Cells.Find(What:="*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column Shapka = InputBox("Укажите номер строки шапки таблицы") ident = InputBox("Укажите номер столбца по которому будет происходить деление файла")
a = Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) With CreateObject("scripting.dictionary") For i = 2 To UBound(a): .Item(a(i, ident)) = "": Next a = .keys End With For i = 0 To UBound(a) Sheets(1).Copy With Range(Cells(Shapka, 1), Cells(lastRow, lastCol)) .AutoFilter ident, "<>" & a(i) .Offset(1).SpecialCells(12).EntireRow.Delete With .Parent .AutoFilterMode = 0: .Name = a(i) .Parent.SaveAs ThisWorkbook.Path & "\" & a(i) & ".xlsx", 51 .Parent.Close End With End With Next End Sub