2011-12-09 28 views
7

Al obtener valores de un rango en Excel, es mucho más eficiente obtener los valores en "bulk" (como una matriz 2D) que recorrer cada fila y columna. Por ejemplo:VSTO: obtener propiedades de celda de Excel en "bulk"

Dim range = Globals.Table.Range("A1:E5") 
Dim values(,) As Object = range.Value 

Con 25 células que no hace mucha diferencia, pero con 10.000 filas por 20 columnas ciertamente lo es. Hasta aquí todo bien.

Mi pregunta es: ¿alguien ha encontrado una forma de hacer el mismo tipo de búsqueda "a granel" para otras propiedades? Por ejemplo, quiero encontrar qué celdas están coloreadas de cierta manera. Me encantaría hacer algo como "range.Interior.Color", pero eso devuelve solo un valor de, no una matriz de valores. Y así termino bucleando, que es probablemente 100 o incluso 1000 veces más lento. Para mesas grandes, esto es realmente un asesino.

PD: Parece que .Fórmula se comporta igual que .Valor: puedo buscar varias a la vez. Pero todavía tengo que engatusar a los colores para que se jueguen bien.

¡Agradezco su ayuda!

Respuesta

5

No creo que pueda obtener esas propiedades como una matriz debido a cómo Excel almacena esa información. Excel no almacena el formato de cada celda individualmente, sino que almacena una combinación particular de formatos junto con una "lista" interna de los rangos que usan ese formato.

Puede obtener una idea de cómo se almacena el formato creando un archivo de prueba pequeño con varios formatos y guardándolo como formato XML (en 2010 al menos, debe usar "XML Spreadsheet 2003").

Esto article también puede ayudar.

+0

+1 buen puesto Rachel. – brettdj

+0

¿Sabe por casualidad si hay alguna forma de acceder a la referencia de estilo de la celda ('StyleID') que puedo ver en el archivo XML de VBA/VSTO? En este caso, se pueden leer todos los datos de estilo de Excel y luego asignar cada celda a su estilo con solo una llamada de interoperabilidad por celda. –

4

"Quiero encontrar que las células se colorean de cierta manera"

en VBA puede ejecutar una rutina rápida utilizando el método Find que busca por formato. Por ejemplo, para encontrar todas las celdas con el mismo color de fuente de celda y el mismo color de interior que la celda en A1. Supongo que se puede usar algo similar en VSTO

Sub FindFormat() 
    Dim rng1 As Range 
    Dim rng2 As Range 
    Dim strAddress As String 
    With Application.FindFormat 
     .Interior.ColorIndex = [a1].Interior.ColorIndex 
     .Font.Color = [a1].Font.Color 
    End With 
    Set rng1 = Cells.Find("", [a1], xlFormulas, , , , , , True) 
    If Not rng1 Is Nothing Then 
     strAddress = rng1.Address 
     Set rng2 = rng1 
     Do 
      Set rng1 = Cells.Find("", rng1, xlFormulas, , , , , , True) 
      Set rng2 = Union(rng1, rng2) 
     Loop While rng1.Address <> strAddress 
     MsgBox "Range similar format to A1 is " & rng2.Address 
    End If 
End Sub 

enter image description here

+1

Directo a usted, @brettdj. Sabía que había una manera de hacerlo en VBA. Gracias por compartir el código. –

+0

Gracias, @brettdj! Es un enfoque ordenado, aunque el "Encontrar" de Excel todavía es bastante lento (sé por los valores, al menos, era mucho mejor guardar el arreglo 2D, y luego buscarlo yo mismo). Sin embargo, en lo que respecta a la búsqueda de colores, el código que proporcionó es bueno si solo va a haber unas pocas celdas de color. Sin embargo, si va a haber varios cientos, el sistema se atasca, probablemente debido a la dirección y la operación de la unión. Probablemente haya formas de hacerlo más eficiente, pero, según la respuesta de Rachel, parece que no hay una manera verdaderamente eficiente. ¡Pero gracias de cualquier manera! –

+0

@MichaelZlatkovsky Buscar suele ser muy rápido para los valores a menos que tenga una cantidad enorme, pero acuerde que, para formatearlo, podría ser un resultado prolongado dependiendo del tamaño de su archivo. Existen otras soluciones que puede ejecutar utilizando XLM para detectar algunas propiedades de celda, consulte http://xcell05.free.fr/morefunc/english/xlm.lire.cellule.htm. – brettdj

Cuestiones relacionadas