2010-04-13 8 views
8

Wie kann ich die Adresse der Zelle aus Excel erhalten eine Zeilen- und Spaltennummer zum Beispiel gegebenWie kann ich die Adresse der Zelle aus Excel erhalten

Zeile 2 und Spalte 3 sollte C2 zurückkehren ... helfen Bitte

+0

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

Antwort

10

Ich bin kein großer Benutzer von VSTO C# - ich entscheide mich normalerweise für VBA. Das folgende Funktionspaar könnte jedoch für Sie nützlich sein. Unsicher, ob sie etwas mehr rationalisiert werden:

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]); 
} 

Die RangeAddress nehmen jeden Excel-Bereich und die Adresse zurück zu werfen. Wenn Sie den absoluten Stil (mit Dollarzeichen, z. B. $ C $ 3) möchten, müssen Sie die ersten beiden Parameter des Aufrufs get_AddressLocal in true, true ändern.

Um die Zellenadresse aus einem Zeilen-/Spaltenpaar zu erhalten, können Sie CellAddress verwenden. Es braucht ein Blatt, um die Adresse zu erhalten. Sie können jedoch (Excel.Worksheet)ActiveSheet austauschen, wenn Sie kein Blatt zur Verfügung stellen möchten (dies kann oder kann nicht funktionieren, je nachdem, was Sie in Ihrer VSTO-Sitzung geöffnet haben).

0

Können Sie irgendwie die nativen Formeln oder Funktionen von Excel aufrufen, die ihre Funktionalität duplizieren? Es wäre nur

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

Danke Timores ... ist es nicht möglich, es von Excel Interop Objekt zu bekommen ??? – Sathish

+0

Das wäre @ Alastairs Antwort. – Timores

+0

Dies wird den falschen Wert zurückgeben: Zeile 1 Spalte 27 wird A27 zurückgeben, was Spalte 1 Zeile 27 wäre. Nur die Zeilen- und Spaltenumschaltung wird zurückgegeben [1, was auch falsch ist. Richtig wäre AA1. –

2

Dieser (ungetestet) sollte auch mit Spaltenadressen über, die älter als 26 arbeiten:

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(); 
} 

Korrigiert: die Spaltenadresse war rückwärts

+3

Dies wird BA1 für Spalte 27 statt AA1 zurückgeben. –

0

Zellen (2, 3) .Address

3

Nur eine Verbesserung war die col-- an der falschen Stelle

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

Ich bin mit nullbasierten Zeilen- und Spaltenindex. Also musste ich den Code der vorherigen Antworten an die folgenden anpassen. Es brauchte einige Versuche und Fehler, um dies für alle möglichen Adressen 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(); 
    } 
Verwandte Themen