Hi GioP ,
See the code below , taken from the following link :
http://www.erlandsendata.no/english/index.php?d=envbaprintmultirange
Sub PrintSelectedCells()
' prints selected cells, use from a toolbar button or a menu
Dim aCount As Integer, cCount As Integer, rCount As Integer
Dim i As Integer, j As Long, aRange As String
Dim rHeight() As Single, cWidth() As Single
Dim AWB As Workbook, NWB As Workbook
Dim addresses_array() As String
Dim r1 As Range, r2 As Range
If UCase(TypeName(ActiveSheet)) <> "WORKSHEET" Then Exit Sub
' useful only in worksheets
aCount = Selection.Areas.Count
If aCount = 0 Then Exit Sub ' no cells selected
cCount = Selection.Areas(1).Cells.Count
If aCount > 1 Then ' multiple areas selected
Application.ScreenUpdating = False
Application.StatusBar = "Printing " & aCount & " selected areas..."
Set AWB = ActiveWorkbook
rCount = ActiveSheet.Cells.SpecialCells(xlLastCell).Row
cCount = ActiveSheet.Cells.SpecialCells(xlLastCell).Column
ReDim rHeight(rCount)
ReDim cWidth(cCount)
ReDim addresses_array(1 To aCount)
For i = 1 To aCount
addresses_array(i) = Selection.Areas(i).Address
Next
For i = 1 To rCount
' find the row height of every row in the selection
rHeight(i) = Rows(i).RowHeight
Next i
For i = 1 To cCount
' find the column width of every column in the selection
cWidth(i) = Columns(i).ColumnWidth
Next i
Set NWB = Workbooks.Add ' create a new workbook
For i = 1 To rCount ' set row heights
Rows(i).RowHeight = rHeight(i)
Next i
For i = 1 To cCount ' set column widths
Columns(i).ColumnWidth = cWidth(i)
Next i
For i = 1 To aCount
AWB.Activate
aRange = addresses_array(i)
Range(aRange).Copy ' copying the range
NWB.Activate
With ActiveCell ' pastes values and formats
.PasteSpecial Paste:=xlValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
.PasteSpecial Paste:=xlFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
End With
Application.CutCopyMode = False
ActiveSheet.Range("A1"
![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
.Select
ActiveCell.Cells(ActiveSheet.Rows.Count, "A"
![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
.End(xlUp).Offset(1, 0).Select
Next i
NWB.PrintOut
NWB.Close False ' close the temporary workbook without saving
Application.StatusBar = False
AWB.Activate
Set AWB = Nothing
Set NWB = Nothing
Else
If cCount < 10 Then ' less than 10 cells selected
If MsgBox("Are you sure you want to print " & _
cCount & " selected cells ?", _
vbQuestion + vbYesNo, "Print celected cells"
![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
= vbNo Then Exit Sub
End If
Selection.PrintOut
End If
End Sub
Private Sub CommandButton1_Click()
Dim Range_1 As Range
Dim Range_2 As Range
Dim LastRow As Long
LastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "D"
![Wink ;) ;)](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
.End(xlUp).Row
Set Range_1 = Range("$A$1:$M$" & LastRow)
Set Range_2 = Range("$A$315:$M$321"
Union(Range_1, Range_2).Select
Call PrintSelectedCells
End Sub
The procedure called CommandButton1_Click is a sort of test procedure , where I am concatenating two non-contiguous ranges ; in your case Range_1 will be the dynamic table ; Range_2 is the fixed range to be added to the end of the dynamic table.
The PrintSelectedCells procedure expects you to have already selected the print area before it is called ; this is the reason for the statement :
Union(Range_1, Range_2).Select
Let me know if you have any problem.
Narayan