22 abril, 2021

PASAR CADENA DE TEXTO A UN ARRAY Y PASAR ARRAY A UN RANGO O A UNA CELDA CON TYPESCRIPT

Hola a todos:

Una de las técnicas con las que más me gusta trabajar en VBA es creando cadenas de texto y pasando información a matrices para conseguir así transformar los datos.

En typescript se puede seguir un esquema de trabajo más o menos parecido en su estructura. Por ejemplo imaginemos que tenemos estos datos en una columna de nuestra hoja:

y solicitan lo siguiente:

  • En la columna B desde A2 en adelante todos los números de la columna A comprendidos entre el 0 y el 8. No pueden quedar celdas intercaladas en blanco.
  • En la columna C el resultado de aplicar los siguientes condicionales sobre esos números: Si es menor o igual a 1, entonces el valor es 1000, si es mayor que 1 y menor o igual a 3 entonces el valor es 3000, si es mayor que 3 y menor o igual 5 entonces el valor es 5000, si es otro número entonces es 10000.
  • Para finalizar, en la Hoja2 en las celdas A2 y A3 colocar las dos columnas generadas (B y C) de la hoja1. Es decir pasar ambos rangos a cada una de las celdas.

Aunque parezca un sinsentido y algo rebuscado es un ejercicio muy interesante para aprender a crear cadenas (string), pasar los datos a una matriz (array) y luego devolver la información a una celda.

Para hacer todo esto, os propongo la siguiente programación:

async function main(workbook: ExcelScript.Workbook) {
	let MiHoja = workbook.getWorksheet("Hoja1");
	let MiRango = MiHoja.getUsedRange();
	let Fin = MiRango.getRowCount();
	let Info = MiHoja.getRangeByIndexes(1, 0, Fin, 1).getValues();
	//Limpiamos contenidos de la hoja1
	MiHoja.getRangeByIndexes(1, 1, Fin, 4).clear(ExcelScript.ClearApplyTo.all);
	// iniciamos loop y aplicamos condiciones
	let nNum: number;
	for (let i = 0; i < Fin - 1; i++) {
		let MiInfo = Info[i];
		if (MiInfo[0] <= 1) {
			nNum = 1000
		} else if (MiInfo[0] > 1 && MiInfo[0] <= 3) {
			nNum = 3000
		} else if (MiInfo[0] > 3 && MiInfo[0] <= 5) {
			nNum = 5000
		} else {
			nNum = 10000
		}
		// Pasamos a la cadena unicamente los elementos entre 0 y 8
		// y las condiciones aplicadas
		if (MiInfo[0] >= 0 && MiInfo[0] <= 8) {
			var sCadena = sCadena + " " + nNum;
		}
		if (MiInfo[0] >= 0 && MiInfo[0] <= 8) {
			var dCadena = dCadena + " " + MiInfo[0];
		}
	}
	// eliminamos de cada cadena el espacio en blanco creado al concatenar
	let MiCadena1 = dCadena.substring(10).split(" ", Fin);
	let MiCadena2 = sCadena.substring(10).split(" ", Fin);
	//Pasamos matriz con los resultados a la hoja
	for (let j = 0; j < MiCadena1.length; j++) {
		MiHoja.getCell(j + 1, 1).setValues([
			[MiCadena1[j]]
		]);
	}
	for (let j = 0; j < MiCadena2.length; j++) {
		MiHoja.getCell(j + 1, 2).setValues([
			[MiCadena2[j]]
		]);
	}
	//En la hoja 2 borramos información previa
	let MiHoja2 = workbook.getWorksheet("Hoja2");
	MiHoja2.activate();
	MiHoja2.getRangeByIndexes(1, 0, 3, 1).clear(ExcelScript.ClearApplyTo.all);
	//Pasamos el contenido de la matriz numeros a A2 de Hoja2
	let strNum = MiCadena1.join(" ");
	MiHoja2.getCell(1, 0).setValues([
		[strNum]
	])
	//Pasamos el contenido de la matriz numeros a A3 de Hoja2
	let strCond = MiCadena2.join(" ");
	MiHoja2.getCell(2, 0).setValues([
		[strCond]
	])
}

El resultado es, en la hoja1:

Ampliadas las columnas para comprobar los condicionales:

Si examináis el código podréis ver como se generan las cadenas (string):

if (MiInfo[0] >= 0 && MiInfo[0] <= 8) {
			var sCadena = sCadena + " " + nNum;
		}
		if (MiInfo[0] >= 0 && MiInfo[0] <= 8) {
			var dCadena = dCadena + " " + MiInfo[0];
		}

y la técnica para pasar las matrices a la hoja:

for (let j = 0; j < MiCadena1.length; j++) {
		MiHoja.getCell(j + 1, 1).setValues([
			[MiCadena1[j]]
		]);
	}
	for (let j = 0; j < MiCadena2.length; j++) {
		MiHoja.getCell(j + 1, 2).setValues([
			[MiCadena2[j]]
		]);
	}

Por último tenemos la parte que pasa el contenido de las dos matrices a las dos celdas:

//Pasamos el contenido de la matriz numeros a A2 de Hoja2
	let strNum = MiCadena1.join(" ");
	MiHoja2.getCell(1, 0).setValues([
		[strNum]
	])
	//Pasamos el contenido de la matriz numeros a A3 de Hoja2
	let strCond = MiCadena2.join(" ");
	MiHoja2.getCell(2, 0).setValues([
		[strCond]
	])

Y como podéis observar es un código extenso en el que he tratado de incorporar varios elementos en el mismo ejemplo.

Y esto es todo, espero que os haya resultado de interés.

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies