Nhờ hướng dẫn cách tìm tên cột theo điều kiện (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tangoctuan

Thành viên hoạt động
Tham gia
22/4/08
Bài viết
153
Được thích
19
Chào cả nhà. Nhờ cả nhà chỉ giúp cách trả kết quả vào cột AG theo như file mẫu gửi kèm ạ. Cảm ơn cả nhà!
 

File đính kèm

VBA bài này không khó. Nhưng cũng có thể là nơi tranh đua thuật toán:
1. giải nhất, thuật toán dễ hiểu, dễ chỉnh sửa
2. thuật toán độc đáo, không giống ai, (mở mang tầm nhìn)
3. thuật toán code ngắn nhất. (cái này ngược với trên, không mở mang đợc tầm nhìn)
4. thuật toán nhanh nhất (sở dĩ thuật toán này xếp cuối là vì "nhanh" tuỳ thuộc vào độ phân phối của dữ liệu)
 
Chào cả nhà. Nhờ cả nhà chỉ giúp cách trả kết quả vào cột AG theo như file mẫu gửi kèm ạ. Cảm ơn cả nhà!
Excel của bạn có hàm TEXTJOIN() không? Nếu có, sử dụng công thức mảng sau:

=SUBSTITUTE(TEXTJOIN(",",1,IF(A2:AF2="Nok",ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
 
Lần chỉnh sửa cuối:
Bạn dùng VBA để giải bài toán này nhé.
Mình không biết cách nhờ bạn hỗ trợ giúp.
Bài đã được tự động gộp:

VBA bài này không khó. Nhưng cũng có thể là nơi tranh đua thuật toán:
1. giải nhất, thuật toán dễ hiểu, dễ chỉnh sửa
2. thuật toán độc đáo, không giống ai, (mở mang tầm nhìn)
3. thuật toán code ngắn nhất. (cái này ngược với trên, không mở mang đợc tầm nhìn)
4. thuật toán nhanh nhất (sở dĩ thuật toán này xếp cuối là vì "nhanh" tuỳ thuộc vào độ phân phối của dữ liệu)
Chắc là ưu tiên số 4 rồi vì dữ liệu khá nhiều bác
Bài đã được tự động gộp:

Excel của bạn có hàm TEXTJOIN() không? Nếu có, sử dụng công thức mảng sau:

=SUBSTITUTE(TEXTJOIN(",",1,IF(A2:AF2="Nok",ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Tuyệt quá, cảm ơn bạn, không biết với dữ liệu lớn có bị chậm không (khoảng 200k dòng).
 
Lần chỉnh sửa cuối:
Excel của bạn có hàm TEXTJOIN() không? Nếu có, sử dụng công thức mảng sau:

=SUBSTITUTE(TEXTJOIN(",",1,IF(A2:AF2="Nok",ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Bạn ơi cho hỏi chút, nếu muốn tìm chính xác Nok thì phải làm như nào nhỉ? (NOK hay nOK hay...đều không được)
 
Bạn ơi cho hỏi chút, nếu muốn tìm chính xác Nok thì phải làm như nào nhỉ? (NOK hay nOK hay...đều không được)
Chép code sau vào Module:

Mã:
Function GhepCot(rng As Range, strDk As String) As String
    For Each rng In rng
        If rng = strDk Then GhepCot = GhepCot & ", " & Split(rng.Address(1, 0), "$")(0)
    Next
    GhepCot = Application.Substitute(GhepCot, ", ", "", 1)
End Function

Mã:
AH2=GhepCot(A2:AF2,"Nok")

1607580884076.png
 
Excel của bạn có hàm TEXTJOIN() không? Nếu có, sử dụng công thức mảng sau:

=SUBSTITUTE(TEXTJOIN(",",1,IF(A2:AF2="Nok",ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Bạn ơi cho hỏi chút, nếu muốn tìm chính xác Nok thì phải làm như nào nhỉ? (NOK hay nOK hay ... đều không được)
Chép code sau vào Module:

Mã:
Function GhepCot(rng As Range, strDk As String) As String
    For Each rng In rng
        If rng = strDk Then GhepCot = GhepCot & ", " & Split(rng.Address(1, 0), "$")(0)
    Next
    GhepCot = Application.Substitute(GhepCot, ", ", "", 1)
End Function

Mã:
AH2=GhepCot(A2:AF2,"Nok")

View attachment 250960
Đúng ý mình luôn. Cảm ơn bạn rất nhiều! Chúc bạn sức khỏe!
 
Chép code sau vào Module:

Mã:
Function GhepCot(rng As Range, strDk As String) As String
    For Each rng In rng
        If rng = strDk Then GhepCot = GhepCot & ", " & Split(rng.Address(1, 0), "$")(0)
    Next
    GhepCot = Application.Substitute(GhepCot, ", ", "", 1)
End Function

Mã:
AH2=GhepCot(A2:AF2,"Nok")

View attachment 250960
Bác cho em hỏi nếu muốn chỉ tìm kết quả trên từng khoảng cột không liền nhau thì làm cách nào ạ? Ví dụ chỉ muốn tìm kết quả tại các khoảng A2:Z2 và AD2:AF2 (chứ ko phải liền từ A đến AF).
Bạn thử dùng
Mã:
=SUBSTITUTE(TEXTJOIN(",",1,IF(ISNUMBER(FIND("Nok",A2:AF2)),ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Cám ơn bạn, cách này thuần sử dụng hàm có sẵn nên cũng rất hay, mình sẽ tham khảo học hỏi, chỉ sợ dữ liệu của mình khoảng 500k dòng sẽ chạy chậm.
 
Bác cho em hỏi nếu muốn chỉ tìm kết quả trên từng khoảng cột không liền nhau thì làm cách nào ạ? Ví dụ chỉ muốn tìm kết quả tại các khoảng A2:Z2 và AD2:AF2 (chứ ko phải liền từ A đến AF).

Cám ơn bạn, cách này thuần sử dụng hàm có sẵn nên cũng rất hay, mình sẽ tham khảo học hỏi, chỉ sợ dữ liệu của mình khoảng 500k dòng sẽ chạy chậm.
Đưa nó vào 1 ParamArray rồi duyệt qua thôi bạn.

1607758863370.png
 
Cái này mới với em quá nên chưa hiểu rõ cần phải làm gì. Bác có thể hướng dẫn cách làm cụ thể hơn được không ạ? Cảm ơn bác!
Bạn chép code sau vào module rồi thử như bài 13 nhé.
Mã:
Function GhepCot_ParamArray(strDk As String, ParamArray args() As Variant)
    Dim c, rng
    For Each rng In args
        For Each c In rng
            If c = strDk Then GhepCot_ParamArray = GhepCot_ParamArray & ", " & Split(c.Address(1, 0), "$")(0)
        Next
    Next
    GhepCot_ParamArray = Application.Substitute(GhepCot_ParamArray, ", ", "", 1)
End Function
 
Bạn chép code sau vào module rồi thử như bài 13 nhé.
Mã:
Function GhepCot_ParamArray(strDk As String, ParamArray args() As Variant)
    Dim c, rng
    For Each rng In args
        For Each c In rng
            If c = strDk Then GhepCot_ParamArray = GhepCot_ParamArray & ", " & Split(c.Address(1, 0), "$")(0)
        Next
    Next
    GhepCot_ParamArray = Application.Substitute(GhepCot_ParamArray, ", ", "", 1)
End Function
Hoàn hảo quá. Đúng luôn mong muốn. Không biết nói gì về sự ảo diệu tuyệt vời của VBA nữa. Một lần nữa xin cảm ơn bác rất nhiều!
 
Hoàn hảo quá. Đúng luôn mong muốn. Không biết nói gì về sự ảo diệu tuyệt vời của VBA nữa. Một lần nữa xin cảm ơn bác rất nhiều!
Cách trên chưa phải là hoàn hảo. Chắc chắn sẽ còn nhiều cách khác hay hơn. Nếu tiếp tục nghiên cứu, sau này bạn sẽ tự ngộ ra nhé.
 
Cách trên chưa phải là hoàn hảo. Chắc chắn sẽ còn nhiều cách khác hay hơn. Nếu tiếp tục nghiên cứu, sau này bạn sẽ tự ngộ ra nhé.
Bác ơi, hình như hàm tự tạo thì chạy lâu hơn hàm có sẵn nhỉ. Em fill xuống cho khoảng 100k dòng thì chỉ tính riêng thời gian cho fill thôi (chưa chạy kết quả, em để Cacul Manual, khi nào chạy thì F9 sau) cũng mất khoảng 5 phút, mà em chỉ fill mỗi công thức (Fx) thôi đó ạ, không phải copy paste. Cùng số dòng đó nếu fill bằng hàm có sẵn thì rất nhanh.
 
Bác ơi, hình như hàm tự tạo thì chạy lâu hơn hàm có sẵn nhỉ. Em fill xuống cho khoảng 100k dòng thì chỉ tính riêng thời gian cho fill thôi (chưa chạy kết quả, em để Cacul Manual, khi nào chạy thì F9 sau) cũng mất khoảng 5 phút, mà em chỉ fill mỗi công thức (Fx) thôi đó ạ, không phải copy paste. Cùng số dòng đó nếu fill bằng hàm có sẵn thì rất nhanh.
Chính xác là thế đó bạn. Đó là hạn chế, chỉ dùng cho dữ liệu nhỏ mà thôi.
 
Web KT

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

Back
Top Bottom