Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

MetalFatigue

[Resolvido] Obter Letra da coluna através do indice EXCEL

Recommended Posts

MetalFatigue

Estou a alterar uma ferramenta em VBA que se encontrava miserável. Uma das situações que me deparei foi com a necessidade de verificar celulas preenchidas e devolver-me por exemplo o indice da coluna ou da linha.

Para as linhas é fácil uma correspondencia ao numero da linha, uma vez que são o mesmo. Mas então para as colunas? Como é que em código digo que por exemplo sabendo o indice "16", que letra de coluna irá corresponder?

Peço desculpa se esta pergunta ja foi respondida, mas eu pesquisei e não encontrei.

Share this post


Link to post
Share on other sites
jpaulino

Mas porque precisas de saber qual a letra ?

Podes utiliza, por exemplo, Cells(RowIndex,ColumnIndex) em ver de Range("A1")

Tens de mostrar um exemplo.

Share this post


Link to post
Share on other sites
MetalFatigue

Olá paulino,

Pois eu sei disso. Mas acho que é preferivel ter em letra pois torna mais perceptivel, principalmente para alguem possa vir a mexer de novo no código.

Seja como for continuei a pesquisar após postar aqui e entretanto encontrei a resposta. Aqui fica para quem quiser o mesmo efeito:

Function ColumnLetter(ColumnNumber As Integer) As String
  If ColumnNumber > 26 Then

    ' 1st character:  Subtract 1 to map the characters to 0-25,
    '                 but you don't have to remap back to 1-26
    '                 after the 'Int' operation since columns
    '                 1-26 have no prefix letter

    ' 2nd character:  Subtract 1 to map the characters to 0-25,
    '                 but then must remap back to 1-26 after
    '                 the 'Mod' operation by adding 1 back in
    '                 (included in the '65')

    ColumnLetter = Chr(Int((ColumnNumber - 1) / 26) + 64) & _
                   Chr(((ColumnNumber - 1) Mod 26) + 65)
  Else
    ' Columns A-Z
    ColumnLetter = Chr(ColumnNumber + 64)
  End If
End Function

Origem

Share this post


Link to post
Share on other sites
jpaulino

Ok, só perguntei por perguntar  :)

Mas existem maneiras muito mais fáceis de fazer isso ... por exemplo:

Function GetColumnLetter(rg As Range) As String
    Dim str() As String
    str = Split(rg.Address, "$")
    
    GetColumnLetter = str(1)
End Function

Depois utilizas assim:

MsgBox GetColumnLetter(Cells(1, 3))

ou

MsgBox GetColumnLetter([b1])

PS: Fiz agora à pressa e não está muito bem testada  :P

Share this post


Link to post
Share on other sites
MetalFatigue

Estou também a reparar, assim de repente, um possivel problema com essa solução. Por exemplo se quiseres seleccionar uma coluna inteira, não interessando a celula? Ou seja range("A:A"). Não é possivel usar o cell(x,y) ou estou enganado?

EDIT: Desculpa, não conhecia bem a função split. o $ vai decidir a divisão entre letra e numero  😳

Aparentemente também se encontra correcta a tua solução (nao testei) e mais simples. obrigado.

Share this post


Link to post
Share on other sites
jpaulino

SIm, funciona :)

O resultado de rg.Address é algo tipo "$A$1" e o split é só usado para separar para uma array e depois retirar apenas o que nos interessa: a coluna.

Podia ser feito de outra forma, mas esta é bastante simples.

Vou indicar como resolvido este problema  :P

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.