WorksheetFunction.SumIfs() trong VBA tính sai (2 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

nvhieutk

Thành viên mới
Tham gia
18/9/24
Bài viết
6
Được thích
0
nhờ các bác giúp em sao code tính sai kết quả (D4:D8 có số liệu số tiền, B4:B8 có số liệu ngày):
WorksheetFunction.SumIfs(ws.Range("D4:D8"), _
ws.Range("B4:B8"), ">=" & tungay, ws.Range("B4:B8"), "<=" & denngay)
 

File đính kèm

nhờ các bác giúp em sao code tính sai kết quả (D4:D8 có số liệu số tiền, B4:B8 có số liệu ngày):
WorksheetFunction.SumIfs(ws.Range("D4:D8"), _
ws.Range("B4:B8"), ">=" & tungay, ws.Range("B4:B8"), "<=" & denngay)
Sửa tungay = ws.Range("D2").Value
thành tungay = CLng(ws.Range("D2").Value)

Tương tự là denngay
 
Upvote 0
Bạn sửa thế nào chụp hình tôi xem

1726638791787.png
 
Upvote 0
Bạn sửa thế nào chụp hình tôi xem

View attachment 304037

Sửa tungay = ws.Range("D2").Value
thành tungay = CLng(ws.Range("D2").Value)

Tương tự là denngay

Bạn sửa thế nào chụp hình tôi xem

View attachment 304037

sửa như thế này bác ơi:
Dim tungay, denngay, ST, ws As Worksheet
Set ws = Worksheets("Sheet2")
tungay = CLng(ws.Range("D2").Value)
denngay = CLng(ws.Range("E2").Value)


ST = WorksheetFunction.SumIfs(ws.Range("D4:D8"), _
ws.Range("B4:B8"), ">=" & tungay, ws.Range("B4:B8"), "<=" & denngay)
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện hỏi thêm bác, Dữ liệu cùng kiểu (ngày/tháng/năm) sao thêm CLng lai được nhỉ?
Clng là hàm để chuyển ngày và text thành dạng số. Điểm đặc biệt là VBA thường xét ngày có định dạng mm/dd/yyyy mới hợp lệ, không như Excel. Tuy vậy, ngày có bản chất là số nên chuyển về số cho cả 2 đều chấp nhận.
 
Upvote 0
Các hàm Cxxxx này nọ là dùng để ép kiểu (type coercion), hoặc xác định cho rõ kiểu dữ liệu.
Clng, theo cái tên của nó đã trả lời rõ rệt là nó sẽ ép kiểu và trả về số nguyên.

CLng sẽ ép kiểu ngày hoặc chuỗi text sang số nguyên.
Lưu ý từ "số nguyên" có nghĩa là phần thập phân sẽ bị cắt bỏ. Dân chuyên VBA dùng tính chất này để cắt bỏ phần giờ phút trong biến kiểu Date. Ngày trong VBA và Excel là dạng số thực, phần nguyên là ngày tháng, phần thập phân là giờ phút...
 
Upvote 0
Lưu ý từ "số nguyên" có nghĩa là phần thập phân sẽ bị cắt bỏ. Dân chuyên VBA dùng tính chất này để cắt bỏ phần giờ phút trong biến kiểu Date. Ngày trong VBA và Excel là dạng số thực, phần nguyên là ngày tháng, phần thập phân là giờ phút...
Ồ. giờ cháu mới biết cái này nè. Nói như này thì thực tế có thể thay thế cho hàm Int được phải không chú?
 
Upvote 0
Rất quan trọng bác ạ. Tôi thấy nhiều người lấy CLng rồi cỡ 20 dòng code sau lại vò đầu vì sao giờ cứ là 0:00.
Thế nên Microsoft đẻ ra thêm hàm CDbl.
Ồ. giờ cháu mới biết cái này nè. Nói như này thì thực tế có thể thay thế cho hàm Int được phải không chú?
Mỗi hàm có tính năng riêng. CLng là ép kiểu từ text, từ date thành số. Còn Int là lấy phần nguyên của 1 giá trị có kiểu số sẵn. Dùng qua dùng lại vẫn được nhưng khác tính năng giống như dùng cờ lê nhổ đinh và dùng búa đập đùng đùng để mở bù lon.
 
Upvote 0
Ồ. giờ cháu mới biết cái này nè. Nói như này thì thực tế có thể thay thế cho hàm Int được phải không chú?

Không hẳn như vậy. CLng bao gồm Round, Int thì không. Trong ví dụ sau đây, nếu phần thập phân lớn hơn hay bằng 0.5 thì CLng sẽ dùng Round để ép số. Int của VBA có tính chất giống như Int của bảng tính, không hề dùng Round.

1726758487084.png

Lưu ý: round của VBA khác với round của bảng tính. Trong ví dụ sau đây, bạn sẽ thấy sự khác nhau.
Giờ là 12:00, tức 0.5 ngày. Ngoài việc > 0.5 => 1, < 0.5 => 0; Round của VBA chỉ tăng 0.5 thành 1 nếu số bên ngay bên trái nó (hàng đơn vị của phần nguyên) là lẻ, và không tăng nếu là chẵn.

1726759414744.png

01/01/2024 là 45292, số chẵn. VBA vất bỏ 0.5 (nửa ngày).
02/01/2024 là 45293, số lẻ. VBA round 0.5 thành 1. Tức là ngày 3/01/2024.

Làm việc với các hàm chuyển/ép kiểu dữ liệu thì phải thử chúng trước. KHông nắm vững là dữ liệu sai. Trường hợp biết sai thì còn tốt. Nếu không biết cứ lẳng lặng đến một ngày đẹp trời nào đó...

Trên bài #13 mới nói một đôi câu mà lão chết tiệt đã than rồi. Qua bài này chắc lão nhiêc tôi nhức óc. :p:p:p
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Làm việc với các hàm chuyển/ép kiểu dữ liệu thì phải thử chúng trước. KHông nắm vững là dữ liệu sai.
Cám ơn chú. Chú nói ở bài 13 nên cháu tò mò và test thử. Có lẽ nó đúng với 1 vài trường hợp. Sẽ lưu ý khi sử dụng. Chứ ban đầu cháu chỉ nghĩ là nó sẽ ép ngày tháng năm về dạng số thôi.
 
Upvote 0
Web KT

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

Back
Top Bottom