Почти что в общем виде, с предположением, что высота заменяемых строк в "подвале", равна высоте строк подвала.
Sub AddFooterToExcel()
Try
Dim xls As Excel.Application = Globals.ThisAddIn.Application
Dim ash As Excel.Worksheet = CType(xls.ActiveSheet, Excel.Worksheet)
'ModuleCommon.ClearExcessRowsAndColumns(xls, xls.ActiveWorkbook)
Globals.ThisAddIn.Application.ScreenUpdating = False
Dim sel As Excel.Range = xls.ActiveWindow.Selection
If sel.Areas.Count <> 1 Then
MessageBox.Show("Необходимо выбрать только один блок строк.", "", MessageBoxButtons.OK)
Exit Sub
End If
Dim selrow As Integer = sel.Areas(1).Row
Dim selcou As Integer = sel.Areas(1).Rows.Count
Dim pagecou As Integer = ash.HPageBreaks.Count
If pagecou = 0 Then Exit Sub
Dim item1 As Excel.HPageBreak = ash.HPageBreaks(1)
Dim item1row As Integer = item1.Location.Row
If selrow + selcou <> item1row Then
MessageBox.Show("Нижняя строка выбранного для ""подписи"" блока строк должна быть нижней строкой первой страницы.", "", MessageBoxButtons.OK)
Exit Sub
End If
With ash.Rows((selrow).ToString).EntireRow.Borders(Excel.XlBordersIndex.xlEdgeTop)
.LineStyle = Excel.XlLineStyle.xlDouble
.ColorIndex = 0
.TintAndShade = 0
.Weight = Excel.XlBorderWeight.xlThin
End With
Dim n As Integer = ash.HPageBreaks.Count
Dim ii As Integer = 2
Do While ii <= ash.HPageBreaks.Count
Dim row As Integer = ash.HPageBreaks(ii).Location.Row
For iii As Integer = 0 To selcou - 1
ash.Cells(row - selcou, 1).EntireRow.insert()
Next
Dim selrange As Excel.Range = xls.Rows((selrow).ToString + ":" + (selrow + selcou - 1).ToString).EntireRow
selrange.Copy()
ash.Cells(row - selcou, 1).PasteSpecial(Excel.XlPasteType.xlPasteValues)
ash.Cells(row - selcou, 1).PasteSpecial(Excel.XlPasteType.xlPasteFormats)
ii += 1
Loop
' все сделали и давай посмотрим сколько сейчас страниц
Dim nn As Integer = ash.HPageBreaks.Count
Dim lselrange As Excel.Range = xls.Rows((selrow).ToString + ":" + (selrow + selcou - 1).ToString).EntireRow
lselrange.Copy()
Dim ur As Excel.Range = ash.UsedRange
Dim lr As Integer = ur.Row + ur.Rows.Count - 1
ash.Cells(lr + 1, 1).PasteSpecial(Excel.XlPasteType.xlPasteValues)
ash.Cells(lr + 1, 1).PasteSpecial(Excel.XlPasteType.xlPasteFormats)
' еще добавили и давай снова посмотрим сколько сейчас страниц
Dim nnn As Integer = ash.HPageBreaks.Count
If nn <> nnn Then
Dim flr As Integer = ash.HPageBreaks(nnn).Location.Row
For iii As Integer = 0 To selcou - 1
ash.Cells(flr - selcou, 1).EntireRow.insert()
Next
Dim selrange As Excel.Range = xls.Rows((selrow).ToString + ":" + (selrow + selcou - 1).ToString).EntireRow
selrange.Copy()
ash.Cells(flr - selcou, 1).PasteSpecial(Excel.XlPasteType.xlPasteValues)
ash.Cells(flr - selcou, 1).PasteSpecial(Excel.XlPasteType.xlPasteFormats)
End If
Catch ex As Exception
Globals.ThisAddIn.Application.ScreenUpdating = True
Exit Sub
Finally
Globals.ThisAddIn.Application.ScreenUpdating = True
End Try
End Sub