Hola:
No se si tienes alguna razón especial para no utilizar el GOTO personalmente pienso que las funciones recursivas deben utilizarse con mucho cuidado porque tienden a agotar el espacio de pila y a meterse en bucles complicados.
Si estás empezando, creo que con el GOTO lo vas a ver mucho mas claro.
Te dejo tu ejemplo corregido para que veas como funciona.
Código:
Sub ejemplo()
Arriba:
x = InputBox("escribe un numero")
' Si es nulo, salimos de la rutina
If x = "" Then Exit Sub
' Si no es un número avisamos y volvemos arriba
If Not IsNumeric(x) Then
MsgBox "Ingresa Solo Numeros", 1 + 48
GoTo Arriba
End If
' Si está entre 1 y 10 aplicamos el valor
If x >= 1 And x <= 10 Then
Range("A1").Select
ActiveCell.FormulaR1C1 = x
Else
' En caso contrario avisamos y volvemos arriba
MsgBox "Escoje un numero entre el 1 y el 10 ", 1 + 48
GoTo Arriba
End If
End Sub
Como puedes ver el MsgBox no tiene porque devolver un valor como tu hacías si sólo hay una opción y no deseamos condicionarla.
Saludos