It's possible to use a double copy of the alphabet as the starting string, saving the remainder( and the need to use string variables. This saves quite a few bytes.
Input Str1
Prompt R
"ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ans+Ans
For(X,1,length(Str1
Ans+sub(Ans,R+inString(Ans,sub(Str1,X,1)),1
End
sub(Ans,53,X-1
Or to support spaces and other non-alphabetic characters, returning them unchanged:
Input Str1
Prompt R
"ABCDEFGHIJKLMNOPQRSTUVWXYZ
Ans+Ans+Str1→Str2
For(X,1,length(Str1
inString(Str2,sub(Str1,X,1
Str1+sub(Str2,R(Ans<27)+Ans,1→Str1
End
End
sub(Ans,X,X-1