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