Страницы: 1
RSS
разбитие страниц на листы с названием, разбитие страниц на листы с названием
 
при разбитии на листы если их 2 и более он создает помимо ГС_14047_(1) еще и Лист2 и далее например. можно как то сделать чтоб макрос собирал во едино отчет? Спасибо.



Скрытый текст
Изменено: Sanja - 11.08.2026 10:45:51 (Код в сообщении оформляйте соответствующим тегом (<...> на панели). Длинный код можно спрятать под спойлер (SP))
 
Ничего не понятно.
Лучше вместо нерабочего кода покажите в файле желаемый результ.
Разбейте исходный лист на нужное количество листов снужным названием. Вручную
Согласие есть продукт при полном непротивлении сторон
 
 файл отчет в нем все документы идут попорядку,бывает однина страница  бывает несколько. Как   их разделять на отдельный лист с названием например ГС_14047  
воот такая история
Спасибо
 
Цитата
vov86 написал: воот такая история
Ваш новый файл ничем не отличается от предыдущего. В чем подвох? Что должно получится после макроса?
Цитата
Как   их разделять на отдельный лист
Кого 'их' разделять? Покажите в файле желаемый результат
Изменено: Sanja - 11.08.2026 11:19:32
Согласие есть продукт при полном непротивлении сторон
 
то что до такой у меня файл а то что после то мечтаю заполучит))
 
Попробуйте таким макросом
единственное не дописал проверку на дубли листов, то есть если будет одинаковый номер отчета или будет уже существовать лист с таким именем, то выдаст ошибку
Код
Sub Отчеты()
    Dim pb As HPageBreak, vb As VPageBreak, msg As String, wb As Workbook, ws As Worksheet, sd As Object, c_start As Long, c_end As Long, lst, nach As String, pred As String
    Set sd = CreateObject("Scripting.Dictionary")
    Set sd_nm = CreateObject("Scripting.Dictionary")
    Set wb = ThisWorkbook
    Set ws = wb.ActiveSheet
    With ws
        c_start = 1
        c_end = .UsedRange.Rows.Count
        nach = "пусто"
        If Not .Cells(6, 12) = "" Then lst = .Cells(6, 12) Else lst = "пусто"
        For Each pb In .HPageBreaks
            If Left(Cells(pb.Location.Row, 1).Value, 12) = "Генподрядчик" Then
                sd.Add nach, "пусто"
                sd_nm.Add nach, lst
                If Not .Cells(pb.Location.Row + 5, 12) = "" Then lst = .Cells(pb.Location.Row + 5, 12) Else lst = "пусто"
                pred = nach
                nach = c_start & ":" & pb.Location.Row - 1
                sd(pred) = pb.Location.Row & ":" & c_end
            End If
        Next
        sd.Add nach, "пусто"
        If Cells(Split(nach, ":")(1) + 6, 12) <> "" Then sd_nm.Add nach, Cells(Split(nach, ":")(1) + 6, 12) Else sd_nm.Add nach, "пусто"
        For Each y In sd
            .Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            If Not sd(y) = "пусто" Then ActiveSheet.Rows(sd(y)).EntireRow.Delete
            If Not y = "пусто" Then ActiveSheet.Rows(y).EntireRow.Delete
            If Not sd_nm(y) = "пусто" Then ActiveSheet.Name = sd_nm(y)
        Next
    End With
End Sub

PS: разбиваю согласно ваших областей печати, при условии, что в первая строка начинается с "Генподрядчик"
Изменено: Msi2102 - 11.08.2026 17:53:35
 
Ваш код просто супер пупер идиалити)), подскажите пожалуйста как его приспособить к вот таким актам?
 
Цитата
vov86 написал:
подскажите пожалуйста как его приспособить к вот таким актам?
Можно так, но Вам необходимо следить за областями печати, например в Вашем исходном файле строка 122 лишняя, "Утверждаю" должно быть в перовой строке, а также номера актов должны находиться в одном и том же месте. Или нужно менять подход по определению границ актов, но я уже этого делать не буду, нет ни времени ни желания, возможно кто-нибудь ещё откликнется и либо отредактирует мой макрос, либо напишет свой.
Код
Sub Отчеты_АКТ()
    Dim pb As HPageBreak, vb As VPageBreak, msg As String, wb As Workbook, ws As Worksheet, sd As Object, c_start As Long, c_end As Long, lst, nach As String, pred As String
    Set sd = CreateObject("Scripting.Dictionary")
    Set sd_nm = CreateObject("Scripting.Dictionary")
    Set wb = ThisWorkbook
    Set ws = wb.ActiveSheet
    With ws
        c_start = 1
        c_end = .UsedRange.Rows.Count
        nach = "пусто"
        If Not .Cells(8, 1) = "" Then
            lst = Replace(Left(.Cells(8, 1), InStr(.Cells(8, 1), "от") - 2), " ", "_")
        Else
            lst = "пусто"
        End If
        For Each pb In .HPageBreaks
            If Left(Cells(pb.Location.Row, 20).Value, 9) = "УТВЕРЖДАЮ" Then
                sd.Add nach, "пусто"
                sd_nm.Add nach, lst
                If Not .Cells(pb.Location.Row + 7, 1) = "" Then
                    lst = Replace(Left(.Cells(pb.Location.Row + 7, 1), InStr(.Cells(pb.Location.Row + 7, 1), "от") - 2), " ", "_")
                Else
                    lst = "пусто"
                End If
                pred = nach
                nach = c_start & ":" & pb.Location.Row - 1
                sd(pred) = pb.Location.Row & ":" & c_end
            End If
        Next
        sd.Add nach, "пусто"
        If Cells(Split(nach, ":")(1) + 8, 1) <> "" Then
            lst = Replace(Left(.Cells(Split(nach, ":")(1) + 8, 1), InStr(Cells(Split(nach, ":")(1) + 8, 1), "от") - 2), " ", "_")
            sd_nm.Add nach, lst
        Else
            sd_nm.Add nach, "пусто"
        End If
        For Each y In sd
            .Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            If Not sd(y) = "пусто" Then ActiveSheet.Rows(sd(y)).EntireRow.Delete
            If Not y = "пусто" Then ActiveSheet.Rows(y).EntireRow.Delete
            If Not sd_nm(y) = "пусто" Then ActiveSheet.Name = sd_nm(y)
        Next
    End With
End Sub
 
Спасибо только сейчас попробовал, превосходно)) из файла макрос работает
когда перетаскиваю макрос  в личную книгу макросов Excel  VBAProject (PERSONAL.XLSB) выдает вот такие окна


       If Cells(Split(nach, ":")(1) + 8, 1) <> "" Then
 
сделайте так
Код
Sub Отчеты_АКТ_1()
    Dim pb As HPageBreak, vb As VPageBreak, msg As String, wb As Workbook, ws As Worksheet, sd As Object, c_start As Long, c_end As Long, lst, nach As String, pred As String
    Set sd = CreateObject("Scripting.Dictionary")
    Set sd_nm = CreateObject("Scripting.Dictionary")
'    Set wb = ThisWorkbook
    Set wb = ActiveWorkbook
    Set ws = wb.ActiveSheet
    With ws
        c_start = 1
        c_end = .UsedRange.Rows.Count
        nach = "пусто"
        If Not .Cells(8, 1) = "" Then
            lst = Replace(Left(.Cells(8, 1), InStr(.Cells(8, 1), "от") - 2), " ", "_")
        Else
            lst = "пусто"
        End If
        For Each pb In .HPageBreaks
            If Left(Cells(pb.Location.Row, 20).Value, 9) = "УТВЕРЖДАЮ" Then
                sd.Add nach, "пусто"
                sd_nm.Add nach, lst
                If Not .Cells(pb.Location.Row + 7, 1) = "" Then
                    lst = Replace(Left(.Cells(pb.Location.Row + 7, 1), InStr(.Cells(pb.Location.Row + 7, 1), "от") - 2), " ", "_")
                Else
                    lst = "пусто"
                End If
                pred = nach
                nach = c_start & ":" & pb.Location.Row - 1
                sd(pred) = pb.Location.Row & ":" & c_end
            End If
        Next
        sd.Add nach, "пусто"
        If Cells(Split(nach, ":")(1) + 8, 1) <> "" Then
            lst = Replace(Left(.Cells(Split(nach, ":")(1) + 8, 1), InStr(Cells(Split(nach, ":")(1) + 8, 1), "от") - 2), " ", "_")
            sd_nm.Add nach, lst
        Else
            sd_nm.Add nach, "пусто"
        End If
        For Each y In sd
'            .Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            .Copy After:=ActiveWorkbook.Sheets(ThisWorkbook.Sheets.Count)
            If Not sd(y) = "пусто" Then ActiveSheet.Rows(sd(y)).EntireRow.Delete
            If Not y = "пусто" Then ActiveSheet.Rows(y).EntireRow.Delete
            If Not sd_nm(y) = "пусто" Then ActiveSheet.Name = sd_nm(y)
        Next
    End With
End Sub
 
Msi2102, Спасибо большое за ваши умения и создание такого чуда.
Страницы: 1
Читают тему
Наверх