Elegir entre & y + para la concatenación de cadenas en VBA
Visual Basic para Aplicaciones (VBA) es una poderosa herramienta para automatizar tareas en aplicaciones de Microsoft Office. Un requisito común en programación es concatenar cadenas, especialmente cuando se trata de nombres. Sin embargo, el manejo de valores nulos puede generar resultados inesperados. En este artículo, exploraremos dos métodos de concatenación en VBA: usar el signo comercial (&) y el signo más (+). También discutiremos cómo gestionar los valores nulos de forma eficaz.
Los fundamentos de la concatenación
La concatenación es el proceso de unir dos o más cadenas. En VBA, esto se puede lograr usando el operador `&` o el operador `+`. Si bien ambos operadores se pueden usar para la concatenación de cadenas, se comportan de manera diferente cuando encuentran valores nulos.
Usando el signo comercial (&)
El operador comercial está diseñado explícitamente para la concatenación de cadenas. Trata todos los operandos como cadenas y los convierte según sea necesario. Si algún operando es nulo, se trata como una cadena vacía (“”). Este comportamiento convierte al operador & en una opción confiable para concatenar cadenas sin introducir resultados inesperados. Veamos algunos ejemplos de código que lo demuestran.
Sub TestConcatanateWithAmp() Dim vFirstName As Variant Dim vMiddleName As Variant Dim vLastName As Variant vFirstName = "Emily" vMiddleName = "Grace" vLastName = "Thompson" Debug.Print "'" & vFirstName & " " & vMiddleName & " " & vLastName & "'" ' Outputs => 'Emily Grace Thompson' vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName & " " & vMiddleName & " " & vLastName & "'" ' Outputs => 'Emily Thompson' - with 2 spaces in the middle vFirstName = "Emily" vMiddleName = Null vLastName = Null Debug.Print "'" & vFirstName & " " & vMiddleName & " " & vLastName & "'" ' Outputs => 'Emily ' - with 3 ending spaces vFirstName = Null vMiddleName = "Grace" vLastName = "Thompson" Debug.Print "'" & vFirstName & " " & vMiddleName & " " & vLastName & "'" ' Outputs => ' Grace Thompson' - with a leading spaces vFirstName = Null vMiddleName = "Grace" vLastName = Null Debug.Print "'" & vFirstName & " " & vMiddleName & " " & vLastName & "'" ' Outputs => ' Grace ' - with leading and trailing spaces End Sub
La solución para manejar posibles valores nulos.
Sub TestConcatanateWithAmp() Dim vFirstName As Variant Dim vMiddleName As Variant Dim vLastName As Variant ' If the issue is Leading, or Trailing - use Trim ' *********************************************** vFirstName = Null vMiddleName = "Grace" vLastName = Null Debug.Print "'" & Trim(vFirstName & " " & vMiddleName & " " & vLastName) & "'" ' Outputs => 'Grace' ' The more versatile IIF & IsNull approach ' **************************************** vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName & IIf(IsNull(vMiddleName), "", " " & vMiddleName) & IIf(IsNull(vLastName), "", " " & vLastName) & "'" ' Outputs => 'Emily Thompson' vFirstName = "Emily" vMiddleName = Null vLastName = Null Debug.Print "'" & vFirstName & IIf(IsNull(vMiddleName), "", " " & vMiddleName) & IIf(IsNull(vLastName), "", " " & vLastName) & "'" ' Outputs => 'Emily' End Sub
Conclusiones clave de la concatenación de ampersand
- Manejo de espacios: Cuando cualquier parte de la cadena concatenada es nula, se generan espacios adicionales. Esto puede resultar problemático si no se gestiona adecuadamente.
- Usando Recortar: La función Recortar se puede emplear para eliminar los espacios iniciales y finales de la salida final.
- Concatenación condicional: La función IIf() combinada con IsNull() permite una concatenación más controlada al verificar cada variable antes de agregarla a la cadena final.
Usando el signo más (+)
El operador de signo más también puede concatenar cadenas, pero tiene un comportamiento más complejo. Si algún operando en una operación de concatenación que usa `+` es nulo, toda la expresión se evalúa como nula. Esto significa que si concatenas una cadena con un valor nulo usando `+`, no obtendrás ningún resultado; en su lugar, recibirá un resultado nulo.
Usando la siguiente configuración, veamos algunos ejemplos de código que demuestran esto.
Sub TestConcatanateWithPlus() Dim vFirstName As Variant Dim vMiddleName As Variant Dim vLastName As Variant '? ("Something" & null) ' Returns => Something '? ("Something" + null) ' Returns => Null vFirstName = "Emily" vMiddleName = "Grace" vLastName = "Thompson" Debug.Print "'" & vFirstName + " " + vMiddleName + " " + vLastName & "'" ' Outputs => 'Emily Grace Thompson' vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName + " " + vMiddleName + " " + vLastName & "'" ' Outputs => '' '!!! Watch out, if any part of the concatenation is null, then the entire thing is omitted! vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName + (" " + vMiddleName) + (" " + vLastName) & "'" ' Outputs => '' End Sub
Y aquí hay ejemplos de cómo manejar adecuadamente las cosas para gestionar la posibilidad de valores nulos:
Sub TestConcatanateWithPlus() Dim vFirstName As Variant Dim vMiddleName As Variant Dim vLastName As Variant vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName & " " + vMiddleName & " " + vLastName & "'" ' Outputs => 'Emily Thompson' vFirstName = "Emily" vMiddleName = Null vLastName = "Thompson" Debug.Print "'" & vFirstName & (" " + vMiddleName) & (" " + vLastName) & "'" ' Outputs => 'Emily Thompson' End Sub
Conclusiones clave de la concatenación del signo más
- Manejo nulo: Si alguna parte de la expresión es nula, todo el resultado se vuelve nulo. Este comportamiento puede generar resultados inesperados si no se gestiona con cuidado.
- Combinando expresiones: Incluso si intenta concatenar partes por separado, si alguna parte se evalúa como nula, seguirá dando como resultado una salida vacía.
Resumen de diferencias clave
Operador | Comportamiento con valores nulos |
---|---|
& | Trata Null como una cadena vacía; devuelve otras cadenas como se esperaba. |
+ | Devuelve Nulo si algún operando es Nulo; puede provocar la pérdida de datos. |
Explorando `&` y `+` en concatenaciones de consultas
Pensé que también deberíamos explorar las implicaciones de `&` y `+` en el contexto de las consultas SQL.
Supongamos una tabla de ‘Empleado’ que contiene 3 campos de texto corto: Nombre, Segundo nombre y Apellido.
(FirstName) => Emma (MiddleName) => Grace (LastName) => Thompson SELECT (FirstName) & " " & (MiddleName) & " " & (LastName) AS Fullname FROM Employee; Outputs: 'Emma Grace Thompson'
(FirstName) => Emma (MiddleName) => Null (LastName) => Thompson SELECT (FirstName) & " " & (MiddleName) & " " & (LastName) AS Fullname FROM Employee; Outputs: 'Emma Thompson'
Para solucionar lo anterior, podemos tomar 1 de 2 enfoques.
SELECT (FirstName) & IIf(IsNull((MiddleName)), "", " " & (MiddleName)) & " " & (LastName) AS Fullname FROM Employee; Outputs: 'Emma Thompson'
O
SELECT (FirstName) & (" " + (MiddleName)) & " " & (LastName) AS Fullname FROM Employee; Outputs: 'Emma Thompson'
Con base en lo anterior, espero que esté comenzando a ver el valor del operador `+` en el contexto del manejo de valores nulos. Teniendo esto en cuenta, podríamos mejorar aún más lo anterior para:
SELECT (FirstName) & (" " + (MiddleName)) & (" " + (LastName)) AS Fullname FROM Employee; Outputs: 'Emma Thompson'
La expresión anterior ahora puede manejar cualquier escenario que le planteemos.
Conclusión
Comprender cómo concatenar cadenas de manera efectiva en consultas VBA y SQL es esencial para desarrollar aplicaciones sólidas que manejen la entrada del usuario y los registros de la base de datos sin problemas.