I've no idea if this will work, just wanted to test something I saw on another question yesterday. If you test it, please run it in a copy of your workbook in case it goes horribly wrong!
Update
I've tested it (just using a column of random numbers > 0) and it does work.
Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer)
Dim rgPick As Range
Dim vaPick As Variant
Dim rgPrint As Range
Dim vaPrint As Variant
Dim Row As Integer
Set rgPick = Range(Cells(4, ColPick), Cells(2873 + 1, ColPick))
vaPick = rgPick.Value
Set rgPrint = Range(Cells(4, ColPrint), Cells(2873 + 1, ColPrint))
vaPrint = rgPrint.Value
For Row = LBound(vaPick) To UBound(vaPick) - 1
vaPrint(Row + 1, 1) = (vaPick(Row + 1, 1) - vaPick(Row, 1)) / vaPick(Row, 1)
Next Row
rgPrint = vaPrint
End Sub
The Answer I referenced.