Примерно так должно работать:
Sub TabIntercept()
Const TAB_ORDER As String = "B3,B8,D3,E3,E6" 'entry cell addresses in tab order
Dim arr, a, x, nxt, sel
If TypeName(Selection) <> "Range" Then Exit Sub 'Exit if (eg) a shape is selected
Set sel = Selection.Cells(1) 'if multiple cells selected use the first...
arr = Split(TAB_ORDER, ",")
For x = LBound(arr) To UBound(arr)
If sel.Address(False, False) = arr(x) Then
'loops back to start if at end...
nxt = IIf(x = UBound(arr), LBound(arr), x + 1)
Range(arr(nxt)).Select
Exit For
End If
Next x
End Sub
РЕДАКТИРОВАТЬ : использование именованных диапазонов будет очень похоже -
Sub TabIntercept2()
Const TAB_ORDER As String = "tabs1,tabs2,tabs3,tabs4,tabs5" 'as named ranges
Dim arr, a, x, nxt, sel
If TypeName(Selection) <> "Range" Then Exit Sub 'Exit if (eg) a shape is selected
Set sel = Selection.Cells(1) 'if multiple cells selected use the first...
arr = Split(TAB_ORDER, ",")
For x = LBound(arr) To UBound(arr)
If sel.Address() = sel.Parent.Range(arr(x)).Address() Then
'loops back to start if at end...
nxt = IIf(x = UBound(arr), LBound(arr), x + 1)
sel.Parent.Range(arr(nxt)).Select
Exit For
End If
Next x
End Sub