क्या किसी के पास एक्सेल VBA फ़ंक्शन है जो किसी संख्या से कॉलम अक्षर (ओं) को वापस कर सकता है?
उदाहरण के लिए, 100 में प्रवेश करना चाहिए CV
।
क्या किसी के पास एक्सेल VBA फ़ंक्शन है जो किसी संख्या से कॉलम अक्षर (ओं) को वापस कर सकता है?
उदाहरण के लिए, 100 में प्रवेश करना चाहिए CV
।
जवाबों:
यह फ़ंक्शन किसी दिए गए कॉलम नंबर के लिए कॉलम अक्षर देता है।
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
कॉलम 100 के लिए परीक्षण कोड
Sub Test()
MsgBox Col_Letter(100)
End Sub
(0)
स्प्लिट कमांड के अंत में जोड़ सकते हैं यदि आप अपने आप को एक चर घोषणा और कोड की अतिरिक्त लाइन को बचाना चाहते हैं। जैसेCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
एक्सेल की एक संपत्ति है, जिसका अर्थ है कि आपको उपयोग करने की आवश्यकता है <excel_object>.Cells()
। अन्यथा, आपको एक प्रकार की बेमेल त्रुटि मिलेगी।
यदि आप श्रेणी वस्तु का उपयोग नहीं करते हैं:
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
संस्करणों के आसपास मान्यताओं से बचने के लिए बेहतर होगा।
मेरे लिए कुछ काम करता है:
Cells(Row,Column).Address
यह आपके लिए $ AE $ 1 प्रारूप संदर्भ लौटाएगा।
MsgBox Columns( 9347 ).Address
रिटर्न ।केवल कॉलम अक्षर वापस करने के लिए :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
रिटर्न ।
ऐसा करने का सिर्फ एक और तरीका है। ब्रेटडज के जवाब ने मुझे यह सोचने पर मजबूर कर दिया, लेकिन अगर आप इस विधि का उपयोग करते हैं तो आपको एक वेरिएंट सरणी का उपयोग करने की आवश्यकता नहीं है, आप सीधे स्ट्रिंग पर जा सकते हैं।
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
या इसे इसके साथ थोड़ा और अधिक कॉम्पैक्ट बना सकते हैं
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
ध्यान दें कि यह आपको सेल ऑब्जेक्ट में पंक्ति 1 संदर्भित करने पर निर्भर करता है।
और पुनरावृत्ति का उपयोग कर एक समाधान:
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
यह एक सूत्र का उपयोग करके उपलब्ध है:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
और इसलिए अनुरोध के अनुसार VBA फ़ंक्शन के रूप में भी लिखा जा सकता है:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
यह एक लूप के बजाय पुनरावर्तन का उपयोग करते हुए, रोबर्ट्सड के उत्तर का एक संस्करण है ( जन विज्निक्स के एक लाइन समाधान के स्वाद के साथ )।
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
मैंने निम्न इनपुट के साथ इसका परीक्षण किया है:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
robertsd का कोड सुरुचिपूर्ण है, फिर भी इसे भविष्य का प्रमाण बनाने के लिए, n के प्रकार को लंबे समय तक घोषित करने के लिए बदलें
यदि आप मैक्रो से बचने के लिए एक फॉर्मूला चाहते हैं, तो यहाँ कुछ ऐसा है जो 702 कॉलम तक काम करता है
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
जहां A1 वह सेल है जिसमें कॉलम नंबर को अक्षरों में बदलना है।
नवीनतम अद्यतन : कृपया नीचे दिए गए फ़ंक्शन को अनदेखा करें, @SurasinTancharoen मुझे सतर्क करने में कामयाब रहा कि यह टूट गया है n = 53
।
जो लोग रुचि रखते हैं, उनके लिए यहां नीचे अन्य टूटे हुए मूल्य हैं n = 200
:
अद्यतन का अंत
नीचे दिया गया कार्य 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
स्रोत: एक्सेल कॉलम संख्याओं को वर्णमाला वर्णों में कैसे बदलें
प्र लागू होता है
Col_Letter(16384) = "XFD"
यह @ DamienFennelly के उत्तर के ऊपर आधारित एक फ़ंक्शन है। यदि आप मुझे एक अंगूठे दे, उसे भी एक अंगूठे दे दो! : पी
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
एक्सेल पावर का उपयोग करने का एक बहुत ही सरल तरीका है: Range.Cells.Address
संपत्ति का उपयोग करें , इस तरह से:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
यह पंक्ति 1 पर वांछित कॉलम का पता लौटाएगा। इसे ले जाएं 1
:
strCol = Left(strCol, len(strCol) - 1)
ध्यान दें कि यह इतना तेज़ और शक्तिशाली है कि आप स्तंभ के पते भी वापस कर सकते हैं जो कि मौजूद हैं!
संपत्ति lngRow
का उपयोग कर वांछित कॉलम नंबर के लिए स्थानापन्न Selection.Column
!
यहाँ एक सरल एक लाइनर है जिसका उपयोग किया जा सकता है।
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
यह केवल 1 अक्षर वाले कॉलम के लिए काम करेगा, लेकिन साधारण मामलों के लिए अच्छा है। यदि आपको विशेष रूप से 2 पत्र पदनामों के लिए काम करने की आवश्यकता है, तो आप निम्नलिखित का उपयोग कर सकते हैं:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
यह कॉलम Y में, पंक्ति X में स्थित सेल thats के लिए आपकी एक कोड लाइन के अंदर किस कॉलम के बिना काम करेगा:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
यदि आपके पास अद्वितीय परिभाषित नाम "Cellname" के साथ एक सेल है:
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
Brettdj से समाधान काल्पनिक रूप से काम करता है, लेकिन यदि आप इस कारण से एक संभावित समाधान के रूप में मेरे पास आ रहे हैं, तो मैंने सोचा था कि मैं अपना वैकल्पिक समाधान पेश करूंगा।
समस्या मुझे एक MATCH () फ़ंक्शन के आउटपुट के आधार पर एक विशिष्ट कॉलम पर स्क्रॉल कर रही थी। स्तंभ संख्या को इसके स्तंभ पत्र के समानांतर बदलने के बजाय, मैंने संदर्भ शैली को A1 से R1C1 तक अस्थायी रूप से टॉगल करने के लिए चुना। इस तरह मैं सिर्फ वीबीए फंक्शन से जुड़े बिना कॉलम नंबर पर स्क्रॉल कर सकता था। दो संदर्भ शैलियों के बीच आसानी से टॉगल करने के लिए, आप इस VBA कोड का उपयोग कर सकते हैं:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
ब्रेटडज उत्तर पर आगे, यहां कॉलम नंबर के इनपुट को वैकल्पिक बनाना है। यदि स्तंभ संख्या इनपुट छोड़ा गया है, तो फ़ंक्शन उस सेल के स्तंभ पत्र को लौटाता है जो फ़ंक्शन को कॉल करता है। मुझे पता है कि यह भी केवल का उपयोग करके प्राप्त किया जा सकता है ColumnLetter(COLUMN())
, लेकिन मुझे लगा कि अगर यह चतुराई से समझ सकता है तो यह अच्छा होगा।
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
इस फ़ंक्शन का व्यापार बंद यह है कि यह IF
परीक्षण की वजह से ब्रेटडज के उत्तर की तुलना में बहुत थोड़ा धीमा होगा । लेकिन यह महसूस किया जा सकता है यदि फ़ंक्शन को बार-बार बहुत बड़ी मात्रा में उपयोग किया जाता है।
यहाँ देर से उत्तर दिया गया है, सिर्फ़ उपयोग करने के लिए Int()
और If
1-3 चरित्र स्तंभों के मामले में:
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
यह सूत्र एक श्रेणी (जैसे, A1 ) के आधार पर कॉलम देगा , जहां रेंज एकल कक्ष है। यदि मल्टी-सेल रेंज दी जाती है तो यह टॉप-लेफ्ट सेल को लौटा देगा। ध्यान दें, दोनों सेल संदर्भ समान होना चाहिए:
MID (CELL ("पता", A1 ), 2, SEARCH ("$", CELL ("पता", A1 ), 2) -2)
यह काम किस प्रकार करता है:
CELL ("प्रॉपर्टी", "रेंज") उपयोग की गई प्रॉपर्टी के आधार पर रेंज का एक विशिष्ट मूल्य देता है। इस मामले में सेल का पता। पता संपत्ति का मूल्य $ [col] $ [पंक्ति], यानी A1 -> $ A $ 1 है। MID फ़ंक्शन $ प्रतीकों के बीच कॉलम मान को पार्स करता है।
कॉलम नाम प्राप्त करने का आसान तरीका
Sub column()
cell=cells(1,1)
column = Replace(cell.Address(False, False), cell.Row, "")
msgbox column
End Sub
मुझे आशा है कि यह मदद करता है =)
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
इसलिए मुझे यहां पार्टी में देर हो गई है, लेकिन मैं एक और जवाब देना चाहता हूं जो किसी और ने अभी तक संबोधित नहीं किया है जिसमें सरणियां शामिल नहीं हैं। आप इसे सरल स्ट्रिंग हेरफेर के साथ कर सकते हैं।
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
आपके पास प्रारूप में इनपुट होने के बाद $A$1
, Mid
फ़ंक्शन का उपयोग करें , पहले के लिए खाते की स्थिति 2 पर शुरू करें $
, फिर आप पाते हैं कि दूसरा $
स्ट्रिंग का उपयोग करते हुए कहां दिखाई देता है InStr
, और फिर उस प्रारंभिक स्थिति के लिए खाते से 2 को घटाएं।
यह आपको संभावित स्तंभों की पूरी श्रृंखला के लिए अनुकूलनीय होने का लाभ देता है। इसलिए, ColLetter(1)
"ए" ColLetter(16384)
वापस देता है , और "एक्सएफडी" वापस देता है, जो मेरे एक्सेल संस्करण के लिए अंतिम संभव स्तंभ है।
स्तंभ संख्या से स्तंभ पत्र को निम्न चरणों का पालन करके सूत्र का उपयोग करके निकाला जा सकता है
। ADDRESS सूत्र का उपयोग करके स्तंभ पते की गणना करें ।
MID और FIND फ़ंक्शन का उपयोग करके स्तंभ पत्र निकालें
उदाहरण:
1. ADDRESS (1000,1000,1)
परिणाम सभी $ 1000 $
2 । = MID (F15,2, FIND ("$", F15,2) -2)
परिणाम यह मानते हैं कि सभी F15 में चरण 1 का परिणाम होता है
एक बार में हम
MID (ADDRESS (1000,1000,1), 2, FIND लिख सकते हैं ( "$", पते (1000,1000,1), 2) -2)
यह केवल REFEDIT के लिए है ... सामान्य रूप से शीघ्र ही वर्जन कोड का उपयोग करें ... पढ़ने और समझने में आसान / यह $ 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
कैप ए 65 है तो:
MsgBox Chr(ActiveCell.Column + 64)
इसमें मिला: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
क्या सिर्फ एससीआई संख्या में परिवर्तित करने और Chr () का उपयोग करने के लिए एक पत्र में वापस परिवर्तित?
col_letter = Chr (चयन। कॉलम + 96)
यहाँ एक और तरीका है:
{
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
}