2010-03-26 8 views

Répondre

2

Qu'en est-il en utilisant Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing) puis analyser la chaîne de résultat ou utiliser une expression régulière pour obtenir la tête de colonne?

J'ai simplement utilisé:

string location = Application.ActiveCell.get_Address(true, true, Excel.AlReferenceStyle.xlA1, missing, missing); 
string tokens = x.Split("$".ToCharArray()); 
MessageBox.Show(String.Format("Column {0}", result[0])); 
+2

Ce code est erroné. Voici une version corrigée: \t \t var location = sheet.Range ["A1"]. Décalage [0, columnNumber - 1] .Address [true, true, XlReferenceStyle.xlA1, manquant, manquant]; \t \t \t var tokens = location.Split ('$'); \t \t \t retourner les jetons [1]; –

+0

@PhredMenyhert votre code retournera seulement 'B' – sam

4
public static string GetColumnName(int columnNumber) 
{ 
    const string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    string columnName = ""; 

    while (columnNumber > 0) 
    { 
     columnName = letters[(columnNumber - 1) % 26] + columnName; 
     columnNumber = (columnNumber - 1)/26; 
    } 

    return columnName; 
} 
+1

hmm .. et s'il y a plus de 26 colonnes? AA, AB, AC etc – Ahmad

+0

excuses..J'ai réalisé que cela fonctionne .. http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel- column-eg-aa – Ahmad

0

Ce qui suit est une méthode complète qui vous donne l'alphabet correspondant à une valeur entière qui est passé.

private String Number2String(int number, bool isCaps) 
    { 
     int number1 = number/27; 
     int number2 = number - (number1 * 26); 
     if (number2 > 26) 
     { 
      number1 = number1 + 1; 
      number2 = number - (number1 * 26); 
     } 
     Char a = (Char)((isCaps ? 65 : 97) + (number1 - 1)); 
     Char b = (Char)((isCaps ? 65 : 97) + (number2 - 1)); 
     Char c = (Char)((isCaps ? 65 : 97) + (number - 1)); 
     string d = String.Concat(a, b); 
     if (number <= 26) 
      return c.ToString(); 
     else 
      return d; 
    } 
1
public static long GetColumnNumber(string columnName) 
{ 
    int letterPos = 0; 
    long columnNumber = 0; 
    for (int placeHolder = columnName.Length - 1; placeHolder >= 0; placeHolder--) 
    { 
     int currentSum = 1; 
     for (int multiplier = 0; multiplier < placeHolder; multiplier++) 
      currentSum *= 26; 
     int letterValue = (int) columnName[letterPos]; 
     currentSum *= letterValue - 64; 
     columnNumber += currentSum; 
     if (letterPos != columnName.Length) 
      letterPos++; 
     //Console.WriteLine(((int)columnName[i]-64) + " = " + columnName[i]); 
    } 
     return columnNumber; 
} 
+0

Cette méthode fonctionne correctement seulement quand columnName est la chaîne capitale, pour une raison quelconque b n'est pas B. D'où column.Name.ToUpper() est requis. – Jim

0

J'utilise ces deux:

public string GetExcelColumn(int index) 
{ 
    int quotient = index/26; 

    if (quotient > 0) 
     return GetExcelColumn(quotient - 1) + (char)((int)'A' + (index % 26)); 
    else 
     return "" + (char)((int)'A' + index); 
} 

static IEnumerable<string> GetExcelColumns() 
{ 
    var alphabet = new string[]{""}.Union(from c in Enumerable.Range((int)'A', 26) select Convert.ToString((char)c)); 

    return from c1 in alphabet 
      from c2 in alphabet 
      from c3 in alphabet.Skip(1)     // c3 is never empty 
      where c1 == string.Empty || c2 != string.Empty // only allow c2 to be empty if c1 is also empty 
      select c1 + c2 + c3; 
} 
0

Cela fonctionne bien en VBA en utilisant un double remplacer, où R est une seule cellule Excel Range:

ColumnLetter = Replace(Replace(R.AddressLocal(ReferenceStyle:=1), "$", vbNullString), R.Row, vbNullString) Il est basé sur l'idée équivalente à utiliser sur une feuille de travail. Dans une formule de cellule utilise cela, il est encore plus court:

=SUBSTITUTE(ADDRESS(1,COLUMN(M1),4),1,"") 

Cela renvoie la lettre M et travaille jusqu'à la colonne XFD. La référence de cellule M1 peut être n'importe quelle plage n'importe où. La colonne en haut à gauche est retournée pour Ranges ou plus d'une cellule.

Il obtient l'ADRESSE de la première cellule dans la colonne, puis supprime la fin 1 en lui substituant un NullString. (Le 4 dans l'ADRESSE s'assure que l'Adresse est retournée comme une Adresse Relative, c'est-à-dire une sans et $ signe dedans.)

Merci à barry houdini qui m'a mis en quête d'une bonne réponse à cela.

Questions connexes