ใครบ้างมีฟังก์ชั่น Excel VBA ซึ่งสามารถส่งคืนตัวอักษรคอลัมน์จากตัวเลขได้หรือไม่?
ยกตัวอย่างเช่นการป้อน100CV
ควรกลับ
ใครบ้างมีฟังก์ชั่น Excel VBA ซึ่งสามารถส่งคืนตัวอักษรคอลัมน์จากตัวเลขได้หรือไม่?
ยกตัวอย่างเช่นการป้อน100CV
ควรกลับ
คำตอบ:
ฟังก์ชันนี้ส่งคืนตัวอักษรคอลัมน์สำหรับหมายเลขคอลัมน์ที่กำหนด
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)
ตอนท้ายของคำสั่ง Split หากคุณต้องการบันทึกการประกาศตัวแปรและบรรทัดรหัสเพิ่มเติมด้วยตนเอง เช่นCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
เป็นทรัพย์สินของ Excel <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)
อีกวิธีหนึ่งในการทำเช่นนี้ คำตอบของ Brettdjทำให้ฉันคิดถึงสิ่งนี้ แต่ถ้าคุณใช้วิธีนี้คุณไม่ต้องใช้อาเรย์ตัวแปรคุณสามารถไปที่สตริงได้โดยตรง
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
นี่เป็นรุ่นของคำตอบของ robartsd (ด้วยรสชาติของโซลูชั่นบรรทัดเดียวของJan Wijninckx ) โดยใช้การเรียกซ้ำแทนการวนซ้ำ
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
ที่มา: วิธีแปลงหมายเลขคอลัมน์ Excel เป็นอักขระแบบตัวอักษร
ใช้กับ
Col_Letter(16384) = "XFD"
นี่เป็นฟังก์ชั่นตามคำตอบของ @ DamienFennellyด้านบน หากคุณยกนิ้วให้ฉันให้ยกนิ้วให้เขาด้วย! : P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
มีวิธีง่ายๆในการใช้พลังงาน Excel: ใช้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)
สิ่งนี้จะทำงานโดยไม่คำนึงว่าคอลัมน์ใดในโค้ดบรรทัดหนึ่งสำหรับเซลล์ที่อยู่ในแถว X ในคอลัมน์ Y:
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 หากต้องการสลับระหว่างสไตล์การอ้างอิงทั้งสองอย่างง่ายดายคุณสามารถใช้รหัส VBA นี้:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
เพิ่มเติมจากคำตอบ brettdj นี่คือการทำให้การป้อนหมายเลขคอลัมน์ไม่จำเป็น หากไม่ใส่หมายเลขคอลัมน์ฟังก์ชันจะส่งคืนตัวอักษรคอลัมน์ของเซลล์ที่เรียกใช้ฟังก์ชัน ฉันรู้ว่านี่สามารถทำได้โดยใช้เพียง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
การปิดฟังก์ชั่นนี้คือมันช้ากว่าคำตอบของ brettdj เล็กน้อยเนื่องจากการ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
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
ที่นี่ฟังก์ชั่นง่าย ๆ ใน 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;
สูตรนี้จะให้คอลัมน์ตามช่วง (เช่นA1 ) โดยที่ช่วงคือเซลล์เดียว หากกำหนดช่วงหลายเซลล์จะส่งคืนเซลล์ด้านซ้ายบน หมายเหตุการอ้างอิงเซลล์ทั้งสองจะต้องเหมือนกัน:
MID (CELL ("ที่อยู่", A1 ), 2, SEARCH ("$", CELL ("ที่อยู่", A1) ), 2) -2)
มันทำงานอย่างไร:
CELL ("property", "range") จะส่งคืนค่าเฉพาะของช่วงขึ้นอยู่กับคุณสมบัติที่ใช้ ในกรณีนี้ที่อยู่เซลล์ คุณสมบัติที่อยู่ส่งคืนค่า $ [col] $ [row] เช่น 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)
ให้ "A" คืนและ ColLetter(16384)
ให้ "XFD" ซึ่งเป็นคอลัมน์สุดท้ายที่เป็นไปได้สำหรับรุ่น Excel ของฉัน
สามารถดึงตัวอักษรคอลัมน์จากหมายเลขคอลัมน์โดยใช้สูตรโดยทำตามขั้นตอนต่อไปนี้
1. คำนวณที่อยู่คอลัมน์โดยใช้สูตรที่อยู่
2. แยกตัวอักษรคอลัมน์โดยใช้ฟังก์ชัน MID และ FIND
ตัวอย่าง:
1. ที่อยู่ (1,000,1000,1)
ผลลัพธ์ $ ALL $ 1000
2 . = ผลลัพธ์ MID (F15,2, FIND ("$", F15,2) -2)
ALL asuming F15 มีผลลัพธ์ของขั้นตอนที่ 1
ในครั้งเดียวเราสามารถเขียน
MID (ที่อยู่ (1,000,1000,1), 2, FIND ( "$", ที่อยู่ (1000,1000,1) 2) -2)
นี่เป็นเพียง REFEDIT เท่านั้น ... Generaly ใช้ uphere code รุ่นสั้น ๆ ... ง่ายต่อการอ่านและเข้าใจ / ใช้ 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 คือ 65 ดังนั้น:
MsgBox Chr(ActiveCell.Column + 64)
พบใน: http://www.vbaexpress.com/forum/showthread.php?6103-Solved-get-column-letter
แล้วแปลงเป็นเลข ascii และใช้ 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
}