Search code examples
vbaexcelpage-break

Add page break every x rows after specific value excel vba


I'm having a hard time to figure out how to combine two macros I have (see below). What I would like to achieve is to automatically insert a pagebreak every (lets say) 80 rows. Now comes the part that I can't seem to manage.

After every 80 rows it will search up to the first specific search value "total" in column H and add the page break, so the pagebreak in row 80 can only change to less (e.g. row 75). The thing is that in the range of 80 rows there are multiple "total". So it must search for the last "total" before row 80.

After it finds the last "total" in the first 80 rows it must do the same for the next 80 rows. So if the pagebreak is in row 75, the next range must search until row 155 and do the same again, etc.

I have two individual codes that work. The first one adds a pagebreak every 80 rows.

The second one searches for ALL the values "total". So now there are pagebreaks in row 30, 42, 75 (these values are different every proyect) and I only want the last one closest row 80.

This is the first code I found:

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

Lastrow1 = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, _  
LookIn:=xlValues, SearchDirection:=xlPrevious).row
Worksheets("sheet1").PageSetup.PrintArea = "$B11:$L" & Lastrow1 + 1

Dim Lastrow As Long
Dim Row_Index As Long
Dim RW As Long

RW = 80

With ActiveSheet
    .ResetAllPageBreaks
    Lastrow = .Cells(rows.Count, "H").End(xlUp).row + 1
    For Row_Index = RW + 1 To Lastrow Step RW
        .HPageBreaks.Add Before:=.Cells(Row_Index, 1)
    Next
End With

With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With

This is the second code:

With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With

Lastrow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, _ 
LookIn:=xlValues, SearchDirection:=xlPrevious).row
Worksheets("sheet1").PageSetup.PrintArea = "$B11:$L" & Lastrow + 1

Dim row As Range

ActiveSheet.ResetAllPageBreaks

For Each row In ActiveSheet.UsedRange.rows
    Select Case row.Cells(8).Text
    Case "Total:"
        ActiveSheet.HPageBreaks.Add Before:=row.Cells(1).Offset(6, 0)
    End Select
Next row

With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With

I hope I explained my problem correctly. Thank you for your time.


Solution

  • Sub Macro1() 
        Dim lastrow As Long, rngTemp As Range 
    
        lastrow = Range("H1").Offset(Rows.Count - 1).End(xlUp).Row 
        Set rngTemp = Range("H1") 
    
        Do While rngTemp.Row <> lastrow 
            Set rngTemp = Range("H1", rngTemp.Offset(80)).Find(What:="Total", SearchDirection:=xlPrevious) 
            rngTemp.Parent.HPageBreaks.Add Before:=rngTemp.Offset(1, -7) 
        Loop 
    End Sub