2 ý đầu em làm được nhưng còn ý thứ 3 thì ở bài #7 em còn 1 vấn đề chưa giải quyết dc. Mong thầy giúp.Gửi bởi ndu96081631
2 ý đầu em làm được nhưng còn ý thứ 3 thì ở bài #7 em còn 1 vấn đề chưa giải quyết dc. Mong thầy giúp.Gửi bởi ndu96081631
</div>Gửi bởi Hau151978
</div>
Code này cũng chưa được luôn nếu vùng dữ liệu có cell rổng hoặc chưa được sort trước
---------------------------------
Thật ra dạng bài này đã có trên GPE lâu rồi, chẳng hạn là chỗ này:Gửi bởi chuot0106
http://www.giaiphapexcel.com/forum/s...E1%BB%99t-cell
Tham khảo nhé
</div>Gửi bởi Hau151978
</div>
Giờ mới rỗi ngồi test code anh Hau thấy Ok lắm! Cảm ơn anh!
Chưa OK đâu, ngoài lỗi khi có ô trống còn 1 lỗi nữa: câu lệnh If Ubound(arr)=1 Then Exit Function thừa, khi chọn range có 1 ô vẫn bị lỗi #VALUE; chuot thử sửa xem sao?Gửi bởi chuot0106
Cái này lúc test code em cũng thấy thừa và em đã bỏ đi rồi. Chuyện trong cột có ô rỗng không bàn tới vì việc xử lí dữ liệu như bỏ ô trống hay sắp xếp thì cái đấy đơn giản rồi mà anh. Ở đây em quan tâm tới thuật toán giải quyết nhiều hơn. Công nhận thuật toán của anh hay thật. Mà anh bảo bài này có nhiều cách, anh có thể nói luôn được không ạ?Gửi bởi Hau151978
Cách khác của mình mô phỏng chính code trên:
- Theo file đính kèm ở bài 6, dữ liệu A4:A19;
- Cột phụ B: B4=0, B5=IF(A5-A4=1,B4+1,0) fill xuống B19
- Cột phụ C: C4=A4, C5=C4 & IF(B5=0,", " & A5,IF(B5=1,"-","") & IF(B6=0,A5,"")) fill xuống C19;
- Ô C19 là kết quả.
Trong code của mình ở bài 12 bị lỗi do không thể gán Range có 1 cell vào array được, sẽ bị lỗi, để sửa cần đưa lệnh kiểm tra vào ngay đầu tiên và bỏ lệnh kiểm tra thừa đi
Mã:If R.Count=1 Then xxx=r.Text Exit Function End If
</div>Gửi bởi Hau151978
</div>
Nhìn thấy cách này công thức nhằng nhịt quá! Thôi bỏ cách này luôn, dùng VBA thôi. Xem xong sợ "Tẩu hỏa nhập ma" mất!
Thực ra cũng chưa chắc chủ thread đã muốn sort, có khi họ lại muốn để nguyên thứ tự. Còn muốn sort và loại bỏ trùng thì cũng không khó, ví dụ thêm vài lệnh: copy sang cột phụ, sort, remove duplicate, lưu vào mảng, xóa cột phụ.Gửi bởi ndu96081631
Còn trường hợp có ô trống thì đúng là kết quả sẽ nhìn buồn cười, cần thêm lệnh để kiểm tra xem arr(i,1) có bằng "" không.
Anh em mình mấu chốt là tìm ra thuật toán thôi. Thầy ndu thì sau khi viết code xong bao giờ cũng nghĩ tới việc tối ưu code lường trước các trường hợp. Đây là điều mà anh em mình nên học hỏi!Gửi bởi Hau151978
Bài có nhiều cách. Lưu 2 biến đầu và cuối, qua mỗi vòng lặp kiểm tra giá trị của mảng xem có bằng cuối+1 không, nếu bằng thì tăng biến cuối thêm 1, nếu khác thì nối "đầu-cuối" vào chuỗi (trước khi nối cần kiểm tra xem đầu<cuối không, nếu bằng thì chỉ lưu biến đầu).
Mã:Function xxx(r As Range) As String Dim i&, arr(), first&, last& arr = r xxx = CStr(arr(1, 1)) If UBound(arr) = 1 Then Exit Function first = arr(1, 1) last = arr(1, 1) For i = 2 To UBound(arr) If arr(i, 1) = last + 1 Then If i = UBound(arr) Then xxx = xxx & "-" & arr(i, 1) Else If last <> first Then xxx = xxx & "-" & last xxx = xxx & ", " & arr(i, 1) first = arr(i, 1) End If last = arr(i, 1) Next End Function