Você pode adicionar o (0)final do comando Split se desejar salvar uma declaração de variável e uma linha de código extra. por exemplo,Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor
3
Isso está correto, mas achei mais legível usar várias linhas.
brettdj
6
Por que se preocupar com os parâmetros booleanos nessa situação? Você consegue fazer isso:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel herói
1
Embora isso seja muito antigo, tenho uma pequena adição - verificando primeiro se o número é positivo, pois, caso contrário, você encontrará erros. se lngcol <= 0 então
Selkie
1
Ao usar o VBS, lembre-se de que .Cellsé uma propriedade do Excel, o que significa que você precisa usar <excel_object>.Cells(). Caso contrário, você receberá um erro de incompatibilidade de tipo.
Stevoisiak
88
Se você preferir não usar um objeto de intervalo:
Function ColumnLetter(ColumnNumber AsLong)AsStringDim n AsLongDim c AsByteDim s AsString
n = ColumnNumber
Do
c =((n -1)Mod26)
s = Chr(c +65)& s
n =(n - c)\26LoopWhile n >0
ColumnLetter = s
EndFunction
Não está claro por que você postou um método mais longo com um loop com base em Se você preferir não usar um objeto de intervalo:
brettdj
29
@brettdj Eu posso imaginar várias razões: 1) esse método é 6x mais rápido nos meus testes 2) não requer acesso à API do Excel 3) presumivelmente possui uma menor pegada de memória. Edição: Além disso, não sei por que comentei uma resposta com mais de um ano: S
Blackhawk
6
Porém, há uma desvantagem no aumento da velocidade. O uso do objeto range gera um erro se você passar um número de coluna inválido. Funciona mesmo se alguém ainda estiver usando o Excel 2003. Se você precisar desse tipo de exceção, siga o método range. Caso contrário, parabéns para robartsd.
Engenheiro brinde
6
IF ColumnNumber <= Columns.Countseria melhor evitar suposições sobre versões.
brettdj
1
Outra razão para usar esse código é que se você não está em VBA, mas em VB, .net, etc.
Maury Markowitz
46
Algo que funciona para mim é:
Cells(Row,Column).Address
Isso retornará a referência de formato $ AE $ 1 para você.
Este funciona para mim no Office 365: string col = Worksheet.Columns [column] .Address; retornar col.Substring (col.IndexOf (":") + 2); Por alguma razão, outras expressões, como Range = Worksheet.Cells [1, coluna], estavam lançando erros (na chamada Cells ou quando tentei usar o endereço, não consigo lembrar - desculpe - quais linhas estavam sendo lançadas nas quais casos específicos.)
Sam Azer
19
Apenas mais uma maneira de fazer isso. A resposta de Brettdj me fez pensar nisso, mas se você usar esse método, não precisará usar uma matriz variante, poderá ir diretamente para uma string.
Recortar e colar perfeito para converter números maiores que 676. Obrigado!
David Krider
1
O restante nunca pode ter mais de 26 anos. Por que não um número inteiro e não longo?
Caltor
10
@Caltor A menos que você tenha um propósito especial para usar um número inteiro, como chamar uma API que exija um por exemplo, você nunca deve escolher um número inteiro em vez de um longo. O VBA é otimizado para Longs. Processos VBA Longs mais rápido que Inteiros.
Excel Hero
1
@ExcelHero Eu não sabia disso. Mas um Long não ocupa mais memória que um Inteiro?
Caltor
6
@Caltor De fato, um Long tem 32 bits, enquanto um Inteiro é 16. Mas isso não importa na computação moderna. 25 anos atrás ... isso importava muito. Mas hoje (até 15 anos atrás) a diferença é totalmente irrelevante.
Excel Hero
9
Isso está disponível usando uma fórmula:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
e também pode ser gravado como uma função VBA, conforme solicitado:
Function ColName(colNum AsInteger)AsString
ColName = Split(Worksheets(1).Cells(1, colNum).Address,"$")(1)EndFunction
Acabei de notar que isso é essencialmente o mesmo que a solução de Nikolay Ivanov, que torna a minha um pouco menos nova. Vou deixá-lo porque mostra uma abordagem um pouco diferente para algumas das minúcias
alexanderbird
Boa solução por dois motivos: não usar nenhum objeto (como intervalo, célula etc.); definição muito compacta.
precisa saber é o seguinte
8
O código de robertsd é elegante, mas para torná-lo à prova de futuro, altere a declaração de n para digitar long
Caso você queira uma fórmula para evitar macro, aqui está algo que funciona até a coluna 702, inclusive
ÚLTIMA ATUALIZAÇÃO : Por favor, ignore a função abaixo, o @SurasinTancharoen conseguiu me alertar que está quebrado n = 53.
Para aqueles que estão interessados, aqui estão outros valores quebrados logo abaixo n = 200:
Para referência, isso ocorre com conjuntos de colunas maiores, pois Chr () não lida bem com grandes números.
Azuvector 18/10
2
Isso tem um erro. Tente ConvertToLetter (53), que deveria ter sido 'BA', mas falhará.
Surasin Tancharoen
@SurasinTancharoen Muito obrigado por observar esta falha. Eu nunca pensei que a Microsoft forneceria uma função quebrada, pois eles mesmos criaram o Microsoft Excel. Vou abandonar esta função a partir de agora e vai usar @brettdj função que até mesmo corrigir até mais recente número máximo Microsoft Excel de limite de colunaCol_Letter(16384) = "XFD"
mtbink.com
4
E de onde vem essa "divisão por 27"? A última vez que verifiquei, há 26 letras. É por isso que esse código quebra.
ib11 28/05
5
Esta é uma função baseada na resposta de @ DamienFennelly acima. Se você me der um joinha, dê uma joinha também! : P
@loannis Baseei o meu na resposta de DamianFennelly, e não na resposta aceita. Mas sim, a minha se parece muito com a resposta aceita, exceto uma linha é dividida em duas para torná-la mais legível.
BrettFromLA
3
Existe uma maneira muito simples de usar o poder do Excel: Use Range.Cells.Addressproperty, desta maneira:
Funcionará apenas para uma designação de coluna de 1 letra, mas é bom para casos simples. Se você precisar trabalhar com designações exclusivas de duas letras, use o seguinte:
A solução do brettdj funciona de maneira fantástica, mas se você se deparar com uma solução potencial pela mesma razão que eu, pensei que ofereceria minha solução alternativa.
O problema que eu estava tendo era rolar para uma coluna específica com base na saída de uma função MATCH (). Em vez de converter o número da coluna em paralelo à letra da coluna, optei por alternar temporariamente o estilo de referência de A1 para R1C1. Dessa forma, eu poderia simplesmente rolar para o número da coluna sem ter que mexer com uma função VBA. Para alternar facilmente entre os dois estilos de referência, você pode usar este código VBA:
Sub toggle_reference_style()If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
EndIfEndSub
Para avançar na resposta brettdj, aqui é necessário tornar a entrada do número da coluna opcional. Se a entrada do número da coluna for omitida, a função retornará a letra da coluna da célula que chama para a função. Eu sei que isso também pode ser alcançado usando apenas ColumnLetter(COLUMN()), mas achei que seria bom se ele pudesse entender isso de maneira inteligente.
A desvantagem dessa função é que ela seria muito, muito ligeiramente mais lenta que a resposta de brettdj por causa do IFteste. Mas isso pode ser sentido se a função for usada repetidamente por uma quantidade muito grande de vezes.
Aqui está uma resposta tardia, apenas para uma abordagem simplista usando Int()e Ifno caso de colunas de 1 a 3 caracteres:
Function outColLetterFromNumber(i AsInteger)AsStringIf i <27Then'one-letter
col = Chr(64+ i)ElseIf i <677Then'two-letter
col = Chr(64+ Int(i /26))& Chr(64+ i -(Int(i /26)*26))Else'three-letter
col = Chr(64+ Int(i /676))& Chr(64+ Int(i - Int(i /676)*676)/26))& Chr(64+ i -(Int(i - Int(i /676)*676)/26)*26))EndIf
outColLetterFromNumber = col
EndFunction
function GetColLetterFromNum(Sheet :Variant; Col :Integer):String;
begin
Result := Sheet.Columns[Col].Address;// from Col=100-->'$CV:$CV'
Result := Copy(Result,2, Pos(':', Result) - 2);end;
Essa fórmula fornecerá a coluna com base em um intervalo (ou seja, A1 ), em que o intervalo é uma única célula. Se um intervalo de várias células for fornecido, ele retornará a célula superior esquerda. Observe que as duas referências de célula devem ser as mesmas:
CELL ("property", "range") retorna um valor específico do intervalo, dependendo da propriedade usada. Nesse caso, o endereço da célula. A propriedade address retorna um valor $ [col] $ [linha], ou seja, A1 -> $ A $ 1. A função MID analisa o valor da coluna entre os símbolos $.
Estou atrasado para a festa aqui, mas quero contribuir com outra resposta que ninguém mais tenha abordado ainda que não envolva matrizes. Você pode fazer isso com uma simples manipulação de strings.
Function ColLetter(Col_Index AsLong)AsStringDim ColumnLetter AsString'Prevent errors; if you get back a number when expecting a letter, ' you know you did something wrong.If Col_Index <=0Or Col_Index >=16384Then
ColLetter =0ExitFunctionEndIf
ColumnLetter = ThisWorkbook.Sheets(1).Cells(1, Col_Index).Address 'Address in $A$1 format
ColumnLetter = Mid(ColumnLetter,2, InStr(2, ColumnLetter,"$")-2)'Extracts just the letter
ColLetter = ColumnLetter
EndSub
Depois de inserir a entrada no formato $A$1, use a Midfunção, inicie na posição 2 para contabilizar a primeira e $, em seguida, você encontrará onde a segunda $aparece na cadeia usando InStre, em seguida, subtraia 2 para contabilizar essa posição inicial.
Isso oferece o benefício de ser adaptável para toda a gama de colunas possíveis. Portanto, ColLetter(1)devolve "A" e ColLetter(16384)devolve "XFD", que é a última coluna possível para a minha versão do Excel.
A letra da coluna do número da coluna pode ser extraída usando a fórmula seguindo as etapas
1. Calcule o endereço da coluna usando a fórmula ADDRESS
2. Extraia a letra da coluna usando as funções MID e FIND
Exemplo:
1. ADDRESS (1000,1000,1)
resulta $ ALL $ 1000
2 . = Resultados MID (F15,2, FIND ("$", F15,2) -2)
TODOS os F15 que contêm o resultado da etapa 1
De uma vez, podemos escrever
MID (ADDRESS (1000,1000,1), 2, FIND ("$", ENDEREÇO (1000,1000,1), 2) -2)
isto é apenas para REFEDIT ... geralmente use código uphere versão em breve ... fácil de ser lido e entendido / use poz de $
PrivateSub RefEdit1_Change()Me.Label1.Caption = NOtoLETTER(RefEdit1.Value)' you may assign to a variable var=....'EndSubFunction NOtoLETTER(REFedit)Dim First AsLong, Second AsLong
First = InStr(REFedit,"$")'first poz of $
Second = InStr(First +1, REFedit,"$")'second poz of $
NOtoLETTER = Mid(REFedit, First +1, Second - First -1)'extract COLUMN LETTEREndFunction
Respostas:
Essa função retorna a letra da coluna para um determinado número de coluna.
código de teste para a coluna 100
fonte
(0)
final do comando Split se desejar salvar uma declaração de variável e uma linha de código extra. por exemplo,Col_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
é uma propriedade do Excel, o que significa que você precisa usar<excel_object>.Cells()
. Caso contrário, você receberá um erro de incompatibilidade de tipo.Se você preferir não usar um objeto de intervalo:
fonte
IF ColumnNumber <= Columns.Count
seria melhor evitar suposições sobre versões.Algo que funciona para mim é:
Isso retornará a referência de formato $ AE $ 1 para você.
fonte
MsgBox Columns( 9347 ).Address
retorna .Para retornar SOMENTE a (s) letra (s) da coluna :
Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
retorna .fonte
Apenas mais uma maneira de fazer isso. A resposta de Brettdj me fez pensar nisso, mas se você usar esse método, não precisará usar uma matriz variante, poderá ir diretamente para uma string.
ou pode torná-lo um pouco mais compacto com esse
Observe que isso depende de você referenciar a linha 1 no objeto de células.
fonte
E uma solução usando recursão:
fonte
Isso está disponível usando uma fórmula:
e também pode ser gravado como uma função VBA, conforme solicitado:
fonte
Esta é uma versão da resposta de robartsd (com o sabor da solução de uma linha de Jan Wijninckx ), usando recursão em vez de um loop.
Eu testei isso com as seguintes entradas:
fonte
O código de robertsd é elegante, mas para torná-lo à prova de futuro, altere a declaração de n para digitar long
Caso você queira uma fórmula para evitar macro, aqui está algo que funciona até a coluna 702, inclusive
onde A1 é a célula que contém o número da coluna a ser convertida em letras.
fonte
ÚLTIMA ATUALIZAÇÃO : Por favor, ignore a função abaixo, o @SurasinTancharoen conseguiu me alertar que está quebrado
n = 53
.Para aqueles que estão interessados, aqui estão outros valores quebrados logo abaixo
n = 200
:Por favor, use a função @brettdj para todas as suas necessidades. Até funciona para o Microsoft Excel mais recente número máximo de colunas:
16384
deve fornecerXFD
FIM DA ATUALIZAÇÃO
A função abaixo é fornecida pela Microsoft:
Fonte: Como converter números de colunas do Excel em caracteres alfabéticos
APLICA-SE A
fonte
Col_Letter(16384) = "XFD"
Esta é uma função baseada na resposta de @ DamienFennelly acima. Se você me der um joinha, dê uma joinha também! : P
fonte
Existe uma maneira muito simples de usar o poder do Excel: Use
Range.Cells.Address
property, desta maneira:Isso retornará o endereço da coluna desejada na linha 1. Faça o seguinte
1
:Observe que é tão rápido e poderoso que você pode retornar endereços de coluna que existem!
Substitua
lngRow
o número da coluna desejada usando aSelection.Column
propriedade!fonte
Aqui está um liner simples que pode ser usado.
Funcionará apenas para uma designação de coluna de 1 letra, mas é bom para casos simples. Se você precisar trabalhar com designações exclusivas de duas letras, use o seguinte:
fonte
Isso funcionará independentemente de qual coluna dentro da sua linha de código para a célula localizada na linha X, na coluna Y:
Se você possui uma célula com nome definido exclusivo "Cellname":
fonte
A solução do brettdj funciona de maneira fantástica, mas se você se deparar com uma solução potencial pela mesma razão que eu, pensei que ofereceria minha solução alternativa.
O problema que eu estava tendo era rolar para uma coluna específica com base na saída de uma função MATCH (). Em vez de converter o número da coluna em paralelo à letra da coluna, optei por alternar temporariamente o estilo de referência de A1 para R1C1. Dessa forma, eu poderia simplesmente rolar para o número da coluna sem ter que mexer com uma função VBA. Para alternar facilmente entre os dois estilos de referência, você pode usar este código VBA:
fonte
Para avançar na resposta brettdj, aqui é necessário tornar a entrada do número da coluna opcional. Se a entrada do número da coluna for omitida, a função retornará a letra da coluna da célula que chama para a função. Eu sei que isso também pode ser alcançado usando apenas
ColumnLetter(COLUMN())
, mas achei que seria bom se ele pudesse entender isso de maneira inteligente.A desvantagem dessa função é que ela seria muito, muito ligeiramente mais lenta que a resposta de brettdj por causa do
IF
teste. Mas isso pode ser sentido se a função for usada repetidamente por uma quantidade muito grande de vezes.fonte
Aqui está uma resposta tardia, apenas para uma abordagem simplista usando
Int()
eIf
no caso de colunas de 1 a 3 caracteres:fonte
fonte
Aqui, uma função simples em Pascal (Delphi).
fonte
Essa fórmula fornecerá a coluna com base em um intervalo (ou seja, A1 ), em que o intervalo é uma única célula. Se um intervalo de várias células for fornecido, ele retornará a célula superior esquerda. Observe que as duas referências de célula devem ser as mesmas:
MID (CÉLULA ("endereço", A1 ), 2, PESQUISA ("$", CÉLULA ("endereço", A1 ), 2) -2) -2)
Como funciona:
CELL ("property", "range") retorna um valor específico do intervalo, dependendo da propriedade usada. Nesse caso, o endereço da célula. A propriedade address retorna um valor $ [col] $ [linha], ou seja, A1 -> $ A $ 1. A função MID analisa o valor da coluna entre os símbolos $.
fonte
Maneira fácil de obter o nome da coluna
Espero que ajude =)
fonte
fonte
Estou atrasado para a festa aqui, mas quero contribuir com outra resposta que ninguém mais tenha abordado ainda que não envolva matrizes. Você pode fazer isso com uma simples manipulação de strings.
Depois de inserir a entrada no formato
$A$1
, use aMid
função, inicie na posição 2 para contabilizar a primeira e$
, em seguida, você encontrará onde a segunda$
aparece na cadeia usandoInStr
e, em seguida, subtraia 2 para contabilizar essa posição inicial.Isso oferece o benefício de ser adaptável para toda a gama de colunas possíveis. Portanto,
ColLetter(1)
devolve "A" eColLetter(16384)
devolve "XFD", que é a última coluna possível para a minha versão do Excel.fonte
A letra da coluna do número da coluna pode ser extraída usando a fórmula seguindo as etapas
1. Calcule o endereço da coluna usando a fórmula ADDRESS
2. Extraia a letra da coluna usando as funções MID e FIND
Exemplo:
1. ADDRESS (1000,1000,1)
resulta $ ALL $ 1000
2 . = Resultados MID (F15,2, FIND ("$", F15,2) -2)
TODOS os F15 que contêm o resultado da etapa 1
De uma vez, podemos escrever
MID (ADDRESS (1000,1000,1), 2, FIND ("$", ENDEREÇO (1000,1000,1), 2) -2)
fonte
isto é apenas para REFEDIT ... geralmente use código uphere versão em breve ... fácil de ser lido e entendido / use poz de $
fonte
O limite A é 65, portanto:
MsgBox Chr(ActiveCell.Column + 64)
Encontrado em: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
fonte
que tal apenas converter para o número ascii e usar Chr () para converter novamente em uma letra?
col_letter = Chr (Selection.Column + 96)
fonte
Aqui está outra maneira:
fonte