No entendí muy bien eso de "una colección que esté como valor hexadecimal". Si tu cifra está como un string con la representación hexadecimal del número, probablemente sea más fácil usar una de las funciones para strings como mid$, left$ o rigth$ para obtener los caracteres que interesan.
Pero, en el caso de variables numéricas, la operación inversa es algo usual sobretodo si trabajas con la API y subclassing. Pero en esos casos, interesa separar el word más significativo del menos significativo en un DWORD. Sin embargo, la mecánica es la misma. De hecho, es posible realizarla con operaciones básicas de VB, sólo que como los tipos de datos númericos mayores que un byte son valores con signo, se debe tener cuidado. Todo se simplificaría si VB contara con una operación de desplazamiento de bits.
Código:
Option Explicit
Private Declare Sub RtlMoveMemory Lib "kernel32" ( _
ByRef Destination As Any, _
ByRef Source As Any, _
ByVal Length As Long)
Private Type DWORD_BYTE
BYTES(3) As Byte
End Type
Private Type DWORD_LONG
DWORD As Long
End Type
Private Sub Form_Load()
Dim tmpLng As Long
Dim tmpBytArr(3) As Byte
Dim tmpByt As Byte
Dim tmpDWrdLng As DWORD_LONG
Dim tmpDWrdByt As DWORD_BYTE
'Con tipos de datos, indicas
'el índice del byte que quieres
tmpDWrdLng.DWORD = &HABDCEF00
LSet tmpDWrdByt = tmpDWrdLng
Debug.Print "Con Types: "
Debug.Print "Byte 0:" & tmpDWrdByt.BYTES(0)
Debug.Print "Byte 1:" & tmpDWrdByt.BYTES(1)
Debug.Print "Byte 2:" & tmpDWrdByt.BYTES(2)
Debug.Print "Byte 3:" & tmpDWrdByt.BYTES(3)
'Con la API
Debug.Print "Con la API: "
tmpLng = &HABDCEF00
RtlMoveMemory tmpBytArr(0), tmpLng, 4&
Debug.Print "Byte 0: " & tmpBytArr(0)
Debug.Print "Byte 1: " & tmpBytArr(1)
Debug.Print "Byte 2: " & tmpBytArr(2)
Debug.Print "Byte 3: " & tmpBytArr(3)
'Con métodos comunes de VB se usa una combinación
'de máscaras de bits con divisiones
Debug.Print "Con Métodos de VB: "
'LSB
tmpByt = tmpLng And &HFF&
Debug.Print "Byte 0: " & tmpByt
'Byte 1
tmpByt = (tmpLng And &HFF00&) \ &H100
Debug.Print "Byte 1: " & tmpByt
'Byte 2
tmpByt = (tmpLng And &HFF0000) \ &H10000
Debug.Print "Byte 2: " & tmpByt
'MSB: tendrás problemas para obtenerlo si
'el número que "separas" es negativo. Por lo
'tanto, se requiere un paso extra de enmascaramiento
tmpByt = ((tmpLng And &HFF000000) \ &H1000000) And &HFF&
Debug.Print "Byte 3: " & tmpByt
End Sub
Por cierto, no te había comentado sobre un error en el código que habías puesto, ya que el usuario que comenzó este thread no respondió nada y consideré muerta la discusión. Imagina que tienes dos bytes, cada uno con un valor de 15. Al utilizar tu código, se obtendría el valor de la cadena &HFF, que no es lo correcto ya que debería ser el valor de &H0F0F. En el caso de concatenar sólo dos bytes, usando tu código, habría que corregir cómo se obtiene la cadena del byte menos significativo:
Código:
WORD = Val("&H" & Hex$(Byte2) & Right$("0" & Hex$(Byte1), 2))