Access

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

OperadorComportamiento 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.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba