tangoctuan
Thành viên hoạt động



- Tham gia
- 22/4/08
- Bài viết
- 153
- Được thích
- 19
Bạn dùng VBA để giải bài toán này nhé.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: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à!
Mình không biết cách nhờ bạn hỗ trợ giúp.Bạn dùng VBA để giải bài toán này nhé.
Chắc là ưu tiên số 4 rồi vì dữ liệu khá nhiều bácVBA 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)
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).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)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,"")
Chép code sau vào Module: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)
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
AH2=GhepCot(A2:AF2,"Nok")
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)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,"")
Đú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ạn thử dùngBạ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)
=SUBSTITUTE(TEXTJOIN(",",1,IF(ISNUMBER(FIND("Nok",A2:AF2)),ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Cũng nên nói rõ phiên bản nào dùng được hàm này nhé.Bạn thử dùng
Mã:=SUBSTITUTE(TEXTJOIN(",",1,IF(ISNUMBER(FIND("Nok",A2:AF2)),ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Em thấy bài #4 có dùng hàm TEXTJOIN() rồi mà chủ thớt không thắc mắc gì về hàm nên em nghĩ excel chủ thớt có hàmg này rồiCũng nên nói rõ phiên bản nào dùng được hàm này nhé.
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).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
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ạn thử dùng
Mã:=SUBSTITUTE(TEXTJOIN(",",1,IF(ISNUMBER(FIND("Nok",A2:AF2)),ADDRESS(1,COLUMN(A2:AF2),4),"")),1,"")
Đưa nó vào 1 ParamArray rồi duyệt qua thôi bạn.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.
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é.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!
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!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
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é.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!
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.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é.
Chính xác là thế đó bạn. Đó là hạn chế, chỉ dùng cho dữ liệu nhỏ mà thôi.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.
Hi. Cảm ơn bác, em đã hiểu.Chính xác là thế đó bạn. Đó là hạn chế, chỉ dùng cho dữ liệu nhỏ mà thôi.