2011-12-09 26 views
7

Quando si recuperano valori da un intervallo in Excel, è molto più efficiente ottenere i valori in "bulk" (come array 2D) rispetto al ciclo di ogni riga e colonna. Ad esempio:VSTO: acquisizione delle proprietà della cella di Excel in "bulk"

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

Con 25 celle non fa molta differenza, ma con 10.000 righe per 20 colonne si fa certamente. Fin qui tutto bene.

La mia domanda è: qualcuno ha trovato un modo per fare lo stesso tipo di recupero "alla rinfusa" per altre proprietà? Ad esempio, voglio trovare quali celle sono colorate in un certo modo. Mi piacerebbe fare qualcosa come "range.Interior.Color", ma che restituisce solo un valore, non una matrice di valori. E così finisco il ciclo, che è probabilmente 100 o anche 1000 volte più lento. Per i tavoli di grandi dimensioni, questo è davvero un killer.

PS: Sembra che Moltula si comporti proprio come. Valore: posso recuperarne più uno alla volta. Ma devo ancora convincere i colori a giocare bene.

Apprezzo il vostro aiuto!

risposta

5

Non penso che sia possibile ottenere tali proprietà come matrice a causa del modo in cui Excel memorizza tali informazioni. Excel non memorizza singolarmente la formattazione per ogni cella ma memorizza una particolare miscela di formati insieme a un "elenco" interno degli intervalli che utilizzano tale formato.

È possibile avere un'idea di come viene archiviata la formattazione creando un piccolo file di prova con vari formati e salvandolo come formato XML (almeno nel 2010, è necessario utilizzare "XML Spreadsheet 2003").

Questo article può anche aiutare.

+0

+1 bel post Rachel. – brettdj

+0

Ti capita di sapere se c'è un modo per accedere al riferimento di stile della cella ('StyleID') che posso vedere nel file XML da VBA/VSTO? In questo caso è possibile leggere tutti i dati di stile da Excel e quindi mappare ogni cella al suo stile con una sola chiamata Interop per cella. –

4

"Voglio trovare quale le cellule sono colorate in un certo modo"

in VBA è possibile eseguire una routine rapido utilizzando il metodo Find che cerca per formato. Ad esempio, per trovare tutte le celle con lo stesso colore del carattere della cella e il colore interno della cella in A1. Presumo che si può usare qualcosa di simile in 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

Proprio a te, @brettdj. Sapevo che c'era un modo per farlo in VBA. Grazie per aver condiviso il codice. –

+0

Grazie, @brettdj! È un approccio pulito, anche se il "Trova" di Excel è ancora piuttosto lento (lo so per i valori, almeno, stavo molto meglio memorizzando l'array 2D, e poi cercandone personalmente). Per quanto riguarda la ricerca di colori, però, il codice che hai fornito è buono se ci saranno solo poche celle colorate. Se ci saranno diverse centinaia, però, il sistema si impantanerà, probabilmente a causa dell'indirizzo e dell'operazione sindacale. Ci sono probabilmente dei modi per renderlo più efficiente, ma, come per la risposta di Rachel, sembra che non ci sia un modo veramente efficace. Ma grazie comunque! –

+0

@MichaelZlatkovsky Find è in genere molto veloce per i valori, a meno che tu non abbia una quantità enorme, ma concordi sul fatto che per la formattazione questo potrebbe essere un lungo risultato a seconda delle dimensioni del tuo file. Esistono altre soluzioni alternative che è possibile eseguire utilizzando XLM per rilevare alcune proprietà della cella, vedere http://xcell05.free.fr/morefunc/english/xlm.lire.cellule.htm – brettdj

Problemi correlati