La página Web de Emilio Sancha - MVP 2006/11
La página Web de Emilio Sancha

Inicio    |   Access    |   Excel    |    Visual Script    |   Enlaces    |   Búsquedas    |   Apuntes    |   Libro de Visitas

Suscripcion RSS

Concatenación de cadenas y construcción de sentencias SQL


Para concatenar dos cadenas utilizaremos el carácter
& (ampersand) para unirlas.

Son varios los casos que se nos pueden producir cuando construimos una cadena a partir de otras y/o números, cuadros de texto de formularios, celdas de hojas de cálculo, etc.

La mas simple de las posibilidades: concatenar dos cadenas, sin mas

Dim strCadena1 As String, _
strCadena2 As String

strCadena1 = "Hola"
strCadena2 = "Mundo!"
Debug.Print strCadena1 & strCadena2

Al ejecutar ese código nos devolverá en la ventana inmediato:

HolaMundo!

Claro que en este caso, y como por otra parte es lógico, el resultado no es el deseado, para que no se nos peguen las dos cadenas habremos de utilizar algún tipo de separador, como por ejemplo el espacio:
Dim strCadena1 As String, _
strCadena2 As String

strCadena1 = "Hola"
strCadena2 = "Mundo!"
Debug.Print strCadena1 & " " & strCadena2

Ahora sí, el resultado es correcto

Hola Mundo!


Si quisiéramos que alguna de las palabras apareciera entrecomillada, tenemos dos modos de hacerlo, utilizar dos comillas dobles, para “devolver” una
Dim strCadena1 As String, _
    strCadena2 As String

strCadena1 = "José"
strCadena2 = "Pepe"
Debug.Print strCadena1 & ", alias """ & strCadena2 & """"

O bien utilizar el carácter ASCII 34, correspondiente a la comilla doble.
Debug.Print strCadena1 & ", alias " & Chr(34) & strCadena2 & Chr(34)


En cualquiera de los casos, la cadena devuelta será:

José, alias "Pepe"

Ahora vamos a concatenar una cadena con un número
Dim strCadena As String, _
    intNumero As Integer

strCadena = "Año"
intNumero = 2011
Debug.Print strCadena & " " & intNumero

El resultado obtenido sería:
Año 2011

Hasta aquí es todo muy fácil, las “complicaciones” empiezan cuando en lugar de concatenar variables hemos de concatenar campos de un formulario o celdas de Excel.

Por ejemplo, dos cuadros de texto de un formulario

Debug.Print Form_Formulario1.Texto2 & " " & Form_Formulario1.Texto4

El resultado en este caso sería, por ejemplo, teniendo en cuenta que Texto2 y texto4 son 2 cuadros de texto que existen en Formulario1 y que, en este momento contienen respectivamente "Hola" y "Mundo".
Hola Mundo!

OJO Form_Formulario1 es una nomenclatura Access que solo entiende si Formulario1 contiene código o su propiedad HasModule está establecida a 1, otra forma de referenciar el control sería Forms!Formulario1!Texto4.

Si se tratara de celdas de Excel la situación sería parecida.

Debug.Print Worksheets("Hoja1").Range("A1") & " " & Worksheets("Hoja1").Range("B1")

De cualquier modo sigue siendo muy sencillito, se complica un poco mas cuando hemos de construir, por ejemplo una sentencia SQL uniendo datos numéricos, fechas, variables, cuadros de texto, comillas dobles o simples, …
Siempre que trabajemos con datos de texto estos deberán ir incluidos entre comillas simples.

Por ejemplo:

Dim strSQL As String, _
    strPalabra As String

strPalabra = "Prueba"
strSQL = "INSERT INTO tblPruebas (Palabra)"
strSQL = strSQL & "SELECT '" & strPalabra & "'"
Debug.Print strSQL

Esto devuelve
INSERT INTO tblPruebas (Palabra)SELECT 'Prueba',

Como se puede ver tenemos un problema: (Palabra)SELECT, puesto que falta un espacio entre el paréntesis y SELECT que habrá que añadir, es algo de lo que siempre deberemos estar muy pendientes especialmente cuando realicemos la concatenación en varias líneas.
Vamos a arreglarlo y además a tomar el dato de un campo de un formulario:
Dim strSQL As String

strSQL = "INSERT INTO tblPruebas (Palabra) "
strSQL = strSQL & "SELECT '" & Forms!frmClientes!IdCliente & "'"
Debug.Print strSQL

Con ello obtendremos:
INSERT INTO tblPruebas (Palabra) SELECT 'ALFKI'

Vamos a añadir ahora un número entero.
Dim strSQL As String, _
    strPalabra As String, _
    intNumero As Integer

strPalabra = "Prueba"
intNumero = 123
strSQL = "INSERT INTO tblPruebas (Palabra, Numero) "
strSQL = strSQL & "SELECT '" & strPalabra & "', "
strSQL = strSQL & intNumero
Debug.Print strSQL

El resultado:
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123

Si el número tuviera decimales:
Dim strSQL As String, _
    strPalabra As String, _
    sngNumero As Single

strPalabra = "Prueba"
sngNumero = 123.45
strSQL = "INSERT INTO tblPruebas (Palabra, Numero) "
strSQL = strSQL & "SELECT '" & strPalabra & "', "
strSQL = strSQL & sngNumero
Debug.Print strSQL

Eso devolvería:
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123,45

En este caso la concatenación sería correcta, sin embargo al intentar ejecutar esa sentencia SQL se produciría un error, puesto que estamos pasando tres valores a dos campos, ¿por qué?, porque VBA ha convertido el punto decimal en una coma, cosas de VBA y la configuración regional, la solución para evitarlo es decirle que el número lo quieres convertir en cadena, para ello usamos la función
Str

Quedaría así:

Dim strSQL As String, _
    strPalabra As String, _
    sngNumero As Single

strPalabra = "Prueba"
sngNumero = 123.45
strSQL = "INSERT INTO tblPruebas (Palabra, Numero) "
strSQL = strSQL & "SELECT '" & strPalabra & "', "
strSQL = strSQL & Str(sngNumero)
Debug.Print strSQL

Y el resultado:
INSERT INTO tblPruebas (Palabra, Numero) SELECT 'Prueba', 123.45

La diferencia con la cadena anterior, donde antes ponía 123,45 ahora pone 123.45 en este caso VBA y SQL se entenderán perfectamente.

Vamos a ver mas “problemas” con los que nos podemos encontrar, supongamos que la palabra a incluir contiene una comilla simple, como habéis visto las cadenas las insertamos entre comillas simples, por ejemplo:
Dim strSQL As String, _
    strPalabra As String

strPalabra = "McDonald's"
strSQL = "INSERT INTO tblPruebas (Palabra) "
strSQL = strSQL & "SELECT '" & strPalabra & "'"
Debug.Print strSQL

El resultado:
INSERT INTO tblPruebas (Palabra) SELECT 'McDonald's'

Que aunque pueda parecer correcto, sintácticamente no lo es, esas comillas simples desparejadas no le van a gustar nada a SQL, para resolver el problema habremos de reemplazar esa comilla simple por dos, es una buena costumbre hacerlo sistemáticamente si hay alguna posibilidad de que eso ocurra.
Dim strSQL As String, _
    strPalabra As String

strPalabra = "McDonald's"
strSQL = "INSERT INTO tblPruebas (Palabra) "
strSQL = strSQL & "SELECT '" & Replace(strPalabra, "'", "''") & "'"
Debug.Print strSQL

La cadena devuelta,
INSERT INTO tblPruebas (Palabra) SELECT 'McDonald''s'

que aunque pueda parecer incorrecta, a SQL le va a gustar mucho mas que la anterior, dado que el número de comillas simples resultantes es par.

Otra complicación con la que podemos encontrarnos al construir una sentencia SQL cuando trabajemos con fechas, es que hemos de pasarlas entre almohadillas (delimitador que indica a Access que se trata de una fecha) y siempre en formato mm/dd/yy para lo cual habrá de usarse la función Format. Ni que decir tiene que si se deben tener en cuenta las horas también hay que meterlas en el Format

Dim strSQL As String, _
    strPalabra As String

strPalabra = "McDonald's"
strSQL = "INSERT INTO tblPruebas (Palabra, Fecha) "
strSQL = strSQL & "SELECT '" & Replace(strPalabra, "'", "''") & "', "
strSQL = strSQL & "#" & Format(Now, "mm/dd/yy hh:nn:ss") & "#"
Debug.Print strSQL

Que devolverá algo así:
INSERT INTO tblPruebas (Palabra, Fecha) SELECT 'McDonald''s', #03/30/11 23:11:33#

Emilio Sancha 30/03/11

 


  • NOTA: La información contenida en esta página, así como el código fuente incluido en la misma, se proporciona TAL CUAL, sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo explicado, recomendado o sugerido en la presenta página.

    This page is provided AS IS with no warranties, and confers no rights. You assume all risk for your use.

    Ultima actualización:  Sábado, 15 de Octubre de 2016
    © Emilio Sancha 2.004-2.016