Sütun numarasını harfe dönüştürme işlevi?


143

Sütun harf (ler) ini bir sayıdan döndürebilen bir Excel VBA işlevi olan var mı?

Örneğin, 100 girildiğinde geri dönülmelidir CV.



@FrancisDean Numaradan adres arayan bu sorunun tam tersi
brettdj

2
@brettdj Bağlantılı cevap hem sayıdan harfe hem de sayıdan harfe gösterilir.
Francis Dean

2
@FrancisDean fuar noktası, kabul edilen cevaptan ziyade bağlantıdaki soru başlığına baktım
brettdj

Yanıtlar:


211

Bu işlev, belirli bir sütun numarası için sütun harfini döndürür.

Function Col_Letter(lngCol As Long) As String
    Dim vArr
    vArr = Split(Cells(1, lngCol).Address(True, False), "$")
    Col_Letter = vArr(0)
End Function

sütun 100 için test kodu

Sub Test()
    MsgBox Col_Letter(100)
End Sub

9
(0)Kendinize değişken bir bildirim ve fazladan bir kod satırı kaydetmek istiyorsanız, Split komutunun sonuna ekleyebilirsiniz . egCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor

3
Bu oldukça doğru, ama birkaç satır kullanmanın daha okunabilir olduğunu düşündüm.
brettdj

6
Neden bu durumda Boole parametreleriyle uğraşalım. Bunu yapabilirsiniz:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel Hero

1
Bu çok eski olsa da, küçük bir ek var - önce sayının pozitif olup olmadığını kontrol, aksi takdirde hatalarla karşılaşırsınız. lngcol <= 0 ise
Selkie

1
VBS kullanırken, bunun .CellsExcel'in bir özelliği olduğunu, yani kullanmanız gerektiğini unutmayın <excel_object>.Cells(). Aksi takdirde, bir tür uyumsuzluğu hatası alırsınız.
Stevoisiak

88

Bir aralık nesnesi kullanmak istemiyorsanız:

Function ColumnLetter(ColumnNumber As Long) As String
    Dim n As Long
    Dim c As Byte
    Dim s As String

    n = ColumnNumber
    Do
        c = ((n - 1) Mod 26)
        s = Chr(c + 65) & s
        n = (n - c) \ 26
    Loop While n > 0
    ColumnLetter = s
End Function

1
Neden bir dizi nesnesi kullanmak istemiyorsanız
brettdj

29
@brettdj Birkaç neden hayal edebiliyorum: 1) bu yöntem testlerimden yaklaşık 6 kat daha hızlıdır 2) Excel API'sına erişim gerektirmez 3) muhtemelen daha küçük bir bellek alanına sahiptir. DÜZENLEME: Ayrıca, bir yıldan daha eski bir yanıta neden yorum yaptığımdan da emin değilim: S
Blackhawk

6
Yine de artan hızın bir dezavantajı var. Geçersiz bir sütun numarası iletirseniz range nesnesini kullanmak hata verir. Birisi hala Excel 2003 kullanıyor olsa bile çalışır. Bu tür bir istisnaya ihtiyacınız varsa, range yöntemiyle devam edin. Aksi takdirde, kudos için robartsd.
Mühendis Tost

6
IF ColumnNumber <= Columns.Countsürümler hakkındaki varsayımlardan kaçınmak daha iyi olur.
brettdj

1
Bu kodu kullanmanın başka bir nedeni de VBA'da değil VB, .net vb.
Değilsinizdir

46

Benim için çalışan bir şey:

Cells(Row,Column).Address 

Bu sizin için $ AE $ 1 format referansını döndürecektir.


1
Bu soruya cevap vermiyor.
Pochmurnik

33

Kimsenin önermediğine şaşırdım: ** <code> </code> <code> Sütunlar (</code> *** <code> Sütun Dizini </code> *** <code>) .Adresi </code> <code> </ code> **

  • Örneğin: MsgBox Columns( 9347 ).Address döner ** <code> $ MUM: $ MUM </ code> ** .

YALNIZCA sütun harf (ler) ini döndürmek için :Split((Columns(Column Index).Address(,0)),":")(0)

  • Örneğin: MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) döner ** <code> BABA </ code> ** .

  Daha fazla örnek



Bu benim için Office 365'te çalışır: string col = Worksheet.Columns [sütun] .Address; return col.Substring (col.IndexOf (":") + 2); Nedense Range = Worksheet.Cells [1, column] gibi diğer ifadeler hatalar atıyordu (Hücreler çağrısında veya adresi almaya çalıştığımda, hangi satırların hangi satırlara özel durumlar.)
Sam Azer

19

Bunu yapmanın bir yolu daha var. Brettdj'nin cevabı bana bunu düşündürdü, ancak bu yöntemi kullanırsanız bir varyant dizisi kullanmak zorunda değilsiniz, doğrudan bir dizeye gidebilirsiniz.

ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")

veya bununla biraz daha kompakt hale getirebilir

ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")

Bunun, hücre nesnesindeki 1. satıra başvurmanıza bağlı olduğuna dikkat edin.


18

Ve özyineleme kullanan bir çözüm:

Function ColumnNumberToLetter(iCol As Long) As String

    Dim lAlpha As Long
    Dim lRemainder As Long

    If iCol <= 26 Then
        ColumnNumberToLetter = Chr(iCol + 64)
    Else
        lRemainder = iCol Mod 26
        lAlpha = Int(iCol / 26)
        If lRemainder = 0 Then
            lRemainder = 26
            lAlpha = lAlpha - 1
        End If
        ColumnNumberToLetter = ColumnNumberToLetter(lAlpha) & Chr(lRemainder + 64)
    End If

End Function

Kes ve yapıştır 676 daha büyük sayıları dönüştürmek için mükemmel. Teşekkürler!
David Krider

1
Kalan asla 26'dan fazla olamaz, o zaman neden uzun değil tam sayı değil?
Caltor

10
@Caltor Örneğin tamsayı gerektiren bir API'yi çağırmak gibi bir Tamsayı kullanmak için özel bir amacınız yoksa, Asla Uzun Süre Tamsayı seçmemelisiniz. VBA, Longs için optimize edilmiştir. VBA, Longs'ı Tamsayılardan daha hızlı işler.
Excel Kahramanı

1
@ExcelHero Bunu bilmiyordum. Uzun bir Tamsayıdan daha fazla bellek almaz mı?
Hesaplayıcı

6
@Caltor Long bir 32 bit iken, bir Integer 16'dır. Ancak bu modern hesaplamada önemli değildir. 25 yıl önce ... çok önemliydi. Ancak bugün (15 yıl önce bile) fark tamamen önemsizdir.
Excel Hero

9

Bu bir formül kullanılarak elde edilebilir:

=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")

ve böylece istendiği gibi bir VBA işlevi olarak da yazılabilir:

Function ColName(colNum As Integer) As String
    ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function

8

Bu, bir döngü yerine özyineleme kullanan robartsd'ın cevabının ( Jan Wijninckx'in tek hat çözümünün lezzeti ile) bir versiyonudur .

Public Function ColumnLetter(Column As Integer) As String
    If Column < 1 Then Exit Function
    ColumnLetter = ColumnLetter(Int((Column - 1) / 26)) & Chr(((Column - 1) Mod 26) + Asc("A"))
End Function

Bunu aşağıdaki girişlerle test ettim:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""

2
Bunun, Nikolay Ivanov'un benimkini biraz daha az roman yapan çözümü ile aynı olduğunu fark ettim. Onu bırakacağım çünkü birkaç minutia için biraz farklı bir yaklaşım gösteriyor
alexanderbird

İki nedenden dolayı iyi bir çözüm: herhangi bir nesne (aralık, hücre vb.) Kullanmamak; çok kompakt bir tanım.
loved.by.Jesus

8

robertsd'nin kodu zariftir, ancak geleceğe dönük hale getirmek için n'nin bildirimini uzun yazmak için değiştirin

Makrolardan kaçınmak için bir formül istiyorsanız, burada 702 sütununa kadar çalışan bir şey var

=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)

burada A1, harflere dönüştürülecek sütun numarasını içeren hücredir.


7

SON GÜNCELLEME : Lütfen aşağıdaki işlevi görmezden gelin, @SurasinTancharoen, bozuk olduğu konusunda beni uyarmayı başardı n = 53.
İlgilenenler için, aşağıdaki diğer kırık değerler şunlardır n = 200:

Belirli değerleri

Lütfen tüm ihtiyaçlarınız için @brettdj fonksiyonunu kullanınız. Microsoft Excel için bile çalışır en son maksimum sütun sınırı: 16384verirXFD

resim açıklamasını buraya girin

GÜNCELLEME SONU


Aşağıdaki işlev Microsoft tarafından sağlanır:

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

Kaynak: Excel sütun numaralarını alfabetik karakterlere dönüştürme

UYGULAMASI

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standart Sürüm
  • Microsoft Excel 2000 Standart Sürüm
  • Microsoft Excel 97 Standart Sürüm

2
Referans olarak, Chr () gibi daha büyük sütun kümelerine sahip bu pukes büyük sayıları iyi işlemez.
Azuvector

2
Bunun bir hatası var. 'BA' olması gereken ConvertToLetter (53) 'i deneyin, ancak başarısız olacaktır.
Surasin Tancharoen

@SurasinTancharoen Bu kusuru kaydettiğiniz için çok teşekkür ederim. Microsoft Excel'i kendileri oluşturan biri olarak Microsoft'un kırık bir işlev sağlayacağını hiç düşünmemiştim. Bundan sonra bu işlevi terk edeceğim ve en son Microsoft Excel maksimum sütun sınırına kadar düzelten @brettdj işlevini kullanacağımCol_Letter(16384) = "XFD"
mtbink.com

4
Ve bu "27'ye böl" nereden geliyor? Son kontrol ettiğimde 26 harf var. Bu yüzden bu kod kırılıyor.
ib11

5

Bu, @ DamienFennelly'nin yukarıdaki cevabına dayanan bir işlevdir . Bana bir başparmak verirsen, ona da bir başparmak ver! : P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function

2
İyi olan, ama kabul edilen cevaptan farkı nedir?
Ioannis

@ loannis Benim kabul edilene değil DamianFennelly'nin cevabına dayanıyorum. Ama evet, benimki kabul edilen cevaba çok benziyor, ancak bir satır daha okunabilir hale getirmek için ikiye bölündü.
BrettFromLA

3

Excel gücünü kullanmanın çok basit bir yolu vardır: Range.Cells.AddressÖzelliği şu şekilde kullanın :

strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)

Bu, götürün 1. satırda istenen sütunun adresini döndürür 1:

strCol = Left(strCol, len(strCol) - 1)

O kadar hızlı ve güçlü olduğunu, hatta var olan sütun adreslerini döndürebileceğinizi unutmayın!

Değiştirin lngRowkullanarak istediğiniz sütun sayısı için Selection.Columnözellik!


2

İşte kullanılabilecek basit bir astar.

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)

Sadece 1 harfli sütun ataması için çalışır, ancak basit durumlar için iyidir. Sadece 2 harfli isimlendirme için çalışması gerekiyorsa, aşağıdakileri kullanabilirsiniz:

ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)

2

Bu, X satırında, Y sütununda yer alan hücre için bir kod satırınızdaki hangi sütundan bağımsız olarak çalışır:

Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)

Benzersiz bir adı "Cellname" olan bir hücreniz varsa:

Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)

1

Brettdj'den gelen çözüm fevkalade işe yarıyor, ancak ben de aynı nedenden ötürü potansiyel bir çözüm olarak karşınıza çıkarsanız alternatif çözümümü sunacağımı düşündüm.

Sahip olduğum sorun, bir MATCH () işlevinin çıktısına göre belirli bir sütuna kaydırma oldu. Sütun numarasını paralel olarak sütun harfine dönüştürmek yerine, referans stilini geçici olarak A1'den R1C1'e değiştirmeyi seçtim. Bu şekilde bir VBA işleviyle uğraşmak zorunda kalmadan sütun numarasına gidebilirim. İki referans stili arasında kolayca geçiş yapmak için bu VBA kodunu kullanabilirsiniz:

Sub toggle_reference_style()

If Application.ReferenceStyle = xlR1C1 Then
  Application.ReferenceStyle = xlA1
Else
  Application.ReferenceStyle = xlR1C1
End If

End Sub

1

Brettdj yanıtı üzerine, burada sütun numarası girişini isteğe bağlı yapmaktır. Sütun numarası girişi atlanırsa, işlev, işlevi çağıran hücrenin sütun harfini döndürür. Bunun sadece kullanılarak da elde edilebileceğini biliyorum ColumnLetter(COLUMN()), ama akıllıca anlayabilseydi iyi olacağını düşündüm.

Public Function ColumnLetter(Optional ColumnNumber As Long = 0) As String
    If ColumnNumber = 0 Then
        ColumnLetter = Split(Application.Caller.Address(True, False, xlA1), "$")(0)
    Else
        ColumnLetter = Split(Cells(1, ColumnNumber).Address(True, False, xlA1), "$")(0)
    End If
End Function

Bu fonksiyonun ticareti, IFtest nedeniyle brettdj'nin cevabından çok çok daha yavaş olacağıdır . Ancak, işlev çok fazla kez tekrar tekrar kullanılırsa bu hissedilebilir.


1

İşte, 1-3 karakter sütunlarını kullanarak Int()ve sadece basit bir yaklaşım için geç bir cevap If:

Function outColLetterFromNumber(i As Integer) As String

    If i < 27 Then       'one-letter
        col = Chr(64 + i)
    ElseIf i < 677 Then  '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))
    End If

    outColLetterFromNumber = col

End Function

1
Function fColLetter(iCol As Integer) As String
  On Error GoTo errLabel
  fColLetter = Split(Columns(lngCol).Address(, False), ":")(1)
  Exit Function
errLabel:
  fColLetter = "%ERR%"
End Function

1

Burada, Pascal'da basit bir işlev (Delphi).

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;

1

Bu formül sütunu bir aralığa (ör. A1 aralığın tek bir hücre olduğu ) . Çok hücreli bir aralık verilirse, sol üstteki hücreyi döndürür. Her iki hücre başvurusunun da aynı olması gerektiğini unutmayın:

MID (HÜCRE ("adres", A1 ), 2, ARAMA ("$", HÜCRE ("adres", A1 ), 2) -2)

Nasıl çalışır:

CELL ("özellik", "aralık"), kullanılan özelliğe bağlı olarak aralığın belirli bir değerini döndürür. Bu durumda hücre adresi. Address özelliği $ [col] $ [satır] değerini, yani A1 -> $ A $ 1 değerini döndürür. MID işlevi $ sembolleri arasındaki sütun değerini ayrıştırır.


0

Sütun adını almanın kolay yolu

Sub column()

cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column

End Sub

Umarım yardımcı olur =)


0
Sub GiveAddress()
    Dim Chara As String
    Chara = ""
    Dim Num As Integer
    Dim ColNum As Long
    ColNum = InputBox("Input the column number")

    Do
        If ColNum < 27 Then
            Chara = Chr(ColNum + 64) & Chara
            Exit Do
        Else
            Num = ColNum / 26
            If (Num * 26) > ColNum Then Num = Num - 1
            If (Num * 26) = ColNum Then Num = ((ColNum - 1) / 26) - 1
            Chara = Chr((ColNum - (26 * Num)) + 64) & Chara
            ColNum = Num
        End If
    Loop

    MsgBox "Address is '" & Chara & "'."
End Sub

0

Bu yüzden partiye geç kaldım, ancak henüz kimsenin ele almadığı, dizileri içermeyen başka bir cevaba katkıda bulunmak istiyorum. Basit dize manipülasyonu ile yapabilirsiniz.

Function ColLetter(Col_Index As Long) As String

    Dim ColumnLetter As String

    'Prevent errors; if you get back a number when expecting a letter, 
    '    you know you did something wrong.
    If Col_Index <= 0 Or Col_Index >= 16384 Then
        ColLetter = 0
        Exit Function
    End If

    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
End Sub

Biçimi girdikten sonra $A$1, Midişlevini kullanın, ilkini hesaba katmak için konum 2'de başlayın $, sonra ikincisini $kullanarak dizede nerede göründüğünü bulun InStrve sonra bu başlangıç ​​konumunu hesaba katmak için 2 çıkarın.

Bu, olası tüm sütunlar için uyarlanabilir olmanın avantajını sağlar. Bu nedenle, ColLetter(1)"A" ColLetter(16384)yı ve Excel sürümüm için mümkün olan son sütun olan "XFD" yi geri verir.


-1

Sütun numarasından sütun harfi aşağıdaki adımlar kullanılarak formül kullanılarak çıkarılabilir
1. ADRES formülünü kullanarak sütun adresini hesaplayın
2. MID ve FIND işlevini kullanarak sütun harfini çıkarın

Örnek:
1. ADRES (1000,1000,1)
sonuçları $ ALL $ 1000
2 . = MID (F15,2, FIND ("$", F15,2) -2)
sonuçları TÜM F15, adım 1'in sonucunu içeriyorsa

, bir seferde
MID (ADDRESS (1000,1000,1), 2, FIND yazabiliriz) ( "$", ADRES (1000,1000,1), 2) -2)


-1

Bu sadece REFEDIT içindir ... genellikle kısa sürede sürüm kodu kullanın ... okunması ve anlaşılması kolay / $ poz kullanın

Private Sub RefEdit1_Change()

    Me.Label1.Caption = NOtoLETTER(RefEdit1.Value) ' you may assign to a variable  var=....'

End Sub

Function NOtoLETTER(REFedit)

    Dim First As Long, Second As Long

    First = InStr(REFedit, "$")                 'first poz of $
    Second = InStr(First + 1, REFedit, "$")     'second poz of $

    NOtoLETTER = Mid(REFedit, First + 1, Second - First - 1)   'extract COLUMN LETTER

End Function


-2

sadece ascii numarasına dönüştürme ve bir harfe geri dönüştürmek için Chr () kullanmaya ne dersiniz?

col_letter = Chr (Seçim Sütunu + 96)


-6

İşte başka bir yol:

{

      Sub find_test2()

            alpha_col = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,W,Z" 
            MsgBox Split(alpha_col, ",")(ActiveCell.Column - 1) 

      End Sub

}

1
Alfabenin harflerini listeleyen bir dize oluşturmaya gerek yoktur. ASCII bunu bizim için yaptı.
Caltor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.