To simplify the conversion of a variant array to a string array in Microsoft Excel we have made a set of utility functions. The method will also flatten any variant arrays within the source array (i.e. jagged arrays).
' Array Variant to String Public Function VariantArrayToStringArray(ByVal arrVariants As Variant) As String() Dim arrStrings() As String ' Get the string array Call ParamArrayToStringArray(arrVariants, arrStrings) ' Get the string array VariantArrayToStringArray = arrStrings End Function ' Array Variant to String Public Sub ParamArrayToStringArray(ByVal arrVariants As Variant, ByRef arrStrings() As String) Dim intLength As Integer ' Handle the array Call ParamArrayToStringArrayInternal(arrVariants, arrStrings, intLength) End Sub ' Array Variant to String Private Sub ParamArrayToStringArrayInternal(ByVal arrVariants As Variant, ByRef arrStrings() As String, ByRef intLength As Integer) ' Parameter is array? If (IsArray(arrVariants)) Then Dim i As Integer Dim objValue As Variant ' Walk through the specified partner objects For i = LBound(arrVariants) To UBound(arrVariants) Step 1 ' Get the value objValue = arrVariants(i) ' Array to string Call ParamArrayToStringArrayInternal(objValue, arrStrings, intLength) Next Else ' Next item intLength = intLength + 1 ' Expand array ReDim Preserve arrStrings(1 To intLength) ' Set the value arrStrings(intLength) = CStr(arrVariants) End If End Sub ' String Array ' Convert ParamArray to String array Public Function StringArray(ParamArray arrValues() As Variant) As String() ' Get the string array StringArray = VariantArrayToStringArray(arrValues) End Function
Usage
Here is an example on how to use the method called VariantArrayToStringArray:
' Source array Dim arrVariants() As Variant ' Set the array length ReDim arrVariants(1 To 4) ' Set the array values arrVariants(1) = 1 ' Integer arrVariants(2) = 2.2 ' Single arrVariants(3) = "Text" ' Text arrVariants(4) = True ' Boolean ' Destination array Dim arrStrings() As String ' Convert variant array to string array arrStrings = VariantArrayToStringArray(arrVariants)
The method will return an array with the following string values:
arrStrings(1) = “1”
arrStrings(2) = “2.2”
arrStrings(3) = “Text”
arrStrings(4) = “True”
Here is an example on how to use the function StringArray to create a string array from a ParamArray of variants. It is a fast way to initialize an array of strings.
' Destination array Dim arrStrings() as String ' Get string array arrStrings = StringArray("This", "is", "a", "test")
The array arrStrings now contains the following values:
arrStrings(0) = “This”
arrStrings(1) = “is”
arrStrings(2) = “a”
arrStrings(3) = “test”
Regional settings
Please notice that the decimal separator for singles/floats/doubles is dependent on your computer’s regional settings. In some regions the decimal separator is a comma. For item 2 the result value is “2.2” in the USA, while in the Scandinavian countries the result value is “2,2”.
To always use the dot as a decimal separator, replace the expression CStr(arrVariants) with Trim(Str(arrVariants)). In some cases I have experienced that the Str function adds a space to the result string. This space can be removed by Trim. The Str function does unfortunately not support a string as an input value, so we need to do an additional check.
' Contains decimal numbers? If (VarType(arrVariants) <> vbString) Then arrStrings(intLength) = Trim(Str(arrVariants)) Else ' Convert String to String arrStrings(intLength) = CStr(arrVariants) End If
The full source code for the modified method ParamArrayToStringArrayInternal is shown below.
' Array Variant to String Private Sub ParamArrayToStringArrayInternal(ByVal arrVariants As Variant, ByRef arrStrings() As String, ByRef intLength As Integer) ' Parameter is array? If (IsArray(arrVariants)) Then Dim i As Integer Dim objValue As Variant ' Walk through the specified partner objects For i = LBound(arrVariants) To UBound(arrVariants) Step 1 ' Get the value objValue = arrVariants(i) ' Array to string Call ParamArrayToStringArrayInternal(objValue, arrStrings, intLength) Next Else ' Next item intLength = intLength + 1 ' Expand array ReDim Preserve arrStrings(1 To intLength) ' Contains decimal numbers? If (VarType(arrVariants) <> vbString) Then arrStrings(intLength) = Trim(Str(arrVariants)) Else ' Convert String to String arrStrings(intLength) = CStr(arrVariants) End If End If End Sub
Simplified variant
One of our readers, Pete, proposed a simpler version of the above function (see the comments field below). This variant, however, does not handle jagged arrays, i.e. arrays inside arrays. The function is included for your reference:
' Converts Var array to a string array Public Function Variant2String(ByRef vArr() As Variant) As String() Dim i As Long Dim sArr() As String ReDim sArr(LBound(vArr) To UBound(vArr)) As String For i = LBound(vArr) To UBound(vArr) Step 1 sArr(i) = CStr(vArr(i)) Next Variant2String = sArr End Function
Compilation
It is recommended to add the expression Option Explicit at the beginning of your source file to ensure that the code is compiled correctly.
Doesn’t seem to work. Get “Type mismatch” compile error with the following:
Dim msg as string (or as string(60) – either way. Then:
msg = VariantArrayToStringArray(Listarray)
where Listarray is a variant array filled with values from a named range.
Can’t believe it’s so difficult to convert a variant() to a string()!
Thank you for your comment. I have now updated the article with an example.
The destination string array should be declared as:
Dim msg() As String
Function Variant2String(vArr() As Variant)
‘converts Var array to a string array
Dim i As Long, sArr() As String
ReDim sArr(UBound(vArr)) As String
For i = 1 To UBound(vArr)
sArr(i) = CStr(vArr(i))
Next
Variant2String = sArr
End Function
Thank you for the short version of the function. However, this function does not handle jagged arrays, i.e. arrays in arrays.