2010-04-13 16 views
8

come posso ottenere l'indirizzo della cella da Excel dato un numero di riga e di colonna, ad esempioCome posso ottenere l'indirizzo della cella da Excel

riga 2 e Col 3 dovrebbe restituire C2 ... Please help

+0

Vedi anche: http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into- an-excel-column-eg-aa – Graham

risposta

10

Non sono un grande utente di VSTO C# - Di solito scelgo VBA. Tuttavia, la seguente coppia di funzioni potrebbe essere utile per te. Incerto se possono essere semplificate ancora un po ':

public string RangeAddress(Excel.Range rng) 
{ 
    return rng.get_AddressLocal(false, false, Excel.XlReferenceStyle.xlA1, 
      missing, missing); 
} 
public string CellAddress(Excel.Worksheet sht, int row, int col) 
{ 
    return RangeAddress(sht.Cells[row, col]); 
} 

Il RangeAddress avrà qualsiasi intervallo di Excel e si gettano di nuovo l'indirizzo. Se si desidera lo stile assoluto (con i simboli del dollaro, ad esempio $ C $ 3), è necessario modificare i primi due parametri della chiamata get_AddressLocal su true, true.

Per ottenere l'indirizzo della cella da una coppia riga/colonna, è possibile utilizzare CellAddress. Ha bisogno di un foglio per ottenere l'indirizzo. Tuttavia, è possibile scambiare in (Excel.Worksheet)ActiveSheet se non si desidera fornire un foglio (questo potrebbe non funzionare o meno, a seconda di ciò che è stato aperto nella sessione VSTO).

0

Puoi in qualche modo chiamare le formule o le funzioni native di Excel che duplicano le loro funzionalità? Sarebbe solo

=CELL("address") 
-1
public string GetCellAddress(int row, int col) { 
     return (char)((int)'A' + (row - 1)) + col.ToString(); 
} 
+0

Grazie a Timores ... non è possibile ottenerlo da Excel Interop Object ??? – Sathish

+0

Questa sarebbe la risposta di @ Alastair. – Timores

+0

Questo restituirà il valore errato: la riga 1 colonna 27 restituirà A27 che sarebbe la colonna 1 riga 27. Basta commutare riga e colonna restituirà [1 che è anche sbagliato. Corretto sarebbe AA1. –

2

Questo (non testato) dovrebbe funzionare anche con gli indirizzi di colonna sopra che sono più di 26:

using System.Text; 

public string GetCellAddress(int row, int col) { 
    StringBuilder sb = new StringBuilder(); 
    col--; 
    do { 
     sb.Insert(0, (char)('A' + (col % 26))); 
     col /= 26; 
    } while (col > 0); 
    sb.Append(row); 
    return sb.ToString(); 
} 

Corretto: l'indirizzo di colonna era indietro

+3

Ciò restituirà BA1 per col 27 anziché AA1. –

0

Cells (2, 3) .Address

3

Basta un miglioramento, il col-- era nel posto sbagliato

static string GetCellAddress(int row, int col) 
    { 
     StringBuilder sb = new StringBuilder(); 

     do 
     { 
      col--; 
      sb.Insert(0, (char)('A' + (col % 26))); 
      col /= 26; 
     } while (col > 0); 
     sb.Append(row); 
     return sb.ToString(); 
    } 
0

sto usando indice di riga e di colonna in base zero. Quindi ho dovuto adattare il codice delle risposte precedenti al seguente. Ci sono voluti alcuni tentativi per ottenere questo diritto per tutti gli indirizzi possibili i.E. A1, Z2, AA2, ZZ10, ...

public string GetAddress(int col, int row) 
    { 
     col++; 
     StringBuilder sb = new StringBuilder(); 
     do 
     { 
      col--; 
      sb.Insert(0, (char)('A' + (col % 26))); 
      col /= 26; 

     } while (col > 0); 
     sb.Append(row + 1); 
     return sb.ToString(); 
    } 
Problemi correlati