Hvordan finner jeg Excel kolonnenavn som tilsvarer et gitt heltall?

stemmer
30

Hvordan vil du bestemme kolonnenavnet (for eksempel AQ eller BH) av n-te kolonne i Excel?

Edit: Et språk-agnostisk algoritme for å avgjøre dette er hovedmålet her.

Publisert på 22/08/2008 klokken 13:49
kilden bruker
På andre språk...                            


20 svar

stemmer
37

Jeg skrev en gang at denne funksjonen skal utføre den eksakte oppgaven:

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());
}
Svarte 22/08/2008 kl. 13:53
kilden bruker

stemmer
-2

Jeg bruker dette, men jeg har en følelse av at det kan optimaliseres.

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;
}
Svarte 22/08/2008 kl. 13:58
kilden bruker

stemmer
5

Josefs kode er bra, men hvis du ikke ønsker eller trenger å bruke en VBA-funksjonen, kan du prøve dette.

Dersom det antas at verdien av n er i celle A2 Med denne funksjonen:

=MID(ADDRESS(1,A2),2,LEN(ADDRESS(1,A2))-3)
Svarte 22/08/2008 kl. 14:03
kilden bruker

stemmer
1

Jeg antar at du trenger VBA-kode:

Public Function GetColumnAddress(nCol As Integer) As String

Dim r As Range

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

End Function
Svarte 22/08/2008 kl. 14:11
kilden bruker

stemmer
0

Alle disse kodeeksempler at disse gode menneskene har postet ser fint.

Det er én ting å være klar over. Fra og med Office 2007, Excel faktisk har opptil 16.384 kolonner. Som oversetter til XFD (den gamle maks 256 colums var IV). Du er nødt til å endre disse metodene noe å gjøre dem arbeide for tre tegn.

Bør ikke være så vanskelig ...

Svarte 22/08/2008 kl. 15:30
kilden bruker

stemmer
11

Et språk agnostiker algoritme vil være som følger:

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

Denne algoritmen tar også hensyn til om Excel blir oppgradert igjen til å håndtere mer enn 16k kolonner. Hvis du virkelig ønsket å gå over, kan du sende inn en ekstra verdi og erstatte forekomster av 26 med et annet nummer for å imøtekomme alternative alfabeter

Svarte 22/08/2008 kl. 22:15
kilden bruker

stemmer
1

Dette gjør hva du vil i 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
Svarte 31/08/2008 kl. 16:12
kilden bruker

stemmer
0

Her er Gary Waters løsning

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/

Svarte 02/09/2008 kl. 14:26
kilden bruker

stemmer
0

Vurderer kommentaren for WCM (øverste verdi = xfd), kan du beregne det slik;

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;

Det er 26 tegn i alfabetet og vi har en rekke system akkurat som hex eller binære, bare med en uvanlig tegnsett (a-å), som representerer posisjonelt makter 26: (26 ^ 2) (26 ^ 1) ( 26 ^ 0).

Svarte 08/09/2008 kl. 17:23
kilden bruker

stemmer
1

Dette ser ut til å fungere i 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

Jeg tok Josefs og testet den til BH, deretter matet den 980-1000 og det så bra.

Svarte 05/02/2009 kl. 10:57
kilden bruker

stemmer
-2

= CHAR (64 + KOLONNE ())

Svarte 11/08/2009 kl. 02:45
kilden bruker

stemmer
1

I VBA, forutsatt lCol er kolonnenummeret:

function ColNum2Letter(lCol as long) as string
    ColNum2Letter = Split(Cells(1, lCol).Address, "$")(0)
end function
Svarte 18/02/2010 kl. 21:25
kilden bruker

stemmer
3
IF(COLUMN()>=26,CHAR(ROUND(COLUMN()/26,1)+64)&CHAR(MOD(COLUMN(),26)+64),CHAR(COLUMN()+64))

Dette fungerer 2 brev kolonner (fram til kolonne ZZ). Du må reir et annet hvis setningen for 3 brev kolonner.

Formelen ovenfor svikter på kolonner AY, AZog hver av de følgende nYog nZkolonner. Den korrigerte formel er:

=IF(COLUMN()>26,CHAR(ROUNDDOWN((COLUMN()-1)/26,0)+64)&CHAR(MOD((COLUMN()-1),26)+65),CHAR(COLUMN()+64)
Svarte 23/08/2010 kl. 15:27
kilden bruker

stemmer
26

Her er det reneste riktige løsningen jeg kunne komme opp med (i Java, men gjerne bruke din favoritt språk):

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

Men vennligst gi meg beskjed om hvis du finner en feil i denne koden, takk.

Svarte 26/12/2010 kl. 00:55
kilden bruker

stemmer
7

Takk, Joseph Sturtevant! Koden fungerer perfekt - jeg trengte det i VBScript, så tenkte jeg skulle dele min versjon:

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
Svarte 14/01/2011 kl. 18:57
kilden bruker

stemmer
2

Og her er en konvertering fra VBScript versjon til 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
Svarte 04/04/2012 kl. 17:16
kilden bruker

stemmer
0

FYI T-SQL for å gi Excel kolonnenavnet gitt et ordens (null-basert), som en enkelt setning.

Noe under 0 eller over 16 383 (maks kolonner i Excel2010) returnerer 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
Svarte 27/09/2012 kl. 03:48
kilden bruker

stemmer
3

Fra WCM:

Hvis du ikke ønsker å bruke VBA, kan du bruke denne erstatte colnr med nummeret du ønsker

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

Vær oppmerksom på at denne formelen er flyktig på grunn av bruken av ADRESSE-funksjonen. Flyktige funksjoner er funksjoner som er omregnet etter excel etter hver endring. Normalt utmerker beregner formel er bare når deres avhengige referanser endringer.

Det kan være en forestilling morder, for å bruke denne formelen.

Svarte 16/11/2012 kl. 05:56
kilden bruker

stemmer
2

Ruby ett-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

Den konverterer heltall til base26 deretter deler den og gjør litt matematikk for å konvertere hver karakter fra ascii. Til slutt blir med dem alle sammen igjen. Ingen divisjon, modul, eller rekursjon.

Moro.

Svarte 14/12/2012 kl. 13:09
kilden bruker

stemmer
2

Dette fungerer fint i MS Excel 2003 til 2010. Bør arbeide for tidligere versjoner som støtter Cells (...). Adresse funksjon:

  1. For den 28. kolonnen - taking columnNumber=28; Cells(1, columnNumber).Addressavkastning "$AB$1".
  2. Gjør en splitt på $skiltet returnerer matrisen:["","AB","1"]
  3. Split(Cells(1, columnNumber).Address, "$")(1)får du kolonnenavnet "AB".

OPPDATER:

Tatt fra Hvordan konvertere Excel kolonnenumrene i alfabetiske tegn

' 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

Gjelder: Microsoft Office Excel 2007 SE / 2002 SE / 2000 SE / 97 SE

Svarte 06/06/2013 kl. 08:24
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more