As close as possible to your code:
Function ShiftVector(rng As Range, n As Long)
Dim i As Long, nr As Long, b() As Variant
nr = rng.Rows.Count
ReDim b(nr, 1) As Variant
For i = 1 To n
b(nr - n + i, 1) = rng.Cells(i, 1)
Next i
For i = n + 1 To nr
b(i - n, 1) = rng.Cells(i, 1)
Next i
ShiftVector = b()
End Function
Further hints
Assuming the above question is an exercise, you might consider the above code as learning chance and compare it to your original code. Generally I'd prefer @ScottCraner 's approach looping through a 2-dimensional array which isn't as time consuming as looping through a range by means of VBA, at least for greater data sets.
It's better to declare counters for such data as Long instead of Integer as today's range rows (1048576, earlier 65k) exceed the Integer data limit (-32,768 to 32,767) by far.
You don't need to transpose the b array as it's already 2 dimensional and can be inserted as vertical data set.
Suggestion for improvement
You can assign a whole data set to a 2-dim (1-based) array, e.g. as follows
Dim tmp As Variant
tmp = rng.Value
By changing the range offset you can shift up the main part of data automatically (preserving the same range size):
tmp = rng.Offset(n).Value
This allows you to re-enter only n "wrap around" data to the bottom of the prefilled tmp array:
Example function
Function SV(rng As Range, n As Long)
'a) get main part (starting n rows higher)
Dim tmp As Variant
tmp = rng.Offset(n) ' shift up vertically (by n rows)
'b) get "wrap around" part of n first rows
Dim wrap
wrap = rng.Resize(n, 1) ' assign to temporary array
'c) enter "wrap around" values to n bottom rows
Dim i As Long
For i = 1 To n
tmp(UBound(tmp) - n + i, 1) = wrap(i, 1)
Next i
'c) return rearranged array as function result
SV = tmp
End Function