Reafidy's edited answer is a great start, pero quería ampliarlo más de lo que podía hacer en un comentario. sheet.get_Range(rangeselect)
es mucho más rápido que ir fila por fila, pero una cosa que no he mencionado aún es que el parámetro get_Range tiene un límite de 255 caracteres.
Para conseguir alrededor de esa limitación, construir un conjunto de rangos como "8: 8,10: 13,14: 55" como normal, entonces utilizar una variante de este código:
string rangeSelectPart;
while (rangeSelect.Length >= 255)
{
rangeSelectPart = rangeSelect.Substring(0, rangeSelect.Substring(0,255).LastIndexOf(','));
Range multiRangePart = sheet.get_Range(rangeSelectPart, Type.Missing);
//do something with the range here using multiRangePart
rangeSelect= rangeSelect.Substring(rangeSelectPart.Length + 1);
}
Range multiRange = sheet.get_Range(rangeSelect, Type.Missing);
// do the same something with the last part of the range using multiRange
// now that the remaining rows are described in less than 255 characters
Esta voluntad ser significativamente más rápido que realizar operaciones en filas individuales, pero tampoco fallará cuando se presenten grandes conjuntos de filas no contiguas.
Tenga en cuenta que el establecimiento SutharMonil's answer is way faster IFF valores en rangos rectangulares contiguos. El cuello de botella que pasa de C# a sobresalir suele ser la repetición de llamadas a través de los objetos COM que se bloquean durante la creación y actualización, y su respuesta consolida las llamadas.
Desafortunadamente en mis pruebas hasta el momento, intentar usarlo para trabajar con propiedades que no son de tipo cadena ha resultado en un error de tipo. Por ejemplo:
object[,] colors;
//use C# to set appropriate colors to each location in array...
for(int i = 0; i < colors.get_Length(0); i++){
for(int j = 0; j < colors.get_Length(1); j++){
colors[i,j] = XlThemeColor.xlThemeColorAccent6;
}
}
//below causes a type error
formatRange.Interior.ThemeColor = color;
Trataré de recordar actualizar si logro que funcione.
último para operaciones repetidas conjunto Globals.ThisAddIn.Application.ScreenUpdating = false;
y luego otra vez en cierto cuando haya terminado. Sin esto, Excel se detiene para actualizar la pantalla después de actualizar cada conjunto de propiedades de rango y eso puede agregar mucho tiempo a la operación.
Puede unir los rangos individuales, pero eso puede no ser más eficiente que usar la única llamada con la dirección concatenada. –