Comment puis-je trouver les Excel nom de la colonne qui correspond à un nombre entier donné?[dupliquer]
-
09-06-2019 - |
Question
Cette question a déjà une réponse ici:
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.
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:
- Pour la 28e colonne de la prise de
columnNumber=28
;Cells(1, columnNumber).Address
retourne"$AB$1"
. - Faire un split sur le
$
signe renvoie le tableau:["","AB","1"]
- 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())