Lập trình VBA với Column: chuyển chỉ số cột thành chữ cái

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,705
Giới tính
Nam
Đôi khi trong lập trình VBA các bạn cần chuyển số cột sang chữ. Hàm sau sẽ giúp các bạn:

Mã:
Function ColumnLetter(ColumnNumber As Integer) As String
  If ColumnNumber > 26 Then

    ' 1st character:  Subtract 1 to map the characters to 0-25,
    '                 but you don't have to remap back to 1-26
    '                 after the 'Int' operation since columns
    '                 1-26 have no prefix letter

    ' 2nd character:  Subtract 1 to map the characters to 0-25,
    '                 but then must remap back to 1-26 after
    '                 the 'Mod' operation by adding 1 back in
    '                 (included in the '65')

    ColumnLetter = Chr(Int((ColumnNumber - 1) / 26) + 64) & _
                   Chr(((ColumnNumber - 1) Mod 26) + 65)
  Else
    ' Columns A-Z
    ColumnLetter = Chr(ColumnNumber + 64)
  End If
End Function
Sưu tầm

Lê Văn Duyệt
 
các hàm UDF trên là hàm nào, dẫm chứng 1 cái
À, các hàm trên là toàn bộ luôn bác ạ, cái này ít trang nên em thử hết các bài, rồi em chuyển hết về Double (nếu có). Và vượt quá số kiểu Long thì bị lỗi.
Bác giải thích ép kiểu của toán tử thì em hiểu rồi.
 
Upvote 0
Thớt này vốn đã dứt trên 12 năm.
Chỉ là bị cái bài #35 vô duyên nó đào mồ, hổi một câu không liên hệ cho nên nố lại nổi lên.

12 năm trước VBA hơi khác chút. Và bối cảnh GPE cũng khác cho nên người ta code khác. Điển hình ngày xưa để lấy ký tự người ta dùng hàm Chr, ngày nay người ta Index chuỗi hằng. Cách phân số ngày xưa được hiểu theo base, bây giờ được hiểu theo phép tính chỉ số mảng nhiều chiều.
Do vậy, Code đời bây giờ gọn hơn nhiều:
(hằng được VBA chứa trực tiếp trong code cho nên rất hiệu quả)

Function TenCot(ByVal soCot As Long) As String
Const BANGCHUCAI = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
Do While soCot > 0
TenCot = Mid(BANGCHUCAI, ((soCot - 1) Mod 26) + 1, 1) & TenCot
soCot = (soCot - 1) \ 26
Loop
End Function

Function TenCotDQ(ByVal soCot As Long) As String
Const BANGCHUCAI = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
If soCot <= 0 Then Exit Function
TenCotDQ = TenCotDQ((soCot - 1) \ 26) & Mid(BANGCHUCAI, ((soCot - 1) Mod 26) + 1, 1)
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Bổ sung về từ ngữ ĐỆ QUY:

Ở không đọc lại mấy bài trước lại thấy có vụ nói chuyện về cụm từ "đệ quy".
Có một bài (bài #29) nói rằng đệ quy là trường hợp hàm/sub gọi lại chính mình. Thực sự giải thích như vậy không sai, nhưng chưa đủ. Đó là tịa sao tôi nói "bổ sung" thay vì "đính chính".

Đệ quy tiếng trong nghề là "recursive". Nghĩa hoàn chỉnh tiếng Việt là "gọi vòng".
1. Nếu Sub/Func gọi lại chính mình thì đúng tên là đệ quy tuyến tính, hoặc đệ quy trực tuyến.
2. Nếu Sub A gọi Sub B, và B gọi lại A; hoặc A gọi B, B gọi C, và C gọi A (đó là tại sao tôi dùng từ gọi vòng) thì đó là đệ quy luân hồi, hoặc hoàn hồi., hỗ tương. Gọi chung là đệ quy phi tuyến (không đi theo đường thẳng). Trường hợp này rất khó và rất hiếm cho nên nếu trong đời chưa gặp code ấy lần nào thì cũng không có gì đáng ngạc nhiên. Chỉ cần biết là nó hoàn toàn lô gic và có thể thực hiện.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom