Such encoding, in my opinion is useless because that would be too simple to decode.
Which is why I scrambled the letters to the variable string I called reform$, before "shifting the letters by x locations".
Take the letters A, B, C... throw them in a hat, pull them out 1, 2, 3, ... and reform$ is a shuffle of the original letters$ string.
reform$ = "MOZSTVA... "
Now M codes to O, O codes to Z, Z codes to S.... you have a code.
To code, find the position in the reform$ string of the letter to code,
say A was in the 15th position of reform$ found by INSTR(reform$, "A")
then it's code is in 15th position of code$ is say "F" Mid$(code$, 15, 1)
And vice versa to decode:
The letter position in code$ is the decode position in reform$.
There is no constant distance from one letter to it's code and no letter is coded to itself and NO reverse coding like if A codes to S then S codes to A.
See if this is too simple to decode: (see attachhment)