I needed to convert some Ascii text to binary in Hex format `0x00FF...`.

I've written an `EncodeHex` and a `DecodeHex` function to do the conversion.

I've avoided using concatenation in favour of performance.

I'm assuming that assigning the results of `CByte("&h80")` to a byte array, and then using `StrConv` to convert the array to a Unicode string, is more efficient than assigning the results of `Chr$("&h80")` to a string array, and then using `Join` to concatenate the strings.

I need to use this in Excel, so I'm using `CVErr(xlErrValue)` to return errors, but this could maybe benefit from being more generic.

**Sample usage**

    ?HexEncode("FooBar")
    0x466F6F426172
    ?HexDecode("0x466F6F426172")
    FooBar

**VBA Code**

    Option Explicit
    
    Const HEX_STRING_PREFIX As String = "0x"
    Const VBA_HEX_PREFIX As String = "&h"
    
    Public Function HexEncode(AsciiText As String, Optional HexPrefix As String = HEX_STRING_PREFIX) As String
    
      If AsciiText = vbNullString Then
        
        HexEncode = AsciiText
      
      Else
        
        Dim asciiChars() As Byte
        asciiChars = StrConv(AsciiText, vbFromUnicode)
        
        ReDim hexChars(LBound(asciiChars) To UBound(asciiChars)) As String
        
        Dim char As Long
        For char = LBound(asciiChars) To UBound(asciiChars)
          hexChars(char) = Right$("00" & Hex$(asciiChars(char)), 2)
        Next char
      
        HexEncode = HexPrefix & Join(hexChars, "")
      End If
    
    End Function
    
    Public Function HexDecode(HexString As String, Optional HexPrefix As String = HEX_STRING_PREFIX)
      
      'Check if there's anything to decode
      
      If HexString = vbNullString Then
        HexDecode = vbNullString
        Exit Function
      Else
      
        If Not StrComp(Left$(HexString, Len(HexPrefix)), HexPrefix, vbTextCompare) = 0 Then
          'Unexpected string format
          GoTo DecodeError
        End If
      
        Dim hexRaw As String
        hexRaw = Mid$(HexString, 1 + Len(HexPrefix))
        
        'Check if the string is valid for decoding
        If Len(hexRaw) Mod 2 = 1 Then
          GoTo DecodeError
        End If
        
        Dim numHexChars As Long
        numHexChars = Len(hexRaw) / 2
        
        ReDim hexChars(0 To numHexChars - 1) As Byte
        Dim char As Long
        For char = 0 To numHexChars - 1
          Dim hexchar As String
          hexchar = VBA_HEX_PREFIX & Mid$(hexRaw, 1 + char * 2, 2)
          'Check if the hex-pair is actually hex
          If Not IsNumeric(hexchar) Then
            GoTo DecodeError
          End If
          hexChars(char) = CByte(hexchar)
        Next char
        'Return the concatenated bytes as a string
        HexDecode = StrConv(hexChars, vbUnicode)
        
      End If
      
    SafeExit:
      Exit Function
      
    DecodeError:
      HexDecode = CVErr(xlErrValue)
    
    End Function