[vba]

Sub Test()
Dim i As Long
Dim LaggedResiduals() As Double
Dim ResidualDifferenceSquared() As Double
Dim SumNumerator As Double
Dim SumDenominator As Double
Dim Durbin
Dim residuals As Range
Dim a As Long, b, c, x, y As Integer 'new /new bits to loop through columns
x = Cells(2, Columns.Count).End(xlToLeft).Column 'new/start at row 2, determines no of columns to calculate
For a = 1 To x 'new
y = Cells(Rows.Count, a).End(xlUp).Row 'new
b = ColumnLetter(a) 'new
c = b & "2:" & b & y 'starts at row 2
SumNumerator = 0
SumDenominator = 0
Set residuals = Range(c) 'new / c is the durbin watson for each column
ReDim LaggedResiduals(1 To residuals.Rows.Count - 1)
ReDim ResidualDifferenceSquared(1 To residuals.Rows.Count - 1)
For i = 1 To residuals.Rows.Count - 1
LaggedResiduals(i) = residuals(i + 1).Value
ResidualDifferenceSquared(i) = (residuals(i).Value - LaggedResiduals(i)) ^ 2
SumNumerator = SumNumerator + ResidualDifferenceSquared(i)
'MsgBox LaggedResiduals(i) & " " & ResidualDifferenceSquared(i) & " " & SumNumerator
Next i
For i = 1 To residuals.Rows.Count
SumDenominator = SumDenominator + residuals(i).Value ^ 2
Next i
Durbin = SumDenominator / SumNumerator
Range(b & "15").Value = SumNumerator / SumDenominator 'new , returns result in this row
'Next a 'new/calculate next column in the range
End Sub

'-----------------------------------------------------------------
Function ColumnLetter(Col As Long)
'-----------------------------------------------------------------
Dim sColumn As String
On Error Resume Next
sColumn = Split(Columns(Col).Address(, False), ":")(1)
On Error GoTo 0
ColumnLetter = sColumn
End Function
[/vba]