2013-06-13 7 views
7

Quello che ho è un foglio con i dati e voglio definire un intervallo non contiguo che può essere utilizzato, ad esempio, per creare un grafico.Delphi - Excel: definire un intervallo non contiguo

Finché l'intervallo è rettangolare, è molto semplice definire la gamma.

range := ASheet.Range['A1', 'B10']; 

Questo crea un intervallo rettangolare con l'angolo superiore sinistro in A1 e in basso a destra in B10. Il problema è quando i dati non sono definiti in modo che possano essere selezionati con un singolo rettangolo.

Come esempio abbiamo questi dati:

+-------+------+------+------+------+ 
| Time | Col1 | Col2 | Col3 | Col4 | 
+-------+------+------+------+------+ 
| 01:20 | 5 | 1 | 101 | 51 | 
| 01:21 | 6 | 1 | 101 | 51 | 
| 01:22 | 5 | 0 | 101 | 51 | 
| 01:23 | 5 | 0 | 101 | 51 | 
| 01:24 | 5 | 0 | 101 | 55 | 
| 01:25 | 5 | 1 | 101 | 55 | 
| 01:26 | 6 | 1 | 101 | 15 | 
| 01:27 | 7 | 2 | 101 | 15 | 
| 01:28 | 7 | 2 | 101 | 15 | 
+-------+------+------+------+------+ 

Se io per esempio desidero creare un grafico per tempo, Col1 e Col2 quindi la gamma è semplicemente ASheet.Range['A1', 'C10']. Se voglio creare il grafico per Time, Col1, Col3 e Col4 non è possibile creare un intervallo in questo modo (poiché Col2 non dovrebbe essere incluso).

In VBA è possibile creare l'intervallo desiderato semplicemente .Range("A1:B10,D1:E10"). Sfortunatamente non sembra esserci un modo equivalente per definire un intervallo in Delphi (Excel2010), infatti sembra che supporti solo la gamma con il formato .Range[topLeft, bottomRight].

La mia domanda è: Come definire un intervallo non contiguo in Delphi?

risposta

9

Dopo ore e ore di googling mi sono imbattuto nella parte chiave: Application.Union, durante la lettura attraverso il documentation for Range object per l'ennesima volta.

La soluzione consiste nell'utilizzare il metodo dell'oggetto Excel Union per creare un'unione di due intervalli contigui per definire un nuovo intervallo, che può essere non contiguo.

Esempio:

ExcelApp := TExcelApplication.Create(..); 
... 
Range1 := Sheet.Range['A1', 'B10']; 
Range2 := Sheet.Range['D1', 'E10']; 

Range := ExcelApp.Union(Range1, Range2); 
+2

+1; buona soluzione. Posso riferire alla frustrazione della ricerca (: –

+0

Collegamenti ad altre versioni di Excel della stessa funzione: [Excel 2013 Application.Union] (http://msdn.microsoft.com/en-us/library/office/ff834621 (v = office.15) .aspx); [Excel 2010 Application.Union] (http://msdn.microsoft.com/en-us/library/office/ff834621 (v = office.14) .aspx); [Applicazione Excel 2007 .Union] (http://msdn.microsoft.com/en-us/library/office/bb178176 (v = office.12) .aspx); [Excel 2003 Application.Union] (http://msdn.microsoft. com/it-it/library/ufficio/aa213609 (v = office.11) aspx); –