Vận dụng công thức mảng để tính FIFO Thấy ví dụ về cách tính FIFO của chị handung107 quá hay nên post lại cho các
bạn tham khảo về cách sử dụng mảng (array).
(P/S : Xin lỗi các bạn, vì tôi không tìm thấy File minh họa này ở đâu nữa, nên các
bạn cố gắng theo dõi bài viết này - Handung107)
Đây là 1 ví dụ xuất sắc về cách sử dụng mảng một cách linh hoạt. Tôi xin mạn
phép tác giả post lại đoạn mô tả cách tính FIFO (không phải của tôi, chỉ dịch lại
cho các bạn tham khảo thôi. Tôi chỉ thêm phần giải thích cách tính cho thêm khí
thế).
Tôi biết phần lớn các bạn ở đây đều rất rành về mảng, nhưng sợ một vài bạn mới
làm quen với excel chưa biết hết. Vì vậy tôi xin được phép đi cụ thể từng bước
một.
Giả sử ta có bảng sau: cột 1 là tên Sản phẩm (A), cột 2 là số lượng hàng mua/bán
(số âm là bán, số dương là mua). Tạm đặt thên cột này là Q (tương ứng với khối
$B$1:$B$30). Cột 3 là giá mua/bán, đặt tên là P (tương ứng với khối
$C$1:$C$30).
(Tôi không được phép post file nên không có file cho các bạn tham khảo, tuy
nhiên các bạn có thể copy và paste vào trong excel).
Dòng đầu tiên bao giờ cũng là số dương (số mua mới hoặc số đầu kỳ).
A 5 1.0
A 5 1.1
A -3 1.3
A 2 1.3
A -2 1.4
A 2 1.2
A 4 1.3
A -3 1.6
A 4 1.4
A 2 1.4
B1:B5
2. Khối SUMIF(OFFSET(Q,0,0,ROW()-1,1),"<0"): Hàm SumIf sẽ lấy tổng của
các số âm trong khối B1:B5 (tức là tổng số hàng xuất ra). Trong công thức, khối
SUMIF đóng vai trò 1 hằng số (sẽ thấy rõ hơn vài trò này ở phần sau).
3. Khối MMULT( (ROW(Q)>=TRANSPOSE(ROW(Q))),(Q>0)*Q): Cái này hay
nhất đây. Tác giả sử dụng rất nhiều "mánh lới" trong công thức trên
Đầu tiên: (ROW(Q)>=TRANSPOSE(ROW(Q)): Đây là mánh để tạo ra 1 mảng có
số dòng bằng với số cột, trong đó giá trị toàn TRUE
Thứ hai: Hai dấu trừ liên tiếp nhau ( ). cũng là 1 "mánh" thông dụng để chuyển
giá trị logic (true/false) thành số (True=1, false=0). Đến đây bạn có mảng toàn số
1.
Thứ ba: (Q>0)*Q: giống "cái gì đây" quá nhỉ. Cái này trích ra mảng toàn số
dương, các số âm bị convert thành số 0. Cái mảng này là:
5
5
0
2
0
2
0
0
4
2
0
1
3
3
1
0
0
3. Tổng số của MMULT và SUMIF: như đã nói trên, SUMIF đóng vai trò 1 hằng
số. Kết hợp mảng MMULT và hàm SUMIF (tại ô D6), ta có
0
5
5
7
7
9
9
9
13
15
15
16
19
22
23
23
23
26
26
31
Tôi gọi là mảng 3
Ví dụ: tại ô D6, phép tính sẽ là 14 (của MMULT) - 5 (hằng số từ SUMIF) = 9
4. Mọi việc đơn giản rồi!! Điều kiện MMULT+SUMIF>0 sẽ cho ra một mảng như
sau
FALSE
TRUE
TRUE
TRUE
hàm min(0,B1) chính là dấu trừ); còn nếu số lượng hàng cũ không đủ xài, thì lấy
hàng mới mà xuất, số tồn kho (đợt hàng First In mới) sẽ là tổng số nhập trừ tổng
số xuất cho đến thời điểm tính toán. (nghe ghê quá, chắc chẳng ai hiểu được )
Cột F được dành để tính FIFO. Công thức FIFO như sau:
F2:
=IF(B2<0,IF(E2+B2>=0,-B2*INDEX(P,D2),E2*INDEX(P,D2)+(INDEX(Q,D3)-
E3)
*INDEX(P,D3)+IF(D3-D2>1,SUMPRODUCT( (OFFSET(Q,D2,0,D3-D2-
1,1)>0)
,OFFSET(Q,D2,0,D3-D2-1,1),OFFSET(P,D2,0,D3-D2-1,1)),0)),"")
Ở đây tôi không muốn mất thời gian các bạn để giải thích những công thức bình
thường. Chỉ xin lưu ý cách sử dụng hàm SUMPRODUCT cho mảng thôi. Bạn lại
thấy hai dấu trừ (để convert giá trị logic về 0 hoặc 1), mục đích để loại bỏ những
số âm trong mảng. Như vậy cách sử dụng hàm SUMPRODUCT nhằm mục đích
tính tổng giá của lô hàng mua GIỮA hai giá trị D2 và D3.
Giải thích nhiều rườm tai các bạn, nên tôi xin không đi sâu vào chi tiết. Bạn nào
thấy "bối rối" thì ới lên một tiếng nghe.