2009-08-13 26 views
3

J'ai besoin d'aide pour faire une logique qui convertirait une valeur numérique en valeur d'en-tête MS Excel correspondante.Convertir le nombre en colonne Excel correspondante

Par exemple:

1 = "A" 2 = "B" 3 = "C" 4 = "D" 5 = "E" ......... 25 = "Y" 26 = "Z" 27 = "AA" 28 = "AB" 29 = "AC" 30 = "AD" .........

J'apprécierais certains codes .NET (C# ou VB) pour cela. Merci.

+0

Selon le contexte, essayez: http://stackoverflow.com/questions/837155/fastest-function-to-generate-excel-column-letters-in-c/837673#837673 – barrowc

+0

Essayez la réponse la plus élevée votée [ ici] (http://stackoverflow.com/questions/181596/how-to-convert-a-column-number-eg-127-into-an-excel-column-eg-aa) (ne vous embêtez pas avec le réponse acceptée ...) –

Répondre

1

Voici quelques VBA (avec le code de test) que je ficelais ensemble dans Excel qui fait l'affaire. Sauf si VB.NET a changé radicalement, cela devrait fonctionner. Même si c'est le cas, vous devriez pouvoir traduire l'idée en code utilisable.

' num2col - translate Excel column number (1-n) into column string ("A"-"ZZ"). ' 

Function num2col(num As Integer) As String 
    ' Subtract one to make modulo/divide cleaner. ' 

    num = num - 1 

    ' Select return value based on invalid/one-char/two-char input. ' 

    If num < 0 Or num >= 27 * 26 Then 
     ' Return special sentinel value if out of range. ' 

     num2col = "-" 
    Else 
     ' Single char, just get the letter. ' 

     If num < 26 Then 
      num2col = Chr(num + 65) 
     Else 
      ' Double char, get letters based on integer divide and modulus. ' 

      num2col = Chr(num \ 26 + 64) + Chr(num Mod 26 + 65) 
     End If 
    End If 
End Function 

 

' Test code in Excel VBA. ' 

Sub main() 
    MsgBox ("- should be " & num2col(0)) 
    MsgBox ("A should be " & num2col(1)) 
    MsgBox ("B should be " & num2col(2)) 
    MsgBox ("Z should be " & num2col(26)) 
    MsgBox ("AA should be " & num2col(27)) 
    MsgBox ("AB should be " & num2col(28)) 
    MsgBox ("AY should be " & num2col(51)) 
    MsgBox ("AZ should be " & num2col(52)) 
    MsgBox ("BA should be " & num2col(53)) 
    MsgBox ("ZY should be " & num2col(27 * 26 - 1)) 
    MsgBox ("ZZ should be " & num2col(27 * 26)) 
    MsgBox ("- should be " & num2col(27 * 26 + 1)) 
End Sub 
0
public string ColumnNumberToLetter(int ColumnNumber) 
{ 
    if (ColumnNumber > 26) 
    { 
     return ((char) (Math.Floor(((double)ColumnNumber - 1)/26) + 64)).ToString() 
       + ((char) (((ColumnNumber - 1) % 26) + 65)).ToString(); 
    } 
    return ((char)(ColumnNumber+64)).ToString(); 
} 
-1

Utilisation d'un sous-programme de conversion de base numérique. Vous voulez convertir de la base 10 à la base 26. Ajouter chaque chiffre à 'A'

Comme dans: http://www.vbforums.com/showthread.php?t=271359

+1

Ce n'est pas Base26, vous serez un peu hors. –

+0

Se sentir confus maintenant. De quelle base s'agit-il? A-Z pour chaque chiffre. N'est-ce pas 26 possibilités? – TheJacobTaylor

+0

@TheJacobTaylor Parce qu'il vous manque '0' dans ce schéma. On ne compte pas '8, 9, 11, 12, ... 19, 21, 22 ...' Rappelez-vous que 'A' est pour' 1'. Incrémenter Z par 1 devrait vous donner A0 (qui n'est pas dans ce système), pas AA. –

0

Essayez ceci:

public static string ToExcelString(int number) 
{ 
    if (number > 25) 
    { 
     int secondaryCounter = 0; 
     while (number > 25) 
     { 
      secondaryCounter = secondaryCounter + 1; 
      number = number - 25; 
     } 
     return ToExcelChar(number) + ToExcelChar(secondaryCounter); 
    } 
    else 
    { 
     return ToExcelChar(number) 
    } 
} 
private const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
private static string ToExcelChar(int number) 
{ 
    if (number > 25 || number < 0) 
    { 
     throw new InvalidArgumentException("the number passed in (" + number + ") must be between the range 0-25"); 
    } 
    return alphabet[number]; 
} 
-1

Il suffit d'utiliser la activecell.address manuipulate puis la chaîne basé sur où le $ est à ce dont vous avez besoin.