Mình tham gia công thức gọn hơn 1 chút, dùng condition format để xoá 000
Công thức của bạn gọn nhưng nó lại không đáp ứng yêu cầu.
Bởi vì bạn dựa vào đếm cột TK Có,
nhưng
1 phiếu có thể có nhiều mã hàng, mỗi mã hàng chiếm 1 dòng, nhưng chúng sẽ có cùng số hiệu TK Có và cùng 1 số phiếu.
Dùng offset để thuận tiện khi chèn thêm, xoá bớt dòng. Không bao giờ ngại sẽ tạo ra vòng tham chiếu quẩn.
Ví dụ cong thức ô B15 là:
{=IF(AND(E15<>"",D15=
D14,C15=
C14,G15=
G14),
B14, IF(G15=152, "NL", IF(G15=153, "CC", IF(G15=155, "TP", IF(G15=156, "HH", "xxx")))) & TEXT(MAX(IF(LEFT($B$9:
B14, 2) = IF(G15=152, "NL", IF(G15=153, "CC", IF(G15=155, "TP", IF(G15=156, "HH", "xxx")))), --RIGHT($B$9:
B14, 3), 0)) + 1, "000"))}
Bạn thấy nó tham chiếu đến các ô ở dòng "
ngay phía trên nó".
Tuy nhiên khi chèn thêm hoặc xoá bớt 1 vài dòng (mà chuyện này kế toán rất ưa xảy ra trong quá trình nhập liệu) thì các tham chiếu ở chỗ màu đỏ trong công thức trên sẽ chạy theo và làm cho nó không còn đúng với nghĩa "
ngay phía trên nó" nữa.
Chẳng hạn khi lôi dòng 17 lên chèn vào giữa dòng 14 và 15 thì công thức ô B15 cũ lúc bấy giờ đã tụt xuống thành dòng 16:
{=IF(AND(E16<>"",
D16=D14,
C16=C14,
G16=G14),
B14, IF(G16=152, ....
Thay những chỗ màu đỏ trên bằng Offset:
{=IF(AND(E15<>"", D15 = OFFSET(D15, -1, 0), C15 = OFFSET(C15, -1, 0), G15 = OFFSET(G15, -1, 0)), OFFSET(B15, -1, 0), IF(G15=152, "NL", IF(G15=153, "CC", IF(G15=155, "TP", IF(G15=156, "HH","xxx")))) & TEXT(MAX(IF(LEFT($B$9:OFFSET(B15, -1, 0), 2) = IF(G15=152, "NL", IF(G15=153, "CC", IF(G15=155, "TP", IF(G15=156, "HH", "xxx")))), --RIGHT($B$9:OFFSET(B15, -1, 0), 3), 0)) + 1, "000"))}
Như vậy công thức ô B15 chỉ còn tham chiếu đến các ô cùng dòng với nó, không sợ sự cố khi di chuyển, xóa, chèn dòng.
Trong file kèm theo đây bạn có thể di dời thoải mái các dòng sao cho trong cùng 1 phiếu thì các mặt hàng Công cụ, Hàng hóa ... liên tục nhau (chọn dòng rồi nhấn Ctrl+C, Ctrl+V).