VBA Strings
The String data type represents text. A string is an array of characters. VBA strings use 16-bit Unicode characters. VBA has a built-in Strings module with functions for manipulating strings. Efficiency is an important topic when it comes to dealing with strings.
String Literals
String literals are used to represent strings in code. Text surrounded by double quotes represents a string literal in VBA.
Public Sub Example()
Debug.Print "Hello, World!" 'Prints: Hello, World!
End Sub
To create a string literal that contains double quotes, use double double quotes.
Public Sub Example()
Debug.Print "Hello, World!" 'Prints: Hello, World!
Debug.Print """Hello, World!""" 'Prints: "Hello, World!"
Debug.Print "Hello, ""World""!" 'Prints: Hello, "World"!
Debug.Print """" 'Prints: "
Debug.Print """""" 'Prints: ""
End Sub
String Type Conversion
To explicitly convert a value to a string use the CStr function. The Str function can be used to convert a number to a string. The Str function only recognizes the period as a decimal place, so when working with international numbers where the decimal may be a comma, use the CStr function.
Public Sub Example()
Dim S As String
S = CStr(350) ' -> "350"
S = CStr(3.5) ' -> "3.5"
S = CStr(True) ' -> "True"
S = CStr(#1/1/2021#) ' -> "1/1/2021"
S = CStr(3.5@) ' -> "3.5"
End Sub
String Concatenation
Both the & and + operators can be used to concatenate strings in VBA. Using the & operator will implicitly convert non-string values to strings. Using the + operator will not implicitly convert non-strings to strings. Trying to concatenate a string value with a non-string value using + will cause a type mismatch error. The CStr function can be used to explicitly convert non-string values to strings. There is no significant difference in speed between using & and +.
Public Sub Example()
Debug.Print "Hello, " + "World!"
'Debug.Print "Hello, " + 1 'Causes Error
Debug.Print "Hello, " + Cstr(1)
End Sub
Public Sub Example()
Debug.Print "Hello, " & "World!"
Debug.Print "Hello, " & 1
Debug.Print "Hello, " & Cstr(1) 'Not necessary to use CStr with &
End Sub
Variable-Length Strings
Variable-Length Strings can hold a large number of characters (2 ^ 31). The size of a Variable-Length String is determined by the number of characters in the String. The Len and LenB functions can be used to return the number of characters and bytes respectively in a String.
Public Sub Example()
Dim S As String
S = "Hello, World!"
Debug.Print S
Debug.Print Len(S)
Debug.Print LenB(S)
End Sub
Fixed-Length Strings
Fixed-length strings are given a specific length at design-time when they are declared which cannot be altered at run-time. When a string is too long to fit in the fixed-length string it will be truncated. When a string is shorter than the fixed-length string the remaining space will be set to space characters (Chr 32). An uninitialized fixed-length string will be all null characters (Chr 0) for the length of the string. Fixed-Length strings can store from 1 to 65,535 characters. The Len and LenB functions can be used to get the length of a string in terms of characters and bytes respectively.
Public Sub Example()
Dim S As String * 10
S = "Hello, World!"
Debug.Print """" & S & """" 'Prints: "Hello, Wor"
S = "ABCD"
Debug.Print """" & S & """" 'Prints: "ABCD "
Debug.Print Len(S)
Debug.Print LenB(S)
End Sub
Byte Arrays
Byte arrays and Strings are interchangeable. Byte Arrays can be assigned directly to Strings and Strings can be assigned directly to Byte Arrays.
Public Sub Example()
Dim S As String
S = "Hello, World!"
Dim Arr() As Byte
Arr = S
Debug.Print Arr
End Sub
VBA Strings use two bytes to store each character so every two bytes in a byte array represents one character. Most common characters only require one byte to store and thus the second byte will be zero.
Public Sub Example()
Dim Arr(0 To 9) As Byte
Arr(0) = 72
Arr(1) = 0
Arr(2) = 101
Arr(3) = 0
Arr(4) = 108
Arr(5) = 0
Arr(6) = 108
Arr(7) = 0
Arr(8) = 111
Arr(9) = 0
Debug.Print Arr 'Prints: Hello
End Sub
String Comparison
Strings can be compared using comparison operators or the StrComp function.
Comparison Operators
Strings can be compared in VBA using comparison operators: =, >, <, >=, <=, <>, Like. Comparing strings using comparison operators will return True or False. The compare method used to compare strings when using comparison operators is determined by the Option Compare statement. The Option Compare statement can specify Binary or Text. Binary comparison compares the binary representations of each character. Because the binary representations of uppercase and lowercase characters differ, binary comparison is case-sensitive. Text comparison compares characters using the case-insensitive sort order determined by the system's locale. In Microsoft Access, Database comparison can be used to compare strings based on the sort order given the locale ID of the database where strings are being compared. If no Option Compare statement is specified the default comparison method is Binary comparison.
Option Compare Binary
Public Sub Example()
Debug.Print "A" = "a" 'Prints: False
End Sub
Option Compare Text
Public Sub Example()
Debug.Print "A" = "a" 'Prints: True
End Sub
StrComp Function
The StrComp function can be used to compare two strings. The function takes two string arguments and an optional compare method argument (vbBinaryCompare, vbDatabaseCompare, or vbTextCompare). If no compare argument is specified then the Option Compare statement determines the compare method. The function can return 1, 0, -1, or Null depending on the result of the comparison. The StrComp function is the most explicit way to compare strings because the function can take the compare method as an explicit argument instead of relying on the Option Compare statement.
Syntax: StrComp(string1, string2, [compare])
Result | Return Value |
---|---|
string1 < string2 | -1 |
string1 = string2 | 0 |
string1 > string2 | 1 |
string1 = Null Or string2 = Null | Null |
Public Sub Example()
Debug.Print StrComp("A", "a", vbTextCompare) = 0 'Prints: True
End Sub
Mid
The Mid function can be used to retrieve sections of a string, iterate over each individual character in a string, and to assign sections of a string without reallocating an entirely new string. Using Mid to alter strings is faster than allocating new strings.
Public Sub Example()
Dim S As String
S = "Hello, World!"
'Get slice of string
Debug.Print Mid$(S, 1, 2)
'Loop over each character
Dim i As Long
For i = 1 To Len(S)
Debug.Print Mid$(S, i, 1)
Next i
'Reassign character
Mid(S, 1, 1) = "A"
Debug.Print S 'Prints: Aello, World!
End Sub
StrConv
The StrConv function can be used to convert a string's case and encoding.
Constant | Value | Description |
---|---|---|
vbUpperCase | 1 | Converts the string to uppercase characters. |
vbLowerCase | 2 | Converts the string to lowercase characters. |
vbProperCase | 3 | Converts the first letter of every word in a string to uppercase. |
vbWide* | 4 | Converts narrow (single-byte) characters in a string to wide (double-byte) characters. |
vbNarrow* | 8 | Converts wide (double-byte) characters in a string to narrow (single-byte) characters. |
vbKatakana** | 16 | Converts Hiragana characters in a string to Katakana characters. |
vbHiragana** | 32 | Converts Katakana characters in a string to Hiragana characters. |
vbUnicode | 64 | Converts the string to Unicode using the default code page of the system. (Not available on the Macintosh.) |
vbFromUnicode | 128 | Converts the string from Unicode to the default code page of the system. (Not available on the Macintosh.) |
*Applies to East Asia locales. **Applies to Japan only.
Public Sub Example()
Debug.Print StrConv("hello, world!", vbProperCase) 'Prints: Hello, World!
End Sub
Public Sub Example()
Dim Arr(0 To 4) As Byte
Arr(0) = 72
Arr(1) = 101
Arr(2) = 108
Arr(3) = 108
Arr(4) = 111
Debug.Print StrConv(Arr, vbUnicode) 'Prints: Hello
End Sub
LSet and Rset
LSet and RSet can be used to assign strings while aligning the text to the left or right of the string. LSet and RSet are used with fixed-length strings and strings that are already assigned so that they have a specific length. There is some performance improvement using LSet and RSet compared to normal string assignment. Any unassigned characters will be filled with space characters. If the string is longer than the string variable it will be truncated.
Public Sub Example()
Dim S As String
S = Space$(10)
LSet S = "Hello"
Debug.Print """" & S & """" 'Prints: "Hello "
RSet S = "Hello"
Debug.Print """" & S & """" 'Prints: " Hello"
End Sub
Public Sub Example()
Dim S As String * 10
LSet S = "Hello"
Debug.Print """" & S & """" 'Prints: "Hello "
RSet S = "Hello"
Debug.Print """" & S & """" 'Prints: " Hello"
End Sub
Cleaning Text
Text may contain characters that need to be removed. Extra spaces, non-printable characters, non-breaking spaces, and new line characters are some examples of characters that may need to be removed from text.
Trimming Text
The Trim functions can be used to remove leading spaces, trailing spaces, or both from a string.
Public Sub Example()
Dim S As String
S = " Hello, World! "
Debug.Print """" & LTrim$(S) & """" 'Prints: "Hello, World! "
Debug.Print """" & RTrim$(S) & """" 'Prints: " Hello, World!"
Debug.Print """" & Trim$(S) & """" 'Prints: "Hello, World!"
End Sub
The VBA Trim function does not remove extra consecutive spaces in the middle of a String. To accomplish this, use a user-defined function.
Public Function TrimAll(S As String) As String
TrimAll = Trim$(S)
Do While InStr(TrimAll, " ") > 0
TrimAll = Replace(TrimAll, " ", " ")
Loop
End Function
Remove Non-Printable Characters
Any character in the ASCII table with a value less than 32 is a non-printable character. Thus, to remove non-printable characters, remove all characters with an ASCII value less than 32.
Public Function RemoveNonPrintableCharacters(S As String) As String
Dim OutString As String
Dim CurrentCharacter As String * 1
Dim i As Long
Dim j As Long
OutString = Space$(Len(S))
For i = 1 To Len(S)
CurrentCharacter = Mid$(S, i, 1)
If Asc(CurrentCharacter) > 31 Then
j = j + 1
Mid$(OutString, j, 1) = CurrentCharacter
End If
RemoveNonPrintableCharacters = Left$(OutString, j)
Next i
End Function
Non-Breaking Spaces
Non-breaking spaces can cause issues when processing text input. Non-breaking spaces appear the same as normal spaces when displayed but they are not the same character. Normal spaces have the value 32 in the ASCII table whereas non-breaking spaces have the value 160 in the ASCII table. It is often beneficial when working with text data to replace non-breaking spaces with normal spaces before doing any other processing on the text.
Public Function ReplaceNonBreakingSpaces(S As String) As String
ReplaceNonBreakingSpaces = Replace(S, Chr(160), Chr(32))
End Function
New Line Characters
New line characters can cause issues with processing text input. It is common when processing text input to replace new line characters with a space character. Depending on the source of the text there could be different new line characters which must be handled in a particular order.
Public Function ReplaceNewLineCharacters( _
S As String, Optional Replacement As String = " ") As String
ReplaceNewLineCharacters = _
Replace(S, vbCrLf, Replacement)
ReplaceNewLineCharacters = _
Replace(ReplaceNewLineCharacters, vbLf, Replacement)
ReplaceNewLineCharacters = _
Replace(ReplaceNewLineCharacters, vbCr, Replacement)
End Function
Formatting Functions
VBA provides useful built-in functions for formatting text.
Format function
The Format/Format$ function is used to format dates, numbers, and strings according to a user-defined or predefined format. Use the $ version of the function to explicitly return a String instead of a Variant/String.
Public Sub Example()
'''Dates
Debug.Print Format$(Now, "mm/dd/yyyy")
Debug.Print Format$(Now, "Short Date")
Debug.Print Format$(Now, "mmmm d, yyyy")
Debug.Print Format$(Now, "Long Date")
Debug.Print Format$(Now, "Long Time")
'''Numbers
Debug.Print Format$(2147483647, "#,##0")
Debug.Print Format$(2147483647, "Standard")
Debug.Print Format$(2147483647, "Scientific")
'''Strings
'Fill from right to left
Debug.Print Format$("ABCD", "'@@_@@_@@'")
'Fill from left to right
Debug.Print Format$("ABCD", "!'@@_@@_@@'")
'Lower case
Debug.Print Format$("ABCD", "<'@@_@@_@@'")
'Upper case
Debug.Print Format$("ABCD", ">'@@_@@_@@'")
'No spaces for missing characters
Debug.Print Format$("ABCD", "'&&_&&_&&'")
'Escape double quotes
Debug.Print Format$("ABCD", "!\""@@_@@_@@\""")
End Sub
Number Formats
To retrieve a string representing a number in a specific format use one of the number format functions.
Function | Description |
---|---|
FormatCurrency | Returns a formatted currency as a string using the currency symbol defined in the system control panel. |
FormatDateTime | Returns a formatted date as string. |
FormatNumber | Returns a formatted number as a string. |
FormatPercent | Returns a formatted percentage as a string. |
Character Constants
Character Constants are constants used to represent certain special characters. Character constants are defined in the built-in VBA.Constants module.
VBA Constant | Character Code | Description |
---|---|---|
vbCr | 13 | Carriage Return |
vbLf | 10 | Line Feed |
vbCrLf | 13 + 10 | Carriage Return + Line Feed |
vbNewLine | vbCrLf on Windows or vbLf on Mac | New Line Character for current platform |
vbNullChar | 0 | Null Character |
vbNullString | N/A | String pointer to null. vbNullString is equal to an empty string ("") when compared but they are different. vbNullString takes less memory because it is only a pointer to null. An empty string is a string with its own location allocated in memory. vbNullString is clearer in meaning than an empty string and should generally be preferred. However, vbNullString cannot be passed to DLLs. Empty strings must be passed to DLLs instead. |
vbTab | 9 | Tab Character |
vbBack | 8 | Backspace Character |
vbFormFeed | 12 | Not useful on Windows or Mac. |
vbVerticalTab | 11 | Not useful on Windows or Mac. |
Built-in Strings Module Functions
Member | Description |
---|---|
Asc | Returns the character code of the first letter in a string. |
AscB | Returns the first byte of a string. |
AscW | Returns the Unicode character code when Unicode is supported. If Unicode is not supported it works the same as Asc. *Do not use on Mac. **AscW only Works properly up to 32767 and then returns negative numbers. This problem occurs because Unicode characters are represented by unsigned 16-bit integers and VBA uses signed 16-bit integers. See the wrapper functions below to correct for this problem. |
Chr | Returns a character given a character code. Returns a Variant/String. |
Chr$ | Returns a character given a character code. Returns a String. |
ChrB | Returns a single-byte string representing a character given a character code. Returns a Variant/String. *Try StrConv(ChrB(65),vbUnicode) |
ChrB$ | Returns a single-byte string representing a character given a character code. Returns a String. *Try StrConv(ChrB$(65),vbUnicode). |
ChrW | Returns a character given a Unicode character code if Unicode is supported. If Unicode is not supported it is the same as Chr. Returns Variant/String. *Do not use ChrW on a Mac. |
ChrW$ | Returns a character given a Unicode character code if Unicode is supported. If Unicode is not supported it is the same as Chr$. Returns String. *Do not use ChrW$ on a Mac. |
Filter | Returns an array containing a filtered subset of a string array. |
Format | Returns a string formatted by a given a format expression. Returns Variant/String. |
Format$ | Returns a string formatted by a given a format expression. Returns String. |
FormatCurrency | Returns a string formatted as a currency. Uses the currency symbol defined in the system control panel. |
FormatDateTime | Returns a string formatted as a date or time. |
FormatNumber | Returns a string formatted as a number. |
FormatPercent | Returns a string formatted as a percentage. |
InStr | Returns the position of the first occurrence of one string within another string. |
InStrB | Returns the byte position of the first occurrence of one string within another string. |
InStrRev | Returns the position of an occurrence of one string within another string starting from the end of the string and searching toward the start of the string. |
Join | Returns a string containing the elements of an array joined together by a delimiter. |
LCase | Returns a string converted to lowercase. Returns Variant/String. |
LCase$ | Returns a string converted to lowercase. Returns String. |
Left | Returns a substring of a given length from the left side of a string. Returns Variant/String. |
Left$ | Returns a substring of a given length from the left side of a string. Returns String. |
LeftB | Returns a substring of a given length in bytes from the left side of a string. Returns Variant/String. |
LeftB$ | Returns a substring of a given length in bytes from the left side of a string. Returns String. |
Len | Returns the number of characters in a string or the number of bytes required to store a variable. |
LenB | Returns the number of bytes in a string or the number of bytes required to store a variable. |
LTrim | Returns a string without leading spaces. Returns Variant/String. |
LTrim$ | Returns a string without leading spaces. Returns String. |
Mid | Returns a substring of a given length. Returns Variant/String. Can be used to alter sections of a string. |
Mid$ | Returns a substring of a given length. Returns String. Can be used to alter sections of a string. |
MidB | Returns a substring of a given length in bytes. Returns Variant/String. Can be used to alter sections of a string. |
MidB$ | Returns a substring of a given length in bytes. Returns String. Can be used to alter sections of a string. |
MonthName | Returns a string representing a given month. |
Replace | Returns a string with a given substring replaced by another string. Returns String. |
Right | Returns a substring of a given length from the right side of a string. Returns Variant/String. |
Right$ | Returns a substring of a given length from the right side of a string. Returns String. |
RightB | Returns a substring of a given length in bytes from the right side of a string. Returns Variant/String. |
RightB$ | Returns a substring of a given length in bytes from the right side of a string. Returns String. |
RTrim | Returns a string without trailing spaces. Returns Variant/String. |
RTrim$ | Returns a string without trailing spaces. Returns String. |
Space | Returns a given number of spaces. Returns Variant/String. |
Space$ | Returns a given number of spaces. Returns String. |
Split | Returns a string array by splitting up a string on a delimiter. |
StrComp | Returns the result of a string comparison. |
StrConv | Returns a string converted according to a given option. |
String | Returns a string repeated for a given number of times. Returns Variant/String. |
String$ | Returns a string repeated for a given number of times. Returns String. |
StrReverse | Returns a reversed string. |
Trim | Returns a string without leading or trailing spaces. Returns Variant/String. |
Trim$ | Returns a string without leading or trailing spaces. Returns String. |
UCase | Returns a string converted to uppercase. Returns Variant/String. |
UCase$ | Returns a string converted to uppercase. Returns String. |
WeekdayName | Returns a string representing a given day of the week. |
Public Function AscW2(Char As String) As Long
'This function should be used instead of AscW
AscW2 = AscW(Char)
If AscW2 < 0 Then
AscW2 = AscW2 + 65536
End If
End Function
Public Function AscW2(Char As String) As Long
'This function should be used instead of AscW
AscW2 = AscW(Char) And &HFFFF&
End Function
Types of String Functions
The behaviors of several string functions in VBA can be altered by affixing a $, B, W, or some combination of the three to the end of the function name.
$ Functions
$ String functions explicitly return a String instead of a Variant/String. The String type uses less memory than the Variant/String type.
B Functions
B (Byte) String functions deal with bytes instead of characters.
W Functions
W (Wide) functions are expanded to include Unicode characters if the system supports Unicode.
String Classes
Using custom string classes can facilitate working with strings and make working with strings more efficient. the StringBuilder and ArrayList classes have high-level functionality and are designed to mitigate the inefficiencies of with working with strings.
StringBuilder
The StringBuilder class represents a single string that can be manipulated and mutated. The StringBuilder class improves efficiency by avoiding frequent reallocation of memory. The StringBuilder class has a number of high-level properties and methods that facilitate working with strings. Download and import the clsStringBuilder class into a VBA project.
Public Sub Example()
'''Must import clsStringBuilder to VBA project
Dim SB As clsStringBuilder
Set SB = New clsStringBuilder
SB.Append "ABC"
SB.Append "123"
SB.Insert 3, "XYZ"
Debug.Print SB.Substring(3, 5)
SB.Remove 3, 5
Debug.Print SB.ToString
End Sub
ArrayList
The ArrayList class represents a list which can be manipulated and mutated. The ArrayList class improves efficiency by avoiding frequent reallocation of memory. The ArrayList class has a number of high-level properties and methods that facilitate working with a list of strings. Download and import the clsArrayListString class into a VBA project.
Public Sub Example()
'''Must import clsArrayListString to VBA project
Dim AL As clsArrayListString
Set AL = New clsArrayListString
'Build message
AL.Append "Hello"
AL.Append "How are you?"
AL.Append "I'm great! Thank you."
Debug.Print AL.JoinString(vbNewLine)
AL.Reinitialize
'Sort strings
AL.Append "C"
AL.Append "B"
AL.Append "A"
Debug.Print AL.JoinString
AL.Sort
Debug.Print AL.JoinString
End Sub