Manipular cadenas
Objetivos del capítulo
Como ha visto en el capítulo Variables y constantes, el tipo String (cadena) forma parte de los tipos de datos básicos. Es con toda probabilidad el que manipulará más a menudo, especialmente en los archivos de texto que tenga que procesar. Este capítulo pretende mostrarle las principales funciones que puede utilizar para manipular cadenas. Existen otras que se utilizan mucho menos.
Al final de este capítulo, encontrará una serie de ejercicios para practicar.
Concatenar cadenas: &
El término concatenar en programación significa unir uno tras otro; por ejemplo, la concatenación de «Luke» y «Skywalker» da como resultado «Luke Skywalker». Para concatenar en VBA, puede utilizar el carácter & («et» o «y» en español; «ampersand» en inglés). La sintaxis general será la siguiente:
Dim SuVariable As String
SuVariable = "abc" & "def"
'La variable SuVariable tendrá entonces el valor "abcdef"
Ejemplo 1: concatenar dos cadenas
Este operador le permite unir cadenas, pero también valores numéricos o fechas.
El símbolo + se utiliza asimismo para la concatenación, pero, como ha visto en el capítulo anterior, también se utiliza como operador de adición de valores numéricos.
Si, por ejemplo, quiere transformar 1 y 2 en «12», utilizaría:
Dim Texto As String
Texto = 1 & 2 'da el valor "12"
'mientras que
Texto = 1 + 2 'da el valor "3"
Ejemplo 2: privilegiar el signo & en lugar de + para concatenar
Puede almacenar el resultado de una concatenación en una variable, pero también mostrarlo directamente al usuario.
Dim Titulo As String
Titulo = "Madame"
Dim Apellido As String
Apellido = "de Pompadour" ...
Longitud de una cadena: Len()
Cuando quiera rellenar información, o simplemente para validar que los datos introducidos son coherentes, por ejemplo, la longitud de un código postal, un DNI o un número de envío, la información sobre la longitud de una cadena le será de mucha utilidad. La función que permite conocer la longitud es Len(). Esta función toma como parámetro la cadena cuya longitud desea conocer, y su sintaxis es la siguiente.
Dim UnaCadenaCualquiera As String
'Alimentar la cadena en otra parte del programa
Dim Longitud As Long
Longitud = Len(UnaCadenaCualquiera)
Ejemplo 4: usar la función Len para conocer la longitud de una cadena
La función devolverá el número de caracteres de la cadena, incluidos los espacios o los caracteres invisibles, como los saltos de línea. Así, una cadena vacía tendrá una longitud de 0.
He aquí algunos ejemplos:
Dim Saludo As String, Titulo As String
Saludo = "Buenos días"
Titulo = "Señora"
MsgBox Len(Saludo) 'Muestra 11
MsgBox Len(Titulo) Muestra 6
Msbox Len(Saludo & " " & Titulo) 'Muestra 18 (11 + 1 + 5)
Ejemplo 5: distintos usos de la función Len()
También puede utilizar esta función en estructuras de condición:
Dim Texto As String
...
If Len(Texto)...
Porción de un texto: Left(), Right(), Mid()
Si trabaja con cadenas que contienen informaciones varias, y quiere dividir la cadena principal en una o más cadenas de trozos más pequeños, dispone de tres funciones básicas: Left(), Right() y Mid(). Cuando trabaje con nombres de carpetas, con una nomenclatura determinada o tenga nombres de archivos con nombres siempre similares, como ABC_DEF_2022 o FolderXXX456, las siguientes tres funciones le permitirán obtener los fragmentos de texto que desee recuperar.
Tenga en cuenta que cuando trabaje con VBA, la numeración de los caracteres comienza por el 1. Así, en la cadena «ABCD», el tercer carácter es la «C».
Tomar caracteres de la izquierda: Left()
Cuando quiera recuperar los primeros X caracteres de un texto, la función Left() es la elección correcta. Se llama así porque recupera los caracteres de la izquierda. Esta función toma como parámetro el texto original, así como el número de caracteres que desea extraer, y devuelve la cadena correspondiente. La sintaxis general de esta función es la siguiente:
Dim Resultado As String
Resultado = Left(Texto_Largo,NumeroDeCaracteres)
Ejemplo 7: sintaxis general de la función Left()
He aquí un ejemplo de uso de esta función:
Dim TextoOriginal As String, TextoFinal As String
TextoOriginal = "Texto muy largo" ...
Mayúsculas y minúsculas: UCase(), LCase()
Al manipular cadenas, es posible que necesite pasar todos los caracteres a mayúsculas, por ejemplo, para siglas y acrónimos, o viceversa, en minúsculas. Puede utilizarla para las matrículas de los coches (tradicionalmente todas en mayúsculas) o los días de la semana, meses y estaciones del año (en minúsculas).
Transformar una cadena en mayúsculas: UCase()
La función UCase(), que es un diminutivo de Upper Case, es una función que toma como parámetro la cadena por transformar y devuelve su equivalente compuesto solo de letras mayúsculas (incluidos los caracteres acentuados). La sintaxis general de esta función es la siguiente.
VariableResultado = UCase(TextoOriginal)
Ejemplo 15: sintaxis general de la función UCase()
Y este es un ejemplo de su uso:
Dim TextoEjemplo As String
TextoEjemplo = "Buenos días a todos"
MsgBox UCase(TextoEjemplo) 'muestra BUENOS DÍAS A TODOS
Ejemplo 16: uso de la función UCase()
Cuando la cadena contiene caracteres no alfabéticos, estos permanecen sin cambio a la salida de la función UCase().
Dim EjemploConCifrasYSimbolos As String
EjemploConCifrasYSimbolos = "abc123()._"
MsgBox UCase(EjemploConCifrasYSimbolos) ' mostrará ABC123()._
Ejemplo 17: la función UCase() solo afecta a los caracteres...
Presencia de una subcadena en una cadena: InStr(), InstrRev() y Like
A veces se necesita saber si una palabra o letra está en algún lugar de una cadena, o se quiere conocer la última ubicación de una subcadena dentro del texto original. Las funciones InStr() e InStrRev() le ayudarán a hacerlo. Devuelven la posición de una cadena dentro de otra.
Obtener la posición dentro de un cadena: InStr()
Cuando quiera conocer en qué posición se sitúa un carácter o una cadena dentro de otra, la función InStr() es imprescindible. Esta función tiene como sintaxis general:
Dim Posicion As Integer
Posicion = InStr([PosicionInicialDeBusqueda], [TextoEnElQueSeBusca],
[TextoQueSeBusca], [FormaDeComparar])
Ejemplo 20: sintaxis general de la función InStr()
El primero de los parámetros esperados en esta función es la posición a partir de la cual se debe realizar la búsqueda en la cadena (recuerde: la cadena comienza en el carácter 1, por lo que, si omite el parámetro, el valor predefinido será 1). Luego viene la cadena en la que se realiza la búsqueda y la cadena que se busca.
Como último parámetro opcional, puede especificar si la búsqueda debe distinguir entre los valores «X» y «x» (constante vbBinaryCompare) o si VBA debe considerarlos como similares (constante vbTextCompare). De forma...
Borrar espacios de más: Trim()
Entre las funciones muy útiles para manipular cadenas, he aquí las tres que le permiten eliminar los espacios al principio o al final de una cadena; se reproduce así el comportamiento de la fórmula ESPACIOS, dejando los espacios en medio de la cadena. Esta función puede utilizarse para corregir errores de entrada, por ejemplo, cuando un usuario añade involuntariamente espacios al final de un texto.
Esta función Trim() toma una cadena como parámetro y devuelve una cadena con los espacios eliminados al principio y al final de ella. La sintaxis general de esta función es la siguiente:
Dim Resultado As String
Resultado = Trim(CadenaInicial)
Ejemplo 27: sintaxis general de la función Trim()
Un ejemplo del uso de esta función:
MsgBox Len(Trim(" Buenos días " )) 'Muestra la longitud de
"Buenos días", es decir 11.
Ejemplo 28: Caso de uso de la función Trim()
Tenga en cuenta que, si no hay espacios al principio o al final de la cadena, la función devuelve la misma cadena que se le pasa como parámetro.
Existen otras dos funciones similares a Trim(). LTrim(), que elimina los espacios solo al principio de la cadena, y RTrim(), que elimina los espacios solo al final de la cadena.
Cortar en una matriz, reagrupar: Split, Join
Cuando tiene una cadena cuyos datos están delimitados por caracteres de separación fijos, como la coma, el punto y coma, el tabulador o cualquier otro carácter, usted puede transformar esta cadena en una matriz de valores.
Función Split()
La función Split() permite esta manipulación. La función devuelve una matriz de tipo Variant porque el número de elementos se desconoce de antemano.
La sintaxis general de la función es la siguiente:
Split(Texto, Delimitador, [Límite],[Comparación])
Ejemplo 29: sintaxis general de la función Split.
El primer parámetro Texto es la cadena que desea dividir, y Delimitador es la cadena que permite esta división.
Por ejemplo, puede utilizarla así:
Dim Matriz As Variant
Matriz = Split("VBA Excel 2023", " " )
?Matriz(0) ' "VBA"
?Matriz(1) ' "Excel"
?Matriz(2) ' "2023"
Ejemplo 30: uso de la función Split
Esto le permite obtener subcadenas a partir de una cadena principal.
El parámetro Límite permite especificar el número de subcadenas que devolverá la función. Su valor predefinido es -1, lo que significa que se devuelven todas las subcadenas.
Matriz = Split(" VBA Excel 2023 ", " " ,2)
?Matriz(0) ' "VBA"
?Matriz(1) ' "Excel...
Trabajar combinando varias funciones
A la hora de trabajar con cadenas, es muy probable que necesite manipular los bloques de datos de forma más intensiva, y trabajar, combinando las diferentes funciones vistas hasta ahora le será de gran ayuda.
Es posible que tenga que obtener los caracteres que siguen a una palabra clave en una cadena, por ejemplo «Apellido:» de la cadena «Nombre: Juan Antonio / Apellido: Pérez», y ponerlo en mayúsculas, de modo que obtenga «PÉREZ» como salida. Lo importante en este tipo de situaciones es desglosar primero el razonamiento y tratar los puntos paso a paso.
He aquí un ejemplo de solución:
Sub AislarElApellido()
Dim strEntrada As String
strEntrada = "Nombre: Juan Felipe / Apellido: Rosas"
'1er paso, determinar ubicación de "Apellido:" a partir del final
Dim iEmplazamientoApellido As Integer
iEmplazamientoApellido = InStrRev(strEntrada, "Apellido:")
'2do paso, recuperar los caracteres después de Apellido:
Dim strSubCadena As String
strSubCadena = Mid(strEntrada, iEmplazamientoApellido +
Len("Apellido:"))
'3er paso, mostrar el resultado en mayúsculas, teniendo cuidado
' de...
Ejercicios
Concatenar cadenas
Símbolo a su elección
Escriba una función llamada Concatenar de ámbito público.
Esta función toma como parámetros dos cadenas, llamadas CadenaA y CadenaB.
Esta función devolverá una cadena que contiene CadenaA y CadenaB separadas por el carácter espacio « ».
Cree la macro MostrarConcatenar.
Esta macro mostrará lo que devuelve la función Concatenar, pasándole los valores «Buenosdías,» y «bienvenido».
Ejecute la macro MostrarConcatenar.
El resultado esperado es «Buenos días, bienvenido».
Un solo símbolo posible
Escriba una función llamada ConcatenarNumeros de ámbito público.
Esta función toma como parámetros dos valores numéricos enteros, llamados NumeroA y NumeroB.
Esta función devolverá una cadena que contiene NumeroA y NumeroB sin caracteres de separación.
Cree la macro MostrarConcatenarNumeros.
Esta macro mostrará lo que devuelve la función ConcatenarNumeros pasándole los valores 20 y 5.
Ejecute la macro MostrarConcatenarNumeros.
El resultado esperado es 205.
Partes de una cadena
El propósito de estos ejercicios es hacer que manipule funciones que devuelvan una parte de una cadena. Hay varias soluciones posibles para cada ejercicio.