Pasting Values To/From a Calculation Model
Excel is not a database

I cannot stress this strongly enough. Excel has many excellent uses, but please don't ever get in the habit of thinking that it is a viable alternative to a proper Database.



Never assume that you know where the performance bottleneck is

If you could accurately forecast where a performance bottleneck would be, then you wouldn't have an unbearably slow Macro in the first place. 

Rule #1 of performance increases is to benchmark everything, because it will never be where you thought it would be.



Poor man's VBA benchmarking (only accurate to the nearest 1/100th of a second):

Public Sub SplitTimer(ByVal printMessage As String, ByRef oldTimer As Double)
    '/ prints message and time diff between current timer and previous timer
    '/ then updates previous timer with current timer

    Dim currentTimer As Double
    currentTimer = Timer()

    Debug.Print printMessage &amp; " - " &amp; (currentTimer - oldTimer) &amp; " s"

    oldTimer = currentTimer

End Sub


Then, in your Macros:

    Dim timerStore As Double
    timerStore = Timer()

    ws2.Range("B3").Value = ws1.Range("D" &amp; i).Value
    SplitTimer "B3", timerStore

    ws2.Range("B4").Value = ws1.Range("E" &amp; i).Value
    SplitTimer "B4", timerStore

    ws2.Range("B5").Value = ws1.Range("F" &amp; i).Value
    SplitTimer "B5", timerStore

    ws2.Range("B6").Value = ws1.Range("G" &amp; i).Value
    SplitTimer "B6", timerStore


And so on. You'll then get a list of how long each section of your code took to execute. In general, there will be one section that's responsible for ~98% of the runtime:

'/ (hypothetical output)
B3 - 1.40625 s
B4 - 0 s
B5 - 0 s
B6 - 0.041796875 s


Take that operation, split it into smaller pieces, benchmark. Repeat until you've found the source of your slow runtime. Then you can experiment yourself, or take that very specific opeation to SO for performance ideas.



In your specific case, I have a hunch. 

Copy/Pasting actually doesn't take a lot of time (per operation). 20 operations in 2 minutes, I'd expect it to be less than 1% of runtime. What takes time is all the Events that trigger when you change a worksheet.

In particular, every calculation is going to re-calculate every time you paste a new value in.  

Try this:

Application.Calculation = xlCalculationManual

For i = 4 To selection

    '/ Paste operations

    '/ Paste operations

    '/ Paste operations

    Application.Calculate '/ we only calculate once per iteration, when everything's set up and ready.

    ws1.Range("AO" &amp; i).Value = ws2.Range("M4").Value

Next i


And see if it makes a noticeable difference to your performance.