JDTTEK,
All of the above suggestions are quite reasonable options.
However, because you used the term "dynamic", I thought I would offer the following routine, which you might agree is "dynamic".
PREFACE
======
This routine is different in that it employs the use of "Range Names". You might already be aware of the value of using Range Names, but for the benefit of "anyone" reading this, here's the primary reason to use range names.
Internally, whenever a column or row is inserted "within" the existing boundaries of a range name, Excel automatically adjusts the coordinates of the range name. Therefore, VBA code that uses these range names will NOT require modification each time columns or rows are inserted, or when data is moved from one location to another. In manipulating blocks of data, whether it be in sorting, extracting or moving the data, employing range names in VBA is EXTREMELY useful.
Because a block of data can "grow" not just by the number of rows, but also by having to add more COLUMNS, the following routine makes provision for easily adjusting for these extra columns - for those cases where the extra columns need to be added "outside" (to the right of) the existing named range. As previously mentioned, because these extra columns are "outside" the existing range name, the range name would NOT automatically be adjusted. In the following routine, it employs the use of another range name ("endcolm"

which is assigned to a cell in the last column of the data range. After adding the extra column(s), it's just a matter of re-assigning the one range name ("endcolm"

to any cell in the last column. The range name being used in this routine to define the data range is simply "data".
ROUTINE
=======
Sub Reset_DataRange()
Application.ScreenUpdating = False
Application.Goto Reference:="data"
firstcell = ActiveCell.Address
cur_colm = ActiveCell.Column
end_colm = Range("endcolm"

.Column - cur_colm
lastcell = Cells(65536, cur_colm).End(xlUp).Offset(0, end_colm).Address
setrange = firstcell & ":" & lastcell
Range(setrange).Name = "data"
Application.Goto Reference:="R1C1"
Application.ScreenUpdating = True
End Sub
As you'll see when you use this routine, it won't matter where your "data" range is located - i.e. it can start and end in "any" column.
The end "row" will be determined by the last used cell in the first column of your "data" range.
"End_(xlDown)" is an "option" to determine the last used row. However, it requires that there be no BLANK cell(s) in the first column of your data.
I hope this helps you in meeting your "dynamic" objective.

Please advise as to how you make out.
Regards, ...Dale Watson
HOME: nd.watson@shaw.ca
WORK: dwatson@bsi.gov.mb.ca