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
.
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
.
Yanıtlar:
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
(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)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
Excel'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.
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
IF ColumnNumber <= Columns.Count
sürümler hakkındaki varsayımlardan kaçınmak daha iyi olur.
Benim için çalışan bir şey:
Cells(Row,Column).Address
Bu sizin için $ AE $ 1 format referansını döndürecektir.
MsgBox Columns( 9347 ).Address
döner .YALNIZCA sütun harf (ler) ini döndürmek için :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
döner .
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.
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
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
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=> ""
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.
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
:
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
Col_Letter(16384) = "XFD"
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
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 lngRow
kullanarak istediğiniz sütun sayısı için Selection.Column
özellik!
İş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)
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)
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
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, IF
test 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.
İş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
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.
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
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
, Mid
işlevini kullanın, ilkini hesaba katmak için konum 2'de başlayın $
, sonra ikincisini $
kullanarak dizede nerede göründüğünü bulun InStr
ve 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.
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)
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
A başlığı 65'tir:
MsgBox Chr(ActiveCell.Column + 64)
Bulunan: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
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)
İş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
}