patternMinor
Simple Caesar Cipher Function
Viewed 0 times
caesarsimplefunctioncipher
Problem
For no particular reason, I wanted to create a function that would take a string and "encrypt" it via Caesar cipher. This function takes a string and shifts the letters left or right (in the alphabet) depending on the input. Shift right(2) for instance would be -
The UDF:
The shifting functions:
```
Private Function ShiftLeft(ByVal ShiftString As String, ByVal ShiftQuantity As Long) As String
Dim TextLength As Long
TextLength = Len(ShiftString)
Dim CipherText As String
Dim Character
ABCDEFGHIJKLMNOPQRSTUVWXYZ
CDEFGHIJKLMNOPQRSTUVWXYZABThe UDF:
Option Explicit
Public Function CaesarCipher(ByVal TextToEncrypt As String, ByVal CaesarShift As Long) As String
'Positive means shift to right e.g. "A" Shift 1 returns "B"
Dim IsPositive As Boolean
IsPositive = True
If CaesarShift 26 Then
CaesarShift = CaesarShift Mod 26
End If
If IsPositive Then
OutputText = ShiftRight(TextToEncrypt, CaesarShift)
Else: OutputText = ShiftLeft(TextToEncrypt, CaesarShift)
End If
CaesarCipher = OutputText
End FunctionThe shifting functions:
Private Function ShiftRight(ByVal ShiftString As String, ByVal ShiftQuantity As Long) As String
Dim TextLength As Long
TextLength = Len(ShiftString)
Dim CipherText As String
Dim CharacterCode As Long
Dim AsciiIndex As Long
Dim AsciiIdentifier() As Long
ReDim AsciiIdentifier(1 To TextLength)
For AsciiIndex = 1 To TextLength
CharacterCode = Asc(Mid(ShiftString, AsciiIndex, 1))
If CharacterCode + ShiftQuantity > 90 Then
CharacterCode = CharacterCode - 26 + ShiftQuantity
ElseIf CharacterCode = 32 Then GoTo Spaces
Else: CharacterCode = CharacterCode + ShiftQuantity
End If
Spaces:
AsciiIdentifier(AsciiIndex) = CharacterCode
Next
For AsciiIndex = 1 To TextLength
CipherText = CipherText & Chr(AsciiIdentifier(AsciiIndex))
Next
ShiftRight = CipherText
End Function```
Private Function ShiftLeft(ByVal ShiftString As String, ByVal ShiftQuantity As Long) As String
Dim TextLength As Long
TextLength = Len(ShiftString)
Dim CipherText As String
Dim Character
Solution
Just some things that jump out at me:
Standard VBA Naming conventions have
I would probably use
versus
Other than that, your naming is pretty solid.
Why separate functions for
Standard VBA Naming conventions have
camelCase for local variables, and PascalCase only for sub/function names and Module/Global Variables. This allows you to tell at a glance if the variable you're looking at is local to your procedure, or coming from somewhere else.I would probably use
EncryptUsingCaesarCypher as your function name. It's more descriptive and closer to what it actually does.`Text = CaesarCypher(text)versus
`Text = EncryptUsingCaesarCypher(text)Other than that, your naming is pretty solid.
Why separate functions for
ShiftLeft and ShiftRight? The code in both is heavily-repeated and could be easily combined into a Shift(ByVal shiftValue as Long) function that handles positive and negative. This also lets you cut out all that messing around with isPositve and Abs(shift)Code Snippets
`Text = CaesarCypher(text)`Text = EncryptUsingCaesarCypher(text)Context
StackExchange Code Review Q#118247, answer score: 5
Revisions (0)
No revisions yet.