Adakah yang memiliki fungsi Excel VBA yang dapat mengembalikan huruf kolom dari suatu nomor?
Misalnya, memasukkan 100 harus kembali CV
.
Adakah yang memiliki fungsi Excel VBA yang dapat mengembalikan huruf kolom dari suatu nomor?
Misalnya, memasukkan 100 harus kembali CV
.
Jawaban:
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
(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:
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
IF ColumnNumber <= Columns.Count
akan lebih baik untuk menghindari asumsi seputar versi.
Sesuatu yang bekerja untuk saya adalah:
Cells(Row,Column).Address
Ini akan mengembalikan referensi format $ AE $ 1 untuk Anda.
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 .
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.
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
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
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=> ""
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.
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
:
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
Col_Letter(16384) = "XFD"
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
Ada cara yang sangat sederhana menggunakan kekuatan Excel: Gunakan Range.Cells.Address
properti, 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 lngRow
untuk nomor kolom yang diinginkan menggunakan Selection.Column
properti!
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)
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)
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
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 IF
tes. 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 If
dalam 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
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.
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
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 Mid
fungsi, 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 $
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
Cap A adalah 65 jadi:
MsgBox Chr(ActiveCell.Column + 64)
Ditemukan di: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
bagaimana dengan hanya mengkonversi ke nomor ascii dan menggunakan Chr () untuk mengkonversi kembali ke huruf?
col_letter = Chr (Selection.Column + 96)
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
}