IMPORTANTE: Este post ha sido actualizado al nuevo modelo del API, los cambios son significativos y necesarios para que el código funcione, por favor, después de leer la publicación completa, visita el nuevo post: OBTENER VALORES ÚNICOS CON TYPESCRIPT: CONVIRTIENDO SCRIPT ASÍNCRONO HEREDADO AL MODELO ACTUAL

Hola a todos:

En Excel Signum hay varios post dedicados a obtener valores únicos o a eliminar duplicados (que es lo mismo) pero en VBA.

Hay que tener en cuenta que cuando hablo de obtener valores únicos no me refiero al típico comando de la cinta de opciones de eliminar duplicados de una rango seleccionado o a ejecutar la fórmula Unicos() ahora disponible en Excel.

Lo que quiero decir con obtener únicos es que a partir de una cadena alfanumérica (string), delimitada por espacios, comas, etc. generemos otra pero sin elementos repetidos. Una nueva cadena que guardaremos en una variable y que podremos utilizar según nuestras necesidades.

En TypeScript, si bien existen diferencias, es posible realizar una programación que nos permita obtener únicos a partir de una cadena de texto. En el ejemplo que os voy a mostrar generaré una cadena con los valores de un rango de celdas:

Aunque el ejercicio en realidad es eliminar duplicados en la columna y pasar la nueva cadena a un Array, en este ejemplo pasaré también los resultados a la columna B.

Para hacerlo utilizaré el siguiente código:

async function main(context: Excel.RequestContext) {
	let MiHoja = context.workbook.worksheets.getActiveWorksheet();
	let MiRango = MiHoja.getUsedRange().load("Values, rowCount");
	await context.sync();
	let Fin = MiRango.rowCount;
	let Info = MiHoja.getRangeByIndexes(0, 0, Fin, 1).load("values")
	await context.sync();
	//Con el bucle for creamos una cadena separada
	//por espacios
	for (let i = 0; i < Fin; i++) {
		let MiInfo = Info.values[i];
		var sCadena = sCadena + " " + MiInfo;
	}
	// Como el inicio de la cadena es un valor "undefined"
	// lo eliminamos con substring(10)
	var MiArray = sCadena.substring(10).split(" ", Fin);
	//Obtenemos únicos
	var Unicos = Array.from(new Set(MiArray));
	//Pasamos matriz con los resultados a la hoja
	for (var j = 0; j < Unicos.length; j++) {
		console.log(Unicos[j]);
		MiRango.getCell(j, 1).values = [
			[Unicos[j]]
		];
	}
}

Básicamente utilizo un For para crear la cadena con las celdas del rango seleccionado. El separador utilizado es un espacio en blanco » «:

for (let i = 0; i < Fin - 1; i++) {
		let MiInfo = Info.values[i];
		var sCadena = sCadena + " " + MiInfo;
	}

Esta cadena tiene la particularidad de estar encabezada por un valor «undefined «, para eliminarlo, debemos utilizar un substring (subcadena) que eliminará los 10 primeros caracteres, es decir «undefined «

var MiArray = sCadena.substring(10).split(" ", Fin);

Con esto ya tendríamos la cadena generada pero aún con duplicados, para eliminarlos utilizaremos:

var Unicos = Array.from(new Set(MiArray));

Que creará una matriz donde se almacenarán los valores únicos.

Si necesitamos pasar los resultados a la hoja (como es el caso), utilizamos de nuevo un for para colocar cada elemento de la matriz en la celda correspondiente:

for (var j = 0; j < Unicos.length; j++) {
    console.log(Unicos[j]);
    MiRango.getCell(j, 1).values = [[Unicos[j]]];

El resultado es este:

Como podéis comprobar, finalmente hemos conseguido lo que estábamos buscando. Este código es uno de los primeros que genero en TypeScript, por lo que considero que es posible que existan métodos más eficientes que no haya tenido en cuenta. Si es así, disculpadme.

No quiero dejar de mencionar otra forma de generar Unicos pero que no tiene nada que ver con lo que os he mostrado, se trata de programar en TypeScript el método RemoveDuplicates, que elimina los duplicados de un rango (sobre el rango).

async function main(context: Excel.RequestContext) {
var MiHoja = context.workbook.worksheets.getItem("Hoja1");
    var MiRango = MiHoja.getRange("D1:D16");
    var deleteResult = MiRango.removeDuplicates([0],true);
    deleteResult.load();
}

Pero me gusta incluir el ejemplo aquí, dado que estamos tratando sobre valores únicos y eliminar duplicados.

Y esto es todo!. Espero que os haya gustado este segundo post sobre TypeScript.

A mí me está resultado muy interesante aprender este lenguaje.

¿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