Hola a todos,
Hace prácticamente un año desde que publiqué este post: CONTAR CELDAS POR COLOR EN EXCEL CON TYPESCRIPT y todavía a fecha de hoy no he podido mejorar su programación ni hacerla más rápida.
Se trata de contar el número de celdas por color en Excel Online usando typescript. Y es que, a pesar de tener esperanzas de hacerlo con una función, todavía seguimos sin poder hacerlo (o por lo menos yo no lo he conseguido). Aunque el problema fundamental radica en su velocidad y me explico. Para ser capaces de recorrer todas las celdas y obtener el color de cada una de ellas, solo lo podemos hacer con un for y no con un forEach (que sería la mejor solución). Al tener que realizar esto con un for y teniendo en cuenta rangos con más de una columna, debemos utilizar loops anidados. Pero sigue sin ser el problema fundamental de ralentización. El problema es que para obtener el color de cada celda se tarda una eternidad:
let MiRangoColor = MiHoja.getCell(nFila, nColumn).getFormat().getFill().getColor();
Este es el problema, cada comprobación tarda demasiado tiempo y origina que en rangos medios o grandes sea un proceso muuuuuuuy largo.
A diferencia del post anterior, he decidido programar un nuevo loop por si necesitamos obtener el número de otras celdas con color en el mismo proceso:

Para realizarlo el código propuesto es el siguiente:
async function main(workbook: ExcelScript.Workbook) {
let MiHoja = workbook.getWorksheet("Hoja1");
let MiRango = MiHoja.getRange("A2:F7");
let MiRangoC = MiHoja.getRange("H2:M2");
let Fin = MiRango.getRowCount();
let Final = MiRango.getColumnCount();
let FinalC = MiRangoC.getColumnCount();
//capturamos formato del color de cada celda a comparar
for (let r = 0; r < FinalC; r++) {
let MiColor = MiHoja.getCell(1, 7 + r).getFormat().getFill().getColor();
//creamos contadores
let nFila = 0;
let nColumn = 0;
let nItem = 0;
// Creamos bucle anidado para procesar todas las filas de cada columna
for (let i = 0; i < Final; i++) {
for (let j = -1; j < Fin; j++) {
//Obtenermos formato de color de cada celda
//let MiRangoColor = MiHoja.getRangeByIndexes(nFila, nColumn, 1, 1).getFormat().getFill().getColor();
let MiRangoColor = MiHoja.getCell(nFila, nColumn).getFormat().getFill().getColor();
// SI el formato es igual al de la celda I2 enconces contamos
if (MiRangoColor == MiColor) {
nItem = nItem + 1
}
nFila = nFila + 1
}
nFila = 0
nColumn = nColumn + 1
}
//Pasamos el resultado a la celda D3
MiHoja.getCell(2, 7 + r).setValues([
[nItem]
])
}
}
Aunque he utilizado muchos loops y variables, en realidad no es excesivamente complejo. para obtener el color de las celdas se puede hacer con los métodos: .getRangeByIndexes( ) o .getCell( ) en el script os he dejado uno de ellos comentado.
El resultado es el siguiente:

Y esto es todo!. Dejo constancia en este post la problemática comentada. DEMASIADO LENTO!!!. No obstante, si alguien sabe o conoce otra alternativa estaría agradecido de leerla.
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡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