Concatenar cadenas.
Aunque no sólo, cuando creamos un texto cuyo contenido puede variar en función de características y/o resultados del procesamiento de datos, además de utilizar condicionales para crear recorridos posibles (mediante la función SI() y la estructura If), también necesitamos unir en un único texto cadenas de texto y variables. Para eso contamos en Calc con funciones como CONCATENAR(), pero también con procedimientos específicos en OOo Basic.
En todo caso, ahora nos centraremos en la identificación y el análisis de estas funciones: CONCAT(), CONCATENAR() y UNIRCADENAS() (1). Todas ellas se ubican dentro de la categoría Texto de funciones Calc, comparten el mismo objetivo y, en el caso de las dos primeras, una formulación o sintaxis muy similar y sencilla, consistente en una serie de entradas (directas y/o referencias a celdas) separadas por ; como, por ejemplo:
=CONCAT(B4;B5;B6;B$9:B$13)
=CONCATENAR("La casa de la Pradera ";"está en mitad del campo")
No obstante, en lo relativo a la referencia a celdas CONCAT() resulta ser una evolución de desarrollo de CONCATENAR() (2), ya que...
- Mientras que CONCAT() admite referencias a celdas individuales, pero también a colecciones o intervalos de celdas
- CONCATENAR() sólo admite referencias a celdas individuales (no a intervalos)
La función UNIRCADENAS() tiene una sintaxis ligeramente diferente, permitiendo trabajar mejor el formateo de la cadena resultante. Consta de:
- Un delimitador, que es de uso obligatorio y que permite establecer una cadena de texto (incluyendo un intervalo) que se usará como separadores de las cadenas entre sí.
- Una variable booleana que permite omitir (1/True) o no (0/False) las cadenas vacías
- Y las cadenas a unir, que pueden ser string en entrada directa (los números se admiten pero se convierten a string), cadenas vacías, referencias a celdas (con o sin contenido) e intervalos del celdas. A modo de ejemplo...
=UNIRCADENAS("--";1;1234; ;"adbd";B10;B4:B6)
El resultado de usar cualquiera de las tres funciones (4) es una única entrada de texto (los valores numéricos son tratados como texto) que puede ser todo lo larga que deseemos, por lo que es perfectamente válida para generar procesos de automatización de la composición de documentos, utilizándolas, claro está en combinación con otras funciones, como hemos hecho en algunos soportes (no docap) de trabajo sobre pruebas de evaluación (5)
Aunque realmente el uso de estas funciones puede ser más que suficiente para la automatización de un documento, sin que sea necesario recurrir a un script OOo Basic, lo cierto es que sí parece conveniente trabajar con esta segunda opción, no tanto para la concatenación en sentido estricto como para la generación de textos (string) a concatenar. Con frecuencia para ello es necesario utilizar estructuras condicionales anidadas complejas, con lo que, por la que ya vimos en una entrada anterior, un script OOo Basic resulta ser más legible, sostenible y funcional que su equivalente en funciones condicionales Calc (SI() principalmente). En ese contexto, una vez que se utiliza el IDE para una parte del proceso, no es infrecuente que se termine utilizando también para crear salidas de texto basadas en la concatenación mediante procedimientos OOo Basic.
Además la simplicidad con la que se concatenan cadenas de texto con variables, bien tipo String, bien numéricas, hace que sea sumamente sencillo realizar estos procesos desde OOo Basic, así que ya de puestos...
Ciertamente crear un contenido resultante de la concatenación de literales (datos introducidos directamente) y/o variables de diferentes tipo es sumamente sencillo. Básicamente se trata de enunciar esos contenidos enlazados bien con +, bien con &. Ambos caracteres cumplen, en la práctica, la misma función por lo que, salvo contadas ocasiones, se pueden usar indiscriminadamente y todas la veces que resulte necesario.
De hecho + sirve tanto para concatenar como para sumar, por lo que sólo cuando los literales (o las variables) son numéricos es conveniente diferenciar cuando nos interesa que se ejecute una suma y cuando una concatenación de dos números (6). Veamos ejemplos en un script cuya única función es de carácter didáctico:
dim txt As String
dim num1 As Integer, num2 As Integer
txt = "Hola Mundo"
num1 = 123
num2 = 893
MsgBox("Cadena1" + "cadena2") (1)
MsgBox("Cadena1" & "Cadena2") (2)
MsgBox("Cadena1 " + txt) (3)
MsgBox("Cadena1 " & txt) (4)
MsgBox("Cadena1 " + num1) (5)
MsgBox("Cadena1 " & num1) (6)
MsgBox(num1 + num2) (7)
MsgBox(num1 & num2) (8)
MsgBox(CStr(num1) & CStr(num2)) (9)
- Se expresa la concatenación como salida por pantalla (MsgBox()), pero el procedimiento es exactamente igual si lo utilizamos para asignar como contenido de una variable.
- (1) y (2) ilustran básicamente la concatenación de literales textuales y la igualdad del procedimiento + vs. &.
- (3) y (4) combina literal con variable String. El comportamiento es el mismo que en el par anterior.
- (5) y (6) son equivalentes al par precedente, sustituyendo la variable string por una variable Integer.
- (7), (8) y (9) ilustran la diferencia operación (suma-> +) vs. concatenación (&) cuando empleamos dos variables numéricas. (8) y (9) dan el mismo resultados (concatenan dos expresiones numéricas) En realidad ambas operan sobre variables numéricas convertidas a String, (8) de forma implícita, (9) explicitando la conversión mediante el uso de la función CStr(). Aunque no resulte necesario, se recomienda utilizar este procedimiento cuando se desee tratar a un variable numérica como variable String. En buena lógica, lo mismo debería aplicarse en (5) y en (6)
- Eliminaría del listado las alternativas (1), (3), (5) y (8)
- Exigiría utilizar CStr() en (6)
- Eliminaría (7) o lo conservaría (7) como ejemplo de operador aritmético (no de concatenación)
- Y mantendría (9) como alternativa a (8).
En la concatenación, o mejor sería decir en el formateo de las cadenas resultantes de la concatenación también cabe utilizar algunos recursos que facilitan la composición de textos, como puede ser el uso del salto de línea (Chr(13)). Su repetición nos permite aumentar el número de saltos de línea (7).
NOTAS
(2) CONCAT() es de creación más reciente que CONCATENAR(); está disponibles desde la versión 5.2 de LibreOffice
(3) Este caprichoso resultado es el que deriva de la prueba realizada. Las dos primeras cadenas fueron introducidas directamente, la tercera es una cadena vacía que queda omitida por el uso de 1 en el segundo parámetro y el resto corresponden al contenido de la celda B10 y del intervalo B4:B6 respectivamente.
(4) Hasta donde yo entiendo, sólo la necesidad de concatenar intervalos de celdas condiciona la elección de CONCAT() sobre CONCATENAR(). El uso de UNIRCADENA() vendrá dado por el interés que tenga especificar separadores de cadenas específicos y/o omitir cadenas vacías. No encuentro otras razones que justifiquen su uso.
(5) En otro momento comentaré alguno de estos soportes que he empleado como recurso para el registro de datos en relación al uso de determinados test. Estos soportes contaban con una hoja que servía directamente de informe o indirectamente, tras su conversión a .pdf.
(6) En realidad, cuando concatenamos dos números con &, de forma implícita OOo Basic convierte ambos números en String. Por claridad en la codificación, aunque no sea necesario, es conveniente realizar la conversión de número a String mediante la función CStr()
(7) Chr(10) parece cumplir la misma función que Chr(13): generar un salto de línea. De todas formas, aunque estos procedimientos son muy simples, en cuanto a formateo del texto Grabar macro permite enriquecer estas opciones de forma significativa, pero no entra dentro del contenido de esta entrada.
No hay comentarios:
Publicar un comentario
Comenta esta entrada