MACROS PARA EL MANEJO DE CADENAS

Antes de codificar nuestra tercera calculadora, vamos a ver cómo podemos manejar cadena de caracteres.

Como habrás podido apreciar, cuando quisimos ejecutar nuestra macro que calcula los coeficientes de la regresión lineal, tuvimos que usar un inputbox para X y otro para Y. Nos preguntamos: ¿Podemos ingresar los dos datos a la vez? ¿Podemos leer varios datos a la vez? Existe una forma de usar InputBox("...", X, Y)?

Lamentablemente Inputbox sólo nos permite ingresar solo un dato.

Sin embargo, podemos leer los dos valores, de X e Y, uno seguido del otro. Por ejemplo:

Dim Cad As String
Cad = InputBox("Ingresa el dato: ")

Si quisiéramos leer 15 para X y 236.28 para Y, podríamos digitar: 15236.28 ó 15 236.28 ó 15,236.28. Es decir, una cadena de caracteres. La variable Cad recibiría dicha cadena y deberíamos disponer de funciones que nos permitan extraer una parte de la cadena y convertirla en valor numérico con Val(...).
De esta forma, si se ingresa 15;236.28, y Cad recibe dicha cadena, podemos ser capaces de extraer los dos primeros caracteres de Cad, para X y todos los que empiezan después de “;” para Y.

Luego los convertimos en valor numérico y listo.

Luego de esto ya podemos realizar operaciones aritméticas con estos valores.
 

Para ello disponemos de las siguientes funciones:

- Left(Cad,n) … . Extrae los n primeros caracteres de la izquierda de Cad
- Right(Cad,n) … . Extrae los últimos n caracteres de la derecha de Cad
- Instr(Inicio,Cad,”t”) … Devuelve la posición (número) del carácter “t” en la cadena Cad, comenzando la búsqueda a partir de la posición “Inicio”
- Length(Cad) …. Devuelve el número de caracteres contenido en Cad (se toma en cuenta el espacio en blanco que esté antes, después o en medio de la cadena.
- Mid(Cad,Inicio, nro) … Extrae la subcadena de “nro” caracteres contenida en Cad, empezando en Inicio.

Ejemplos

Supongamos que:
La variable Codigo contiene: "20070678"
La variable Nombres contiene:"Condor Lujan, Yacole Serguei"
<
Vamos a extraer: El Año, el orden de mérito, Apellido Paterno, Apellido Materno y Nombres

- Left(Codigo,4) …… Extrae el año de ingreso (en lugar de 4 se puede usar variable)
- Right(Codigo,4) …… Extrae el orden de mérito, los 4 caracteres de la derecha
- Instr(Nombres,” ”) … Devuelve el número 7 (posición del espacio en blanco, comenzando en 1
- Instr(Nombres,”,”) … Devuelve el valor 13 (posición de la “,” en la cadena Nombres.
- InStr(InStr(nombres, ",") + 1, nombres, " ") ' ... la búsqueda lo inicia más allá de la coma
- Mid(Codigo,1,4) ' … Extrae el código
- Mid(Nombres,1,6) 'Extraer el apellido paterno
- Mid(Nombres,1,Instr(Nombres,” “)-1) ' Extrae el apellido paterno
- Mid(Nombres,1,Instr(Nombres,”,”)-1) ' Extrae los dos apellidos
- Mid(Nombres, InStr(InStr(nombres, ",") + 1, nombres, " ")) ' Extrae el primer nombre.
 

Adicional a estas funciones para el manejo de cadenas, debemos tomar en cuenta la función VAL(...) que convierte a valor numérico una cadena de números. La función TRIM(...) elimina los espacios en blanco al inicio y final de la cadena. Si hubiera más de un espacio al interior de una cadena, también lo reduce a uno.

Vamos codificar este procedimiento

Abra el archivo "Mis Macros.xlsm" o haga clic aquí
 

Vaya al editor e inserte un nuevo módulo que debe ser "Módulo6". En ella digite el siguiente procedimiento:

Sub Cadenas()

Dim Cad As String ' Definimos a Cad para conntener una cadena de caracteres
Dim X, Y As Variant ' Definimos a X e Y como de tipo variant de forma que se
' se los pueda usar como cadena y como valor numérico
Dim Anno, Mes, Dia, NroIng As Integer ' Los definimos de tipo entero
'
Cad = InputBox("Ingrese el dato:") ' Leemos el código de alumno
' De Cad extraemos el año y el Nro de ingreso, ambos de tipo String
Anno = Left(Cad, 4)
NroIng = Right(Ca, 4)
' Los convertimos en valores numéricos
Anno = Val(Anno)
NroIng = Val(NroIng)
' Se imprime en pantalla las dos variables
MsgBox ("Orden de mérito: " & NroIng & " , " & "Año: " & Anno)
' Porsupuesto que también leer y convertir en valor numérico a la vez
' Por ejemplo si se lee una fecha en formato: DD/MM/AAAA, podemos separar Año,mes y día en numérico
Cad = InputBox("Ingrese la fecha en formato DD/MM/AAAA")
Dia = Val(Left(Cad, 2))
Mes = Val(Mid(Cad, 4, 2))
Anno = Val(Right(Cad, 4))
' Ahora lo imprimimos en pantalla
MsgBox ("La fecha ingresada fue: " & Cad)
MsgBox ("Corresponde al " & Dia & " del mes " & Mes & " del año " & Anno)
'
' Pasemos a leer cadenas de datos separados por comas
Cad = InputBox("Ingresa el dato")
X = Val(Mid(Cad, 1, InStr(Cad, ";") - 1)) ' De Cad se extrae desde el primer caracter hasta antes de la posición del ";"
Y = Val(Mid(Cad, InStr(Cad, ";") + 1)) ' Aquí se extrae desde un caracter después del ";" hasta terminar la cadena
' Se imprime lo leído
MsgBox ("X = " & X & " Y = " & Y)

End Sub
 

La siguiente imagen contiene este procedimiento

En la siguiente sesión veremos otros ejemplos con funciones que nos permiten el manejo de cadenas, para ello haga clic aquí