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 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
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.
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.
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 AsInteger)AsString
ColName = Split(Worksheets(1).Cells(1, colNum).Address,"$")(1)EndFunction
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
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:
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
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:
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:
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
EndIfEndSub
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.
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.
Berikut ini adalah jawaban terakhir, hanya untuk pendekatan sederhana menggunakan Int()dan Ifdalam kasus 1-3 kolom karakter:
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;
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:
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.
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 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
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.
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)
ini hanya untuk REFEDIT ... pada umumnya menggunakan kode singkat versi uphere ... mudah dibaca dan dipahami / menggunakan poz $
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
Jawaban:
Fungsi ini mengembalikan huruf kolom untuk nomor kolom yang diberikan.
kode pengujian untuk kolom 100
sumber
(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)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
adalah properti Excel, artinya Anda harus menggunakannya<excel_object>.Cells()
. Jika tidak, Anda akan mendapatkan kesalahan ketik ketidakcocokan.Jika Anda lebih suka tidak menggunakan objek rentang:
sumber
IF ColumnNumber <= Columns.Count
akan lebih baik untuk menghindari asumsi seputar versi.Sesuatu yang bekerja untuk saya adalah:
Ini akan mengembalikan referensi format $ AE $ 1 untuk Anda.
sumber
MsgBox Columns( 9347 ).Address
kembali .Untuk mengembalikan HANYA huruf kolom :
Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
kembali .sumber
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.
atau bisa membuatnya sedikit lebih kompak dengan ini
Perhatikan bahwa ini bergantung pada Anda yang mereferensikan baris 1 di objek sel.
sumber
Dan solusi menggunakan rekursi:
sumber
Ini tersedia melalui menggunakan rumus:
dan demikian juga dapat ditulis sebagai fungsi VBA seperti yang diminta:
sumber
Ini adalah versi jawaban robartsd (dengan citarasa solusi satu baris Jan Wijninckx ), menggunakan rekursi alih-alih satu lingkaran.
Saya sudah menguji ini dengan input berikut:
sumber
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
di mana A1 adalah sel yang berisi nomor kolom yang akan dikonversi menjadi huruf.
sumber
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
:Silakan gunakan fungsi @brettdj untuk semua kebutuhan Anda. Bahkan bekerja untuk Microsoft Excel, batas maksimum jumlah kolom terbaru:
16384
seharusnya memberiXFD
AKHIR PEMBARUAN
Fungsi di bawah ini disediakan oleh Microsoft:
Sumber: Cara mengonversi angka kolom Excel menjadi karakter alfabet
BERLAKU UNTUK
sumber
Col_Letter(16384) = "XFD"
Ini adalah fungsi berdasarkan jawaban @ DamienFennelly di atas. Jika Anda memberi saya acungan jempol, berikan juga acungan jempol! : P
sumber
Ada cara yang sangat sederhana menggunakan kekuatan Excel: Gunakan
Range.Cells.Address
properti, dengan cara ini:Ini akan mengembalikan alamat kolom yang diinginkan pada baris 1. Ambil dari
1
:Perhatikan bahwa ini sangat cepat dan kuat sehingga Anda dapat mengembalikan alamat kolom yang bahkan ada!
Pengganti
lngRow
untuk nomor kolom yang diinginkan menggunakanSelection.Column
properti!sumber
Berikut ini adalah liner sederhana yang dapat digunakan.
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:
sumber
Ini akan berfungsi terlepas dari kolom apa di dalam satu baris kode Anda untuk sel yang terletak di baris X, di kolom Y:
Jika Anda memiliki sel dengan nama unik "Cellname":
sumber
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:
sumber
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.Pertukaran dari fungsi ini adalah bahwa itu akan sangat sangat sedikit lebih lambat daripada jawaban brettdj karena
IF
tes. Tapi ini bisa dirasakan jika fungsi tersebut berulang kali digunakan untuk jumlah yang sangat besar kali.sumber
Berikut ini adalah jawaban terakhir, hanya untuk pendekatan sederhana menggunakan
Int()
danIf
dalam kasus 1-3 kolom karakter:sumber
sumber
Di sini, fungsi sederhana dalam Pascal (Delphi).
sumber
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.
sumber
Cara mudah untuk mendapatkan nama kolom
Saya harap ini membantu =)
sumber
sumber
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.
Setelah Anda memasukkan input dalam format
$A$1
, gunakanMid
fungsi, mulai dari posisi 2 untuk menghitung yang pertama$
, kemudian Anda menemukan di mana yang kedua$
muncul di string menggunakanInStr
, 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", danColLetter(16384)
kembalikan "XFD", yang merupakan kolom terakhir yang mungkin untuk versi Excel saya.sumber
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)
sumber
ini hanya untuk REFEDIT ... pada umumnya menggunakan kode singkat versi uphere ... mudah dibaca dan dipahami / menggunakan poz $
sumber
Cap A adalah 65 jadi:
MsgBox Chr(ActiveCell.Column + 64)
Ditemukan di: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
sumber
bagaimana dengan hanya mengkonversi ke nomor ascii dan menggunakan Chr () untuk mengkonversi kembali ke huruf?
col_letter = Chr (Selection.Column + 96)
sumber
Inilah cara lain:
sumber