Berfungsi untuk mengubah nomor kolom menjadi huruf?

143

Adakah yang memiliki fungsi Excel VBA yang dapat mengembalikan huruf kolom dari suatu nomor?

Misalnya, memasukkan 100 harus kembali CV.

mezamorphic
sumber
4
Lihat pertanyaan ini: stackoverflow.com/questions/10106465/…
Francis Dean
@FrancisDean yang merupakan kebalikan dari pertanyaan ini yang mencari alamat dari nomor
brettdj
2
@ brettdj Jawaban tertaut menunjukkan nomor ke huruf dan huruf ke nomor.
Francis Dean
2
@FrancisDean fair point, saya melihat judul pertanyaan di tautan daripada jawaban yang diterima
brettdj

Jawaban:

211

Fungsi ini mengembalikan huruf kolom untuk nomor kolom yang diberikan.

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

kode pengujian untuk kolom 100

Sub Test()
    MsgBox Col_Letter(100)
End Sub
brettdj
sumber
9
Anda bisa menambahkan (0)ke akhir perintah Split jika Anda ingin menyimpan sendiri deklarasi variabel dan baris kode tambahan. misCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
Caltor
3
Itu cukup benar, tetapi saya pikir lebih mudah untuk menggunakan beberapa baris.
brettdj
6
Mengapa repot-repot dengan parade Boolean dalam situasi ini. Kamu bisa melakukan ini:............................................. ......v = Split(Cells(1, lngCol).Address, "$")(1)
Excel Hero
1
Meskipun ini sudah sangat tua, saya memiliki tambahan kecil - memeriksa dulu apakah jumlahnya positif, karena jika tidak Anda akan mengalami kesalahan. if lngcol <= 0 then
Selkie
1
Saat menggunakan VBS, ingat itu .Cellsadalah properti Excel, artinya Anda harus menggunakannya <excel_object>.Cells(). Jika tidak, Anda akan mendapatkan kesalahan ketik ketidakcocokan.
Stevoisiak
88

Jika Anda lebih suka tidak menggunakan objek rentang:

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
robartsd
sumber
1
Tidak jelas mengapa Anda memposting metode yang lebih panjang dengan loop berdasarkan Jika Anda lebih suka tidak menggunakan objek rentang:
brettdj
29
@ brettdj Saya bisa membayangkan beberapa alasan: 1) metode ini sekitar 6x lebih cepat dengan pengujian saya 2) itu tidak memerlukan akses ke API Excel 3) itu mungkin memiliki jejak memori yang lebih kecil. EDIT: Juga, saya tidak yakin mengapa saya mengomentari jawaban lebih dari setahun: S
Blackhawk
6
Namun ada kekurangan pada peningkatan kecepatan. Menggunakan objek rentang membuat kesalahan jika Anda memasukkan nomor kolom yang tidak valid. Ini berfungsi bahkan jika seseorang masih menggunakan Excel 2003. Jika Anda memerlukan pengecualian semacam itu, lanjutkan dengan metode rentang. Kalau tidak, pujian untuk robartsd.
Engineer Toast
6
IF ColumnNumber <= Columns.Countakan lebih baik untuk menghindari asumsi seputar versi.
brettdj
1
Alasan lain untuk menggunakan kode ini adalah jika Anda tidak di VBA tetapi di VB, .net, dll.
Maury Markowitz
46

Sesuatu yang bekerja untuk saya adalah:

Cells(Row,Column).Address 

Ini akan mengembalikan referensi format $ AE $ 1 untuk Anda.

Damian Fennelly
sumber
1
Ini tidak menjawab pertanyaan.
Pochmurnik
33

Saya terkejut tidak ada yang menyarankan: ** <code> </code> <code> Kolom (</code> *** <code> Indeks Kolom </code> *** <code>) .Address </code> <code> </code> **

  • Sebagai contoh: MsgBox Columns( 9347 ).Address kembali ** <code> $ MUM: $ MUM </code> ** .

Untuk mengembalikan HANYA huruf kolom :Split((Columns(Column Index).Address(,0)),":")(0)

  • Sebagai contoh: MsgBox Split((Columns( 2734 ).Address(,0)),":")(0) kembali ** <code> AYAH </code> ** .

  Lebih banyak contoh


ashleedawg
sumber
Yang ini berfungsi untuk saya di Office 365: string col = Worksheet.Columns [kolom] .Address; return col.Substring (col.IndexOf (":") + 2); Untuk beberapa alasan, ekspresi lain, seperti Range = Worksheet.Cells [1, kolom], melempar kesalahan (baik dalam panggilan Sel atau ketika saya mencoba mengambil alamat, tidak dapat mengingat - maaf - baris mana melempar di mana kasus tertentu.)
Sam Azer
19

Hanya satu cara lagi untuk melakukan ini. Jawaban Brettdj membuat saya berpikir tentang ini, tetapi jika Anda menggunakan metode ini Anda tidak harus menggunakan array varian, Anda dapat langsung menuju string.

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

atau bisa membuatnya sedikit lebih kompak dengan ini

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

Perhatikan bahwa ini bergantung pada Anda yang mereferensikan baris 1 di objek sel.

OSUZorba
sumber
18

Dan solusi menggunakan rekursi:

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
Nikolay Ivanov
sumber
Potong-dan-tempel sempurna untuk mengonversi angka lebih dari 676. Terima kasih!
David Krider
1
Sisanya tidak pernah bisa lebih dari 26 jadi mengapa tidak bilangan bulat bukan panjang?
Caltor
10
@ Caltor Kecuali jika Anda memiliki tujuan khusus untuk menggunakan Integer, seperti memanggil API yang menuntut satu misalnya, Anda tidak boleh memilih Integer daripada Long. VBA dioptimalkan untuk Longs. Proses VBA Lebih lama lebih cepat daripada Integer.
Excel Hero
1
@ExcelHero Saya tidak tahu itu. Tidakkah Long membutuhkan lebih banyak memori daripada Integer?
Caltor
6
@ Caltor Memang Panjang adalah 32 bit, sementara Integer adalah 16. Tapi itu tidak masalah dalam komputasi modern. 25 tahun yang lalu ... itu sangat berarti. Tetapi hari ini (bahkan 15 tahun yang lalu) perbedaannya sama sekali tidak penting.
Excel Hero
9

Ini tersedia melalui menggunakan rumus:

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

dan demikian juga dapat ditulis sebagai fungsi VBA seperti yang diminta:

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

Ini adalah versi jawaban robartsd (dengan citarasa solusi satu baris Jan Wijninckx ), menggunakan rekursi alih-alih satu lingkaran.

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

Saya sudah menguji ini dengan input berikut:

1   => "A"
26  => "Z"
27  => "AA"
51  => "AY"
702 => "ZZ"
703 => "AAA" 
-1  => ""
-234=> ""
alexanderbird
sumber
2
Saya baru saja memperhatikan bahwa ini pada dasarnya sama dengan solusi Nikolay Ivanov, yang membuat novel saya sedikit kurang. Saya akan meninggalkannya karena ini menunjukkan pendekatan yang sedikit berbeda untuk beberapa minutia
alexanderbird
Solusi yang bagus karena dua alasan: tidak menggunakan objek apa pun (seperti rentang, sel, dan sebagainya); definisi yang sangat kompak.
loved.by.Yesus
8

kode robertsd elegan, namun untuk membuatnya menjadi bukti di masa depan, ubah deklarasi n untuk mengetikkan panjang

Jika Anda ingin rumus untuk menghindari makro, berikut adalah sesuatu yang berfungsi hingga kolom 702 inklusif

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

di mana A1 adalah sel yang berisi nomor kolom yang akan dikonversi menjadi huruf.

Jan Wijninckx
sumber
7

PEMBARUAN TERBARU : Tolong abaikan fungsi di bawah ini, @SurasinTancharoen berhasil mengingatkan saya bahwa ia rusak n = 53.
Bagi mereka yang tertarik, berikut adalah nilai rusak lainnya di bawah n = 200:

Nilai-nilai tertentu dari

Silakan gunakan fungsi @brettdj untuk semua kebutuhan Anda. Bahkan bekerja untuk Microsoft Excel, batas maksimum jumlah kolom terbaru: 16384seharusnya memberiXFD

masukkan deskripsi gambar di sini

AKHIR PEMBARUAN


Fungsi di bawah ini disediakan oleh Microsoft:

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

Sumber: Cara mengonversi angka kolom Excel menjadi karakter alfabet

BERLAKU UNTUK

  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Edisi Standar
  • Microsoft Excel 2000 Edisi Standar
  • Microsoft Excel 97 Edisi Standar
mtbink.com
sumber
2
Untuk referensi, pukes ini dengan set kolom yang lebih besar sebagai Chr () tidak menangani angka besar dengan baik.
Azuvector
2
Ini memiliki bug. Coba ConvertToLetter (53) yang seharusnya 'BA' tetapi itu akan gagal.
Surasin Tancharoen
@SurasinTancharoen Terima kasih banyak untuk mencatat kekurangan ini. Saya tidak pernah berpikir Microsoft akan menyediakan fungsi yang rusak karena merekalah yang menciptakan Microsoft Excel sendiri. Saya akan meninggalkan fungsi ini mulai sekarang dan akan menggunakan fungsi @brettdj yang bahkan memperbaiki hingga maksimum Microsoft Excel terbaru batas kolomCol_Letter(16384) = "XFD"
mtbink.com
4
Dan dari mana asal "pembagian dengan 27" ini? Terakhir saya periksa ada 26 huruf. Inilah sebabnya mengapa kode ini rusak.
ib11
5

Ini adalah fungsi berdasarkan jawaban @ DamienFennelly di atas. Jika Anda memberi saya acungan jempol, berikan juga acungan jempol! : P

Function outColLetterFromNumber(iCol as Integer) as String
    sAddr = Cells(1, iCol).Address
    aSplit = Split(sAddr, "$")
    outColLetterFromNumber = aSplit(1)
End Function
BrettFromLA
sumber
2
Bagus, tapi apa bedanya dengan jawaban yang diterima?
Ioannis
@ Lannis Saya mendasarkan jawaban saya pada jawaban DamianFennelly, bukan jawaban yang diterima. Tapi ya, milik saya sangat mirip dengan jawaban yang diterima, kecuali satu baris dipecah menjadi dua agar lebih mudah dibaca.
BrettFromLA
3

Ada cara yang sangat sederhana menggunakan kekuatan Excel: Gunakan Range.Cells.Addressproperti, dengan cara ini:

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

Ini akan mengembalikan alamat kolom yang diinginkan pada baris 1. Ambil dari 1:

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

Perhatikan bahwa ini sangat cepat dan kuat sehingga Anda dapat mengembalikan alamat kolom yang bahkan ada!

Pengganti lngRowuntuk nomor kolom yang diinginkan menggunakan Selection.Columnproperti!

flaviomorgado
sumber
2

Berikut ini adalah liner sederhana yang dapat digunakan.

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

Ini hanya akan berfungsi untuk penunjukan kolom 1 huruf, tetapi bagus untuk kasus sederhana. Jika Anda membutuhkannya untuk penunjukan 2 huruf secara eksklusif, maka Anda dapat menggunakan yang berikut:

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

Ini akan berfungsi terlepas dari kolom apa di dalam satu baris kode Anda untuk sel yang terletak di baris X, di kolom Y:

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

Jika Anda memiliki sel dengan nama unik "Cellname":

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

Solusi dari brettdj bekerja dengan luar biasa, tetapi jika Anda menemukan ini sebagai solusi potensial untuk alasan yang sama dengan saya, saya pikir saya akan menawarkan solusi alternatif saya.

Masalah yang saya alami adalah bergulir ke kolom tertentu berdasarkan output dari fungsi MATCH (). Alih-alih mengubah nomor kolom menjadi paralel huruf kolomnya, saya memilih untuk sementara beralih gaya referensi dari A1 ke R1C1. Dengan cara ini saya bisa gulir ke nomor kolom tanpa harus membuang dengan fungsi VBA. Untuk beralih antara dua gaya referensi dengan mudah, Anda dapat menggunakan kode VBA ini:

Sub toggle_reference_style()

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

End Sub
Will Ediger
sumber
1

Melanjutkan jawaban brettdj, di sini adalah untuk membuat input nomor kolom opsional. Jika input nomor kolom dihilangkan, fungsi mengembalikan huruf kolom sel yang memanggil ke fungsi. Saya tahu ini juga dapat dicapai hanya dengan menggunakan ColumnLetter(COLUMN()), tetapi saya pikir akan lebih baik jika secara cerdik bisa mengerti.

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

Pertukaran dari fungsi ini adalah bahwa itu akan sangat sangat sedikit lebih lambat daripada jawaban brettdj karena IFtes. Tapi ini bisa dirasakan jika fungsi tersebut berulang kali digunakan untuk jumlah yang sangat besar kali.

Rosetta
sumber
1

Berikut ini adalah jawaban terakhir, hanya untuk pendekatan sederhana menggunakan Int()dan Ifdalam kasus 1-3 kolom karakter:

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
ib11
sumber
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
Krzysztof
sumber
1

Di sini, fungsi sederhana dalam Pascal (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;
Jordi
sumber
1

Rumus ini akan memberikan kolom berdasarkan rentang (yaitu, A1 ), di mana rentang adalah sel tunggal. Jika rentang multi sel diberikan, ia akan mengembalikan sel kiri atas. Catatan, kedua referensi sel harus sama:

MID (CELL ("address", A1 ), 2, SEARCH ("$", CELL ("address", A1 ), 2) -2)

Bagaimana itu bekerja:

CELL ("properti", "rentang") mengembalikan nilai spesifik rentang tergantung pada properti yang digunakan. Dalam hal ini alamat sel. Properti alamat mengembalikan nilai $ [col] $ [baris], yaitu A1 -> $ A $ 1. Fungsi MID mem-parsing nilai kolom antara $ simbol.

Thom
sumber
0

Cara mudah untuk mendapatkan nama kolom

Sub column()

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

End Sub

Saya harap ini membantu =)

cristobal
sumber
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
Chetan V.
sumber
0

Jadi saya terlambat ke pesta di sini, tapi saya ingin berkontribusi jawaban lain yang belum ada orang lain yang belum membahas array. Anda dapat melakukannya dengan manipulasi string sederhana.

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

Setelah Anda memasukkan input dalam format $A$1, gunakan Midfungsi, mulai dari posisi 2 untuk menghitung yang pertama $, kemudian Anda menemukan di mana yang kedua $muncul di string menggunakan InStr, dan kemudian kurangi 2 untuk memperhitungkan posisi awal itu.

Ini memberi Anda manfaat karena dapat beradaptasi untuk seluruh jajaran kolom yang mungkin. Karenanya, ColLetter(1)kembalikan "A", dan ColLetter(16384)kembalikan "XFD", yang merupakan kolom terakhir yang mungkin untuk versi Excel saya.

Burung kedidi
sumber
-1

Huruf kolom dari nomor kolom dapat diekstraksi menggunakan rumus dengan mengikuti langkah-langkah
1. Hitung alamat kolom menggunakan rumus ADDRESS
2. Ekstrak surat kolom menggunakan fungsi MID dan FIND

Contoh:
1. ADDRESS (1000.1000,1)
hasil $ SEMUA $ 1000
2 . = MID (F15,2, FIND ("$", F15,2) -2)
hasil SEMUA asuming F15 berisi hasil langkah 1

Dalam sekali jalan kita dapat menulis
MID (ALAMAT (1000,1000,1), 2, FIND ("$", ALAMAT (1000.1000,1), 2) -2)

Bhanu Sinha
sumber
-1

ini hanya untuk REFEDIT ... pada umumnya menggunakan kode singkat versi uphere ... mudah dibaca dan dipahami / menggunakan poz $

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
Gabriel V
sumber
-2

bagaimana dengan hanya mengkonversi ke nomor ascii dan menggunakan Chr () untuk mengkonversi kembali ke huruf?

col_letter = Chr (Selection.Column + 96)

beef_supreme
sumber
-6

Inilah cara lain:

{

      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

}
Mike Powell
sumber
1
Tidak perlu membuat string yang mencantumkan huruf-huruf alfabet. ASCII pada dasarnya telah melakukan itu untuk kita.
Caltor