Có ai có hàm VBA Excel có thể trả về (các) chữ cái cột từ một số không?
Ví dụ, nhập 100 sẽ trở lại CV
.
Có ai có hàm VBA Excel có thể trả về (các) chữ cái cột từ một số không?
Ví dụ, nhập 100 sẽ trở lại CV
.
Câu trả lời:
Hàm này trả về ký tự cột cho một số cột đã cho.
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
mã kiểm tra cho cột 100
Sub Test()
MsgBox Col_Letter(100)
End Sub
(0)
vào cuối lệnh Split nếu bạn muốn lưu cho mình một khai báo biến và dòng mã bổ sung. ví dụCol_letter = Split(Cells(1, lngCol).Address(True, False), "$")(0)
v = Split(Cells(1, lngCol).Address, "$")(1)
.Cells
là một thuộc tính của Excel, nghĩa là bạn cần sử dụng <excel_object>.Cells()
. Nếu không, bạn sẽ nhận được một lỗi không khớp loại.
Nếu bạn không muốn sử dụng một đối tượng phạm vi:
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ẽ tốt hơn để tránh các giả định xung quanh các phiên bản.
Một cái gì đó phù hợp với tôi là:
Cells(Row,Column).Address
Điều này sẽ trả về tham chiếu định dạng $ AE $ 1 cho bạn.
MsgBox Columns( 9347 ).Address
trả về .Để trả về CHỈ (các) chữ cái cột :Split((Columns(
Column Index
).Address(,0)),":")(0)
MsgBox Split((Columns( 2734 ).Address(,0)),":")(0)
trả về .
Chỉ còn một cách nữa để làm điều này. Câu trả lời của Brettdj khiến tôi nghĩ về điều này, nhưng nếu bạn sử dụng phương pháp này, bạn không phải sử dụng một mảng biến thể, bạn có thể chuyển trực tiếp đến một chuỗi.
ColLtr = Cells(1, ColNum).Address(True, False)
ColLtr = Replace(ColLtr, "$1", "")
hoặc có thể làm cho nó nhỏ gọn hơn một chút với điều này
ColLtr = Replace(Cells(1, ColNum).Address(True, False), "$1", "")
Lưu ý điều này không phụ thuộc vào bạn tham chiếu hàng 1 trong đối tượng ô.
Và một giải pháp sử dụng đệ quy:
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
Điều này có sẵn thông qua việc sử dụng một công thức:
=SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")
và do đó cũng có thể được viết dưới dạng hàm VBA theo yêu cầu:
Function ColName(colNum As Integer) As String
ColName = Split(Worksheets(1).Cells(1, colNum).Address, "$")(1)
End Function
Đây là phiên bản câu trả lời của robartsd (với hương vị của giải pháp một dòng của Jan Wijninckx ), sử dụng đệ quy thay vì vòng lặp.
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
Tôi đã thử nghiệm điều này với các đầu vào sau:
1 => "A"
26 => "Z"
27 => "AA"
51 => "AY"
702 => "ZZ"
703 => "AAA"
-1 => ""
-234=> ""
Mã của robertsd là thanh lịch, nhưng để làm cho nó trở thành bằng chứng trong tương lai, hãy thay đổi khai báo của n để gõ dài
Trong trường hợp bạn muốn một công thức để tránh macro, đây là một cái gì đó hoạt động đến cột 702
=IF(A1>26,CHAR(INT((A1-1)/26)+64),"")&CHAR(MOD(A1-1,26)+65)
Trong đó A1 là ô chứa số cột được chuyển đổi thành chữ cái.
CẬP NHẬT MỚI NHẤT : Vui lòng bỏ qua chức năng bên dưới, @SurasinTancharoen quản lý để thông báo cho tôi rằng nó bị hỏng tại n = 53
.
Đối với những người quan tâm, đây là các giá trị bị hỏng khác ngay bên dướin = 200
:
KẾT THÚC CẬP NHẬT
Chức năng dưới đây được cung cấp bởi 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
Nguồn: Cách chuyển đổi số cột Excel thành các ký tự chữ cái
ÁP DỤNG CHO
Col_Letter(16384) = "XFD"
Đây là một chức năng dựa trên câu trả lời của @ DamienFennelly ở trên. Nếu bạn cho tôi một ngón tay cái lên, cho anh ấy một ngón tay cái quá! : P
Function outColLetterFromNumber(iCol as Integer) as String
sAddr = Cells(1, iCol).Address
aSplit = Split(sAddr, "$")
outColLetterFromNumber = aSplit(1)
End Function
Có một cách rất đơn giản bằng cách sử dụng nguồn Excel: Sử dụng thuộc Range.Cells.Address
tính, theo cách này:
strCol = Cells(1, lngRow).Address(xlRowRelative, xlColRelative)
Điều này sẽ trả về địa chỉ của cột mong muốn trên hàng 1. Lấy địa chỉ 1
:
strCol = Left(strCol, len(strCol) - 1)
Lưu ý rằng nó nhanh và mạnh đến mức bạn có thể trả về các địa chỉ cột thậm chí còn tồn tại!
Thay thế lngRow
cho số cột mong muốn bằng cách sử dụng Selection.Column
tài sản!
Đây là một lót đơn giản có thể được sử dụng.
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 1)
Nó sẽ chỉ hoạt động cho một chỉ định cột 1 chữ cái, nhưng nó là tốt đẹp cho các trường hợp đơn giản. Nếu bạn cần nó để làm việc chỉ với 2 ký tự, thì bạn có thể sử dụng như sau:
ColumnLetter = Mid(Cells(Row, LastColA).Address, 2, 2)
Điều này sẽ hoạt động bất kể cột nào bên trong một dòng mã của bạn cho ô nằm ở hàng X, trong cột Y:
Mid(Cells(X,Y).Address, 2, instr(2,Cells(X,Y).Address,"$")-2)
Nếu bạn có một ô có tên được xác định duy nhất "Cellname":
Mid(Cells(1,val(range("Cellname").Column)).Address, 2, instr(2,Cells(1,val(range("Cellname").Column)).Address,"$")-2)
Giải pháp từ brettdj hoạt động tuyệt vời, nhưng nếu bạn bắt gặp đây là một giải pháp tiềm năng cho cùng một lý do, tôi nghĩ rằng tôi sẽ cung cấp giải pháp thay thế của mình.
Vấn đề tôi gặp phải là cuộn đến một cột cụ thể dựa trên đầu ra của hàm MATCH (). Thay vì chuyển đổi song song số cột thành ký tự cột, tôi đã chọn tạm thời chuyển kiểu tham chiếu từ A1 sang R1C1. Bằng cách này, tôi có thể chỉ cần cuộn đến số cột mà không cần phải thực hiện chức năng VBA. Để dễ dàng chuyển đổi giữa hai kiểu tham chiếu, bạn có thể sử dụng mã VBA này:
Sub toggle_reference_style()
If Application.ReferenceStyle = xlR1C1 Then
Application.ReferenceStyle = xlA1
Else
Application.ReferenceStyle = xlR1C1
End If
End Sub
Hơn nữa về câu trả lời của brettdj, ở đây là làm cho đầu vào của số cột tùy chọn. Nếu đầu vào số cột bị bỏ qua, hàm sẽ trả về ký tự cột của ô gọi đến hàm. Tôi biết điều này cũng có thể đạt được chỉ bằng cách sử dụng ColumnLetter(COLUMN())
, nhưng tôi nghĩ nó sẽ tốt nếu nó có thể hiểu một cách khéo léo như vậy.
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
Sự đánh đổi của chức năng này là nó sẽ rất chậm hơn một chút so với câu trả lời của brettdj vì IF
bài kiểm tra. Nhưng điều này có thể được cảm nhận nếu chức năng được sử dụng nhiều lần trong một số lượng rất lớn.
Đây là một câu trả lời muộn, chỉ dành cho cách tiếp cận đơn giản bằng cách sử dụng Int()
và If
trong trường hợp có 1-3 cột ký tự:
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
Công thức này sẽ đưa ra cột dựa trên một phạm vi (nghĩa là A1 ), trong đó phạm vi là một ô duy nhất. Nếu một phạm vi đa ô được đưa ra, nó sẽ trả về ô trên cùng bên trái. Lưu ý, cả hai tham chiếu ô phải giống nhau:
MID (CELL ("địa chỉ", A1 ), 2, TÌM KIẾM ("$", CELL ("địa chỉ", A1 ), 2) -2)
Làm thế nào nó hoạt động:
CELL ("thuộc tính", "phạm vi") trả về một giá trị cụ thể của phạm vi tùy thuộc vào thuộc tính được sử dụng. Trong trường hợp này là địa chỉ ô. Thuộc tính địa chỉ trả về giá trị $ [col] $ [hàng], tức là A1 -> $ A $ 1. Hàm MID phân tích giá trị cột giữa các ký hiệu $.
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
Vì vậy, tôi đến bữa tiệc muộn ở đây, nhưng tôi muốn đóng góp một câu trả lời khác mà chưa có ai giải quyết mà không liên quan đến mảng. Bạn có thể làm điều đó với thao tác chuỗi đơn giản.
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
Sau khi bạn có đầu vào ở định dạng $A$1
, hãy sử dụng Mid
hàm, bắt đầu ở vị trí 2 để tính toán đầu tiên $
, sau đó bạn tìm vị trí thứ hai $
xuất hiện trong chuỗi bằng cách sử dụng InStr
, sau đó trừ đi 2 để tính đến vị trí bắt đầu đó.
Điều này mang lại cho bạn lợi ích của việc có thể thích ứng với toàn bộ phạm vi của các cột có thể. Do đó, ColLetter(1)
trả lại "A" và ColLetter(16384)
trả lại "XFD", đây là cột có thể cuối cùng cho phiên bản Excel của tôi.
Có thể trích xuất chữ cái cột từ số cột bằng công thức bằng các bước sau
1. Tính toán địa chỉ cột bằng công thức ADDRESS
2. Trích xuất chữ cái cột bằng hàm MID và FIND
Ví dụ:
1. ADDRESS (1000,1000,1)
kết quả $ ALL $
2 2 . = MID (F15,2, FIND ("$", F15,2) -2)
kết quả TẤT CẢ F15 chứa kết quả của bước 1
Trong một lần, chúng ta có thể viết
MID (ĐỊA CHỈ (1000,1000,1), 2, TÌM ("$", ĐỊA CHỈ (1000,1000,1), 2) -2)
cái này chỉ dành cho REFEDIT ... thông thường sử dụng mã uphere phiên bản ngắn ... dễ đọc và dễ hiểu / nó sử dụng poz của $
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 là 65 vì vậy:
MsgBox Chr(ActiveCell.Column + 64)
Tìm thấy trong: http://www.vbaexpress.com/forum/showthread.php?6103-Solve-get-column-letter
Đây là một cách khác:
{
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
}