Comment puis-je trouver les Excel nom de la colonne qui correspond à un nombre entier donné?[dupliquer]

StackOverflow https://stackoverflow.com/questions/22708

Question

Comment voulez-vous déterminer le nom de la colonne (par ex."AQ" ou "BH") de la n-ième colonne dans Excel?

Edit:Un indépendant de la langue algorithme pour déterminer ce qui est l'objectif principal ici.

Était-ce utile?

La solution

Une fois, j'ai écrit cette fonction pour effectuer la même tâche:

public static string Column(int column)
{
    column--;
    if (column >= 0 && column < 26)
        return ((char)('A' + column)).ToString();
    else if (column > 25)
        return Column(column / 26) + Column(column % 26 + 1);
    else
        throw new Exception("Invalid Column #" + (column + 1).ToString());
}

Autres conseils

Ici est la plus propre correct la solution que je pouvais venir (en Java, mais n'hésitez pas à utiliser votre langue préférée):

String getNthColumnName(int n) {
    String name = "";
    while (n > 0) {
        n--;
        name = (char)('A' + n%26) + name;
        n /= 26;
    }
    return name;
}

Mais s'il vous plaît laissez-moi savoir si vous trouvez une erreur dans ce code, je vous remercie.

Une langue agnostique algorithme serait comme suit:

function getNthColumnName(int n) {
   let curPower = 1
   while curPower < n {
      set curPower = curPower * 26
   }
   let result = ""
   while n > 0 {
      let temp = n / curPower
      let result = result + char(temp)
      set n = n - (curPower * temp)
      set curPower = curPower / 26
   }
   return result

Cet algorithme prend également en compte que si Excel sera mis à jour de nouveau pour gérer plus de 16 k colonnes.Si vous avez vraiment envie d'aller à la mer, vous pouvez entrer une valeur supplémentaire et remplacer les instances de 26 avec un autre numéro pour accueillir suppléant alphabets

Merci, Joseph Sturtevant!Votre code fonctionne parfaitement - je besoin, vbscript, donc pensé que je pourrais partager avec vous ma version:

Function ColumnLetter(ByVal intColumnNumber)
    Dim sResult
    intColumnNumber = intColumnNumber - 1
    If (intColumnNumber >= 0 And intColumnNumber < 26) Then
        sResult = Chr(65 + intColumnNumber)
    ElseIf (intColumnNumber >= 26) Then
        sResult = ColumnLetter(CLng(intColumnNumber \ 26)) _
                & ColumnLetter(CLng(intColumnNumber Mod 26 + 1))
    Else
        err.Raise 8, "Column()", "Invalid Column #" & CStr(intColumnNumber + 1)
    End If
    ColumnLetter = sResult
End Function

Joseph le code est bon, mais, si vous ne voulez pas ou besoin de l'utilisation d'une fonction VBA, essayez ceci.

En supposant que la valeur de n est dans la cellule A2 L'utilisation de cette fonction:

=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))

Cela fonctionne 2 lettre colonnes (jusqu'à la colonne ZZ).Vous avez le nid de l'autre, si une déclaration pour 3 lettre de colonnes.

La formule ci-dessus échoue sur les colonnes AY, AZ et chacun des éléments suivants nY et nZ les colonnes.La correction de la formule est:

=IF(COLUMN()>26,CHAR(ROUNDDOWN((COLUMN()-1)/26,0)+64)&CHAR(MOD((COLUMN()-1),26)+65),CHAR(COLUMN()+64)

DE gestion de contenu (wcm:

Si vous ne souhaitez pas utiliser VBA, vous pouvez utiliser cette remplacer colnr avec le numéro que vous voulez

=MID(ADDRESS(1,colnr),2,LEN(ADDRESS(1,colnr))-3)

S'il vous plaît être conscient du fait que cette formule est instable à cause de l'utilisation de l'ADRESSE de la fonction.Fonctions volatiles sont des fonctions qui sont recalculées par excel après CHAQUE modification.Normalement, excel recalcule formule est seulement quand leurs références dépendantes des changements.

Il pourrait être une performance killer, pour utiliser cette formule.

Et ici, c'est une conversion de la VBScript version de SQL Server 2000+.

CREATE FUNCTION [dbo].[GetExcelColRef] 
(
    @col_seq_no int
)
RETURNS varchar(5)
AS
BEGIN

declare @Result varchar(5)
set @Result = ''
set @col_seq_no = @col_seq_no - 1
If (@col_seq_no >= 0 And @col_seq_no < 26) 
BEGIN
    set @Result = char(65 + @col_seq_no)
END
ELSE
BEGIN
    set @Result = [dbo].[GetExcelColRef] (@col_seq_no / 26) + '' + [dbo].[GetExcelColRef]  ((@col_seq_no % 26) + 1)
END
Return @Result

END
GO

Ruby one-liner:

def column_name_for(some_int)
    some_int.to_s(26).split('').map {|c| (c.to_i(26) + 64).chr }.join # 703 => "AAA"
end

Il convertit l'entier de base26 répartit ensuite et fait un peu de maths pour convertir chaque caractère ascii.Enfin rejoint 'em all de retour ensemble.Pas de division, le module, le ou la récursivité.

Amusant.

Cela fonctionne bien dans MS Excel 2003 à 2010.Devrait fonctionner pour les versions précédentes de soutenir la Les cellules(...).Adresse fonction:

  1. Pour la 28e colonne de la prise de columnNumber=28; Cells(1, columnNumber).Address retourne "$AB$1".
  2. Faire un split sur le $ signe renvoie le tableau: ["","AB","1"]
  3. Donc Split(Cells(1, columnNumber).Address, "$")(1) vous donne le nom de la colonne "AB".

Mise à JOUR:

Prises de Comment convertir Excel numéros de colonne en caractères alphabétiques

' The following VBA function is just one way to convert column number 
' values into their equivalent alphabetical characters:

Function ConvertToLetter(iCol As Integer) As String
   Dim iAlpha As Integer
   Dim iRemainder As Integer
   iAlpha = Int(iCol / 27)
   iRemainder = iCol - (iAlpha * 26)
   If iAlpha > 0 Then
      ConvertToLetter = Chr(iAlpha + 64)
   End If
   If iRemainder > 0 Then
      ConvertToLetter = ConvertToLetter & Chr(iRemainder + 64)
   End If
End Function

S'APPLIQUE À:Microsoft Office Excel 2007 SE / 2002 SE / 2000 SE / 97 SE

Je suppose que vous avez besoin du code VBA:

Public Function GetColumnAddress(nCol As Integer) As String

Dim r As Range

Set r = Range("A1").Columns(nCol)
GetColumnAddress = r.Address

End Function

De ce fait ce que vous voulez en VBA

Function GetNthExcelColName(n As Integer) As String
    Dim s As String
    s = Cells(1, n).Address
    GetNthExcelColName = Mid(s, 2, InStr(2, s, "$") - 2)
End Function

Cela semble fonctionner dans vb.net

Public Function Column(ByVal pColumn As Integer) As String
    pColumn -= 1
    If pColumn >= 0 AndAlso pColumn < 26 Then
        Return ChrW(Asc("A"c) + pColumn).ToString
    ElseIf (pColumn > 25) Then
        Return Column(CInt(math.Floor(pColumn / 26))) + Column((pColumn Mod 26) + 1)
    Else
    stop
        Throw New ArgumentException("Invalid column #" + (pColumn + 1).ToString)
    End If
End Function

J'ai pris de Joseph et testé à la BH, puis il se nourrissait 980-1000 et il avait l'air bien.

En VBA, en supposant que le lCol est le numéro de la colonne:

function ColNum2Letter(lCol as long) as string
    ColNum2Letter = Split(Cells(1, lCol).Address, "$")(0)
end function

Tous ces exemples de code que ces bonnes gens ont posté l'air très bien.

Il est une chose d'être conscient de.Départ avec Office 2007, Excel a effectivement jusqu'à 16 384 colonnes.Cela se traduit par XFD (le vieux max de 256 colonnes a IV).Vous devez modifier ces méthodes un peu pour les faire travailler pour les trois personnages.

Ne devrait pas être difficile...

Voici Gary Eaux solution

Function ConvertNumberToColumnLetter2(ByVal colNum As Long) As String
    Dim i As Long, x As Long
    For i = 6 To 0 Step -1
        x = (1 - 26 ^ (i + 1)) / (-25) - 1 ‘ Geometric Series formula
        If colNum > x Then
            ConvertNumberToColumnLetter2 = ConvertNumberToColumnLetter2 & Chr(((colNum - x - 1)\ 26 ^ i) Mod 26 + 65)
        End If
    Next i
End Function

via http://www.dailydoseofexcel.com/archives/2004/05/21/column-numbers-to-letters/

Considérant le commentaire de wcm (valeur supérieure = xfd), vous pouvez la calculer comme cela;

function IntToExcel(n: Integer); string;
begin
   Result := '';
   for i := 2 down to 0 do 
   begin
      if ((n div 26^i)) > 0) or (i = 0) then
         Result := Result + Char(Ord('A')+(n div (26^i)) - IIF(i>0;1;0));
      n := n mod (26^i);
   end;
end;

Il y a 26 caractères de l'alphabet et nous avons un certain nombre de système comme hexadécimal ou binaire, avec un caractère inhabituel ensemble (A..Z), soit en position les pouvoirs de 26:(26^2)(26^1)(26^0).

FYI T-SQL pour donner de la colonne d'Excel nom donné à un nombre ordinal (de base zéro), comme une seule instruction.

Rien en dessous de 0 ou au-dessus de 16 383 (max colonnes dans Excel2010) renvoie la valeur NULL.

; WITH TestData AS ( -- Major change points
    SELECT -1 AS FieldOrdinal
    UNION ALL
    SELECT 0
    UNION ALL
    SELECT 25
    UNION ALL
    SELECT 26
    UNION ALL
    SELECT 701
    UNION ALL
    SELECT 702
    UNION ALL
    SELECT 703
    UNION ALL
    SELECT 16383
    UNION ALL
    SELECT 16384
)
SELECT
      FieldOrdinal
    , CASE
       WHEN FieldOrdinal < 0     THEN NULL
       WHEN FieldOrdinal < 26    THEN ''
       WHEN FieldOrdinal < 702   THEN CHAR (65 + FieldOrdinal / 26 - 1)
       WHEN FieldOrdinal < 16384 THEN CHAR (65 + FieldOrdinal / 676 - 1)
                                    + CHAR (65 + (FieldOrdinal / 26) - (FieldOrdinal / 676) * 26 - 1)
       ELSE NULL
      END
      + CHAR (65 + FieldOrdinal % 26)
 FROM TestData
 ORDER BY FieldOrdinal

J'utilise actuellement, mais j'ai le sentiment qu'elle peut être optimisée.

private String GetNthExcelColName(int n)
{
    String firstLetter = "";  
    //if number is under 26, it has a single letter name
    // otherwise, it is 'A' for 27-52, 'B' for 53-78, etc
    if(n > 26)
    {
        //the Converts to double and back to int are just so Floor() can be used
        Double value = Convert.ToDouble((n-1) / 26);
        int firstLetterVal = Convert.ToInt32(Math.Floor(value))-1;
        firstLetter = Convert.ToChar(firstLetterValue + 65).ToString();
    }    

    //second letter repeats
    int secondLetterValue = (n-1) % 26;
    String secondLetter = Convert.ToChar(secondLetterValue+65).ToString();

    return firstLetter + secondLetter;
}

=CHAR(64+COLONNE())

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top