And here's one that will rotate a 2D Array in either dimension. With comments!

Function Rotate2DArrayX(aRotateMeRange As Range, iVRotateBy As Integer, iHRotateBy As Integer) As Variant

On Error Resume Next

'Array sizing variables

Dim dHMax As Double

Dim dHMin As Double

Dim dVMax As Double

Dim dVMin As Double

Dim dHSize As Double

Dim dVSize As Double

'Output Arrays

Dim aOutput As Variant

Dim aIntermediate As Variant

Dim aIntermediate2 As Variant

'Turn Input Range into Array

aIntermediate = aRotateMeRange.Value

'Check that the rotate numbers are valid

If iVRotateBy < 0 Then Exit Function

If iHRotateBy < 0 Then Exit Function

'How big is the input Array?

'Horizontal Size

dHMax = UBound(aIntermediate, 2)

dHMin = LBound(aIntermediate, 2)

dHSize = dHMax - dHMin

'Vertical Size

dVMax = UBound(aIntermediate, 1)

dVMin = LBound(aIntermediate, 1)

dVSize = dVMax - dVMin

'Make the second intermediate array the right size. The second intermediate array is

'necessary in order to have an array running from 0 to N so that the Mod function works.

ReDim aIntermediate2(dVSize, dHSize)

For i = 0 To dVSize

For j = 0 To dHSize

aIntermediate2(i, j) = aIntermediate(i + 1, j + 1)

Next

Next

'Rotate Intermediate2 into Output Array

ReDim aOutput(dVSize, dHSize)

For i = 0 To dVSize

For j = 0 To dHSize

aOutput(i, j) = aIntermediate2(((i + iVRotateBy) Mod (dVSize + 1)), ((j + iHRotateBy) Mod (dHSize + 1)))

Next

Next

Rotate2DArrayX = aOutput

End Function