Code lấy giá trị của 4 hoặc 5 số cuối.

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

LuuAnh980

Thành viên tiêu biểu
Tham gia
28/9/22
Bài viết
451
Được thích
96
Giới tính
Nữ
Chào các anh!!!
Em có file này, chủ yếu lấy những giá trị của 4 số hoặc 5 số không phải là "6000", "12000", và nhỏ hơn hoặc bằng 3000.
Nhưng trong cột F code không lấy giá trị "8X1500X10500" , mặc dù cột D có giá trị "8X1500X10500" cell D193, em bôi màu ạ.
Mong các anh giúp.
 

File đính kèm

  • HoiCode.xlsb
    17.6 KB · Đọc: 18
Code của Bác @VetMini chưa đúng ý ạ: điều kiện của em là không lấy <=3000,6000,12000
Code của bác @VetMinilấy <=3000,6000,12000
Chỉnh chổ này dùm em ạ: .Pattern = "[Xx](([012]?\d{0,3})|3000|6000|12000)$"
Thầy @ptm0412 : Excel em là 2013, không có hàm mấy hàm đó ạ.
Cám ơn các anh nhiều ạ.
 
Upvote 0
Excel em là 2013, không có hàm mấy hàm đó ạ.
Cám ơn các anh nhiều ạ.
Biết là thớt cần code VBA (tối ưu), nhưng thấy mấy dòng "đỏ đỏ" nên cũng 'ngứa tay' tạo công thức mảng để thớt tham khảo thêm cho biết. Ô F4 dán công thức sau:
Mã:
=INDEX($D$4:$D$250,AGGREGATE(15,6,ROW($1:$250)/(MMULT(IFERROR(--TEXT(--RIGHT(SUBSTITUTE($D$4:$D$250,"X",REPT(" ",10),2),10),"[<3000]\0;[="&{3,6,12}*10^3&"]\0;\1"),),{1;1;1})=3)/(COUNTIF(OFFSET($D$4,,,ROW($1:$250)),$D$4:$D$250)=1),ROWS($1:1)))
Kết thúc bằng Ctrl+Shift+Enter, fill xuống.

Thân
 

File đính kèm

  • HoiCode.xlsb
    19.9 KB · Đọc: 2
Upvote 0
Em cứ tưởng là công thức không làm được anh @Phan Thế Hiệp, nếu dữ liệu cỡ 2000 dòng có "quay đều" không anh.
Đã bảo 'tham khảo thêm' rồi mà! Chứ có nói "tối u" đâu! :)

Với khoảng 2000 dòng thì có thể..."quay đều, quay đều, quay đều. Nhớ hoài những vòng xe.." (Xe đạp ơi! Ngọc Lễ - Phương Thảo)

/-*+/
Thân
 
Upvote 0
Biết là thớt cần code VBA (tối ưu),
nhưng thấy mấy dòng "đỏ đỏ"
Em sợ nhất những trường hợp đòi "tối ưu" vì có tiêu chuẩn thế nào là tối ưu đâu, không khéo lòng vòng một hồi lại trở thành "tối um". (Thường những trường hợp này mới biết một chút, hoặc chưa biết về VBA mới như vậy anh ạ).
 
Upvote 0
em muốn gán kết quả Filter vào L21, em có chỉnh code lại, anh coi như vậy có được không ạ.

Bạn chép lại mã #7
Để gán phím tắt sử dụng thì bạn cần xác định chính xác trang tính cần thực hiện. Lấy codeName của trang tính đó, như sau:
Sheet1.Range("D4") và Sheet1.Range("L21")

Gán phím tắt CTRL+SHIFT+F4, chạy thủ tục sau:
Mã:
Private Sub assignShortKey()
   On Error Resume Next
   Application.OnKeys "^+{F4}", "'" & ThisWorkbook.Name & "'!FilterData"
End Sub
 
Upvote 0
Cám ơn anh @HeSanbi nhiều ạ.
Thêm điều kiện bẫy lỗi nữa đi anh, vì có trường hợp không có các giá trị cần lấy. ví dụ chỉ có <=3000, 6000 và 12000 thôi.
 
Upvote 0
Điều kiện của bạn không rõ ràng, bạn nêu mỗi điều kiện vào một gạch đầu dòng xem cụ thể thế nào.
(Hết ngứa tay bây giờ ngứa miệng)

Dạ anh!
Em muốn lọc dãy số cột D, với điều kiện
1/ Số cuối cùng (sau "X" thứ 2) thỏa: không lấy các giá trị
- <= 3000 và
- = 6000 và
- = 12000
2/ Nếu giá trị đã thỏa điều kiện '1/' xuất hiện trùng lặp, thì chỉ lấy giá trị đó 1 lần.

Rõ không anh!?

/-*+//-*+//-*+/
 
Upvote 0
Lỗi diễn ra khi nào bạn.
Có ràng buộc d.count đó thôi
 
Upvote 0
(Hết ngứa tay bây giờ ngứa miệng)
Dạ anh!
Em muốn lọc dãy số cột D, với điều kiện
1/ Số cuối cùng (sau "X" thứ 2) thỏa: không lấy các giá trị
- <= 3000 và
- = 6000 và
- = 12000
2/ Nếu giá trị đã thỏa điều kiện '1/' xuất hiện trùng lặp, thì chỉ lấy giá trị đó 1 lần.
Rõ không anh!?
/-*+//-*+//-*+/
Hết ngứa tay xoay ra ngứa miệng. Chính xác rồi anh ơi.
Nếu nêu ra như thế này ngay từ bài #1 thì chắc không kéo dài mấy chục bài như bây giờ, nhưng đây cũng là đặc thù của chủ bài mất rồi.
 
Upvote 0
Vậy chỉ cần thêm mã

Mã:
If d.count then

Else
    Msgbox
End if
 
Upvote 0
Upvote 0
Tôi đã hứa không dính líu gì nữa rồi.
Vả lại, hàng của tôi không bao giờ là "tối ưu" cho nên cũng chả chết ai.

Điểm ưu việt của nó là "dễ chỉnh sửa" mà không thấy thì nó chỉ là đồ bỏ.
Dễ chỉnh sửa: thuận thì IF ..., không thuận thì IF Not ...
 
Upvote 0
Code của Bác @VetMini chưa đúng ý ạ: điều kiện của em là không lấy <=3000,6000,12000
Code của bác @VetMinilấy <=3000,6000,12000
Chỉnh chổ này dùm em ạ: .Pattern = "[Xx](([012]?\d{0,3})|3000|6000|12000)$"
Theo tôi thì nguyên chủ đề này:
Bài 1 không nói gì đến duy nhất. Điều kiện thì không ghi rõ ràng.
- Khi có code bài 2 thì mới đòi duy nhất và đòi sửa. Sửa xong thì không nói năng gì, chắc không xài
- Bài 4 đưa kết quả hỏi, nếu đúng thì làm. Chê không duy nhất mặc dù đã duy nhất rồi. Sau đó lơ luôn không dùng
- Code bài 7 sau khi sửa 2 lần, cũng lơ luôn không xài
- Code bài 17 không biết có xài hay không, mà cũng đòi sửa.
Đòi cho cố vô rồi không thấy vừa lòng. Sau cùng xài cái nào chắc theo kiểu hên xui. Phải chi mà biết đánh giá code nào tốt hơn thì tôi không nói, đằng này 1 chữ VBA bẻ đôi không biết!
Với cách hỏi này và cách đòi hỏi này nếu là người khác thì tôi mắng (bạn gọi là chửi). Nhưng riêng bạn thì tôi lơ luôn lâu rồi.
Luôn luôn hỏi, rồi đòi tốt hơn, rồi có khi không dùng cái nào mà vẫn làm theo ý mình.
Có lẽ dần dần rồi những người giúp xong bị ngó lơ cũng sẽ không bao giờ giúp nữa rồi đừng hỏi tại sao.
Ghi chú:
(Tôi viết hàm let để cho người khác đọc dù biết chắc là bạn không có 365)
 
Lần chỉnh sửa cuối:
Upvote 0
Biết là thớt cần code VBA (tối ưu), nhưng thấy mấy dòng "đỏ đỏ" nên cũng 'ngứa tay' tạo công thức mảng để thớt tham khảo thêm cho biết. Ô F4 dán công thức sau:
Mã:
=INDEX($D$4:$D$250,AGGREGATE(15,6,ROW($1:$250)/(MMULT(IFERROR(--TEXT(--RIGHT(SUBSTITUTE($D$4:$D$250,"X",REPT(" ",10),2),10),"[<3000]\0;[="&{3,6,12}*10^3&"]\0;\1"),),{1;1;1})=3)/(COUNTIF(OFFSET($D$4,,,ROW($1:$250)),$D$4:$D$250)=1),ROWS($1:1)))
Kết thúc bằng Ctrl+Shift+Enter, fill xuống.

Thân
Bạn giỏi hàm excel thật đấy
 
Upvote 0
Web KT

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

Back
Top Bottom