Đầu tiên, ta đặt tên cho mảng $B$4:$B$30 là Q, và mảng $C$4:$C$30 là P, cách đặt tên như thế nào hoặc các bạn có thể đặt tên cho vùng dữ liệu động, chúng ta sẽ không bàn tại đây Yêu cầu
Trang 1Giải thích thêm về cách vận dụng các công thức trong File FIFO
Giả sử ta có bảng dữ liệu sau :
Trang 2Đầu tiên, ta đặt tên cho mảng $B$4:$B$30 là Q, và mảng $C$4:$C$30 là P, cách đặt tên như thế nào hoặc các bạn có thể đặt tên cho vùng dữ liệu động, chúng ta sẽ không bàn tại đây
Yêu cầu cấu trúc của File này là :
- Số lượng Nhấp và Xuất đặt cùng 1 cột và quy ước SLNhap >0, SLXuat <0
- Dữ liệu được nhập theo thứ tự ngày tháng Hàng trên cùng bao giờ cũng là số >0, tương ứng với số lượng tồn cuối kỳ, hoặc nhập hàng vào rồi mới xuất bán
Để có thể hiểu được bài này, chúng ta cần nói về một số công thức mảng kết hợp bởi các hàm sau :
1/ Hàm ROW(Q) : sẽ trả về giá trị là một mảng gồm các số hạng là vị trí các hàng của các phần tử của mảng Q, tính từ phần tử đầu tiên Công thức mảng ROW(Q)
sẽ cho như hình dưới đây
Trang 32/ Hàm TRANSPOSE(ROW(Q)) : Sẽ cho ta một mảng ngang khác bằng kích thước với mảng ROW(Q) như hình vẽ sau :
Trang 43/ Lệnh ROW(SL)>=TRANSPOSE(ROW(SL)) sẽ xuất ra mảng gồm những phần
tử trong mảng có giá trị là TRUE :
Trang 5Ta chuyển giá trị TRUE, False sang giá trị 1, 0 bằng cách thêm vào 2 dấu - - như sau :
{=( (ROW(SL)>=TRANSPOSE(ROW(SL))}, ta sẽ có một mảng gồm giá trị :
Trang 6Ta gọi mảng trên đây là mảng 1
Bạn hỏi vì sao phải tạo ra mảng này ? Thực ra, phải đi từ mục đích cuối cùng ra
Mục đích chính là tìm thời điểm (dòng số mấy) của cái gọi là “First in” Muốn làm
như thế, bắt buộc phải tạo ra một mảng thể hiện tổng số hàng nhập kho, sau đó, trừ
đi xuất kho, ta sẽ tìm được thằng “First in” mới
Bạn hãy xem mảng (Q>0)*Q sẽ cho ra các phần tử nào nhé :
5
Trang 9Đây chính là mảng số lượng B4:B30 của bảng dữ liệu, chỉ có điều số lượng xuất <
0, sẽ được Convert thành số 0, chỉ còn các phần tử là số lượng nhập trong kỳ mà thôi Ta gọi mảng này là mảng 2
4) Hàm MMULT : hàm này ít ai xài, nhưng nếu kết hợp với các hàm về mảng khác lại cho ra kết quả khá tốt Đây chính là hàm ma trận, nhân các phần tử trong mảng này với các phần tử trong mảng kia Kết hợp hàm MMULT để nhân mảng 1
và mảng 2 ta có kết quả như sau :
Trang 10Đây chính là mảng chúng ta cần tìm Mảng này thể hiện tổng số hàng nhập kho, ta chỉ cần tìm mảng thể hiện số xuất kho, lấy mảng này trừ đi, ta sẽ tìm được vị trí First In mới
Bạn sẽ bật cười vì để tạo mảng này, ta có thể chỉ cần hàm SUMIF(B$4:B4,”>0”) rồi kéo xuống, hơi đâu mà phài làm công thức dài loằng ngoằng khó hiểu như vậy
? Nhưng thực tế, nếu dung hàm SUMIF, bạn sẽ phải thêm các cột phụ, do đó, cách giải này vẫn là Best Solution
Bạn thử xem hình sau :
Trang 11Thoạt nhìn, bạn sẽ thấy 2 công thức :
Trang 12Kết quả trên của hàm ma trận {= (ROW(Q)>=TRANSPOSE(ROW(Q))),(Q>0)*Q)} thực ra được diễn giải gồm mảng như sau :
Trang 13Chúng ta sẽ xác định tổng số lượng xuất kho bằng công thức sau :
= SUMIF(OFFSET(Q,0,0,ROW()-4,1),”<0”) hay = SUMIF($B$4:B4,”<0”)
Tổng số của MMULT và SUMIF : = (SLNhập - SLXuất)
Kết hợp 2 hàm này :
=MMULT( (ROW(Q)>=TRANSPOSE(ROW(Q))),(Q>0)*Q)+SUMIF(OFFSET( Q,0,0,ROW()-4,1),”<0”)
Ta có mảng sau :
Trang 14Bạn sẽ thấy mảng này thể hiện số lượng hàng tồn sau mỗi lần nhập và xuất kho
Mảng đầy đủ sẽ là
Trang 15Mọi việc bắt đầu đơn giản rồi Điều kiện MMULT + SUMIF >0 sẽ cho ra một mảng sau :
Trang 16Mảng đầy đủ phải được diễn giải như sau :
Trang 17Trong mảng trên, TRUE sẽ đại diện cho hàng còn tồn kho, và False đại diện cho hàng đã xuất hết kho
5/ Cuối cùng, ta dung hàm MATCH để xác định vị trí “TRUE” đầu tiên của mảng trên Ý nghĩa của nó là dò tìm trong khối Q, đâu là dòng “FIRST In” đầu tiên Công thức này là :
Trang 18Từ D5 đến D30, ta nhập công thức trên, ta sẽ được kết quả là :
Trang 2018
Sau khi đã xác định được đâu là vị trí của dòng "First in", ta sang cột E
Tại E4 = B4, số lượng tồn đầu kỳ
E5 = IF(D5=D4,E4+MIN(0,B4),SUMIF(OFFSET(Q,0,0,D5,1),">0 ") +SUMIF(OFFSET(Q,0,0,ROW()-4,1),"<0"))
Công thức này có thể diễn giải như sau :
- Nếu số lượng hàng cũ còn đủ xài : IF(D5=D4,
thì số lượng hàng tồn kho bằng với E4 trừ đi số lượng hàng xuất ra (Lưu ý hàm MIN(0,B4) cho kết quả là số âm, chính là số lượng hàng xuất) : E4+MIN(0,B4)
Trang 21- còn nếu số lượng hàng cũ không đủ xài, thì lấy hàng mới mà xuất : SUMIF(OFFSET(Q,0,0,D5,1),">0")
- số tồn kho (đợt hàng First in mới) sẽ là tổng số nhập trừ đi tổng số xuất cho đến thời điểm tính toán :
SUMIF(OFFSET(Q,0,0,D5,1),">0") +SUMIF(OFFSET(Q,0,0,ROW()-4,1),"<0")
Kéo công thức xuống các hàng bên dưới của cột E từ E5 đến E30, ta có hình sau :
Trang 22Như vậy : Cột E chính là số hàng tồn còn lại sau mỗi nghiệp vụ nhập hàng hay xuất hàng
Cột F là cột tính FIFO - trị giá hàng xuất bán
=IF(B5<0,IF(E5+B5>=0,-
B5*INDEX(P,D5),E5*INDEX(P,D5)+(INDEX(Q,D6)-1,1)>0),OFFSET(Q,D5,0,D6-D5-1,1),OFFSET(P,D5,0,D6-D5-1,1)),0)),"")
E6)*INDEX(P,D6)+IF(D6-D5>1,SUMPRODUCT( (OFFSET(Q,D5,0,D6-D5-Công thức này có vẻ dài, nhưng không đến nỗi khó hiểu, chúng ta từ từ xem từng đoạn một như sau :
- Nếu B5 < 0 : số lượng hàng xuất bán (< 0), và nếu số tồn kho (E5) > = số lượng xuất bán (B5) : E5 + B5 >=0, trị giá xuất sẽ là đơn giá (mảng P), tại vị trí “First in” (D5) : INDEX(P,D5), nhân số lượng xuất (B5) Vì số lượng xuất của chúng ta
quy định là < 0, nên ta phải đặt thêm dấu - để cho kết quả là số +
=IF(B5<0,IF(E5+B5>=0,-B5*INDEX(P,D5), ……
Xét tại công thức FIFO tại F6, số lượng xuất bán B6 = 3 nhỏ hơn số lượng hàng tồn E6 = 5, đợt hàng này là đợt 1(D6 = 1) có đơn giá : (INDEX(P,1) = 1) nên trị giá hàng xuất là : 3*1 = 3
Trang 23- Ngược lại, nếu số lượng hàng tồn tại vị trí (First in) < số lượng xuất bán, thì lấy hết số lượng tồn (E5) ra để bán, trị giá xuất của số lượng tồn này là :
E5*INDEX(P,D5), số lượng còn thiếu sẽ được lấy từ vị trí kế tiếp của đợt nhập
hàng
Số lượng hàng nhập của đợt hàng tiếp theo INDEX(Q,D6) – E6 (số lượng hàng
tồn sau khi xuất bán nốt phần còn thiếu) = Số lượng hàng xuất bán còn thiếu
Tương tự, đơn giá đợt hàng tiếp theo là INDEX(P,E6)
E5*INDEX(P,D5)+(INDEX(Q,D6)-E6)*INDEX(P,D6)
Trang 24Xét công thức tính FIFO tại F11, số lượng xuất bán B11 = 3, số lượng tồn cũ là E11 = 1 của đợt hàng nhập thứ 2 (D11 = 2), có đơn giá là INDEX(P,D11) = 1.1 Xuất hết số lượng E11, trị giá xuất của số hàng này là : = E11*INDEX(P,D11) = 1*1.1 = 1.1 (hàng màu xanh)
Số lượng còn phải xuất bán thêm là :
- Số lượng đợt nhập hàng kế tiếp : INDEX(Q,D12) = 4 có vị trí thứ 6 (D12=6) của mảng $B$4 :$B$30 đặt tên là Q, đơn giá của đợt hàng này là INDEX(P,D12) = 1.3
- Số lượng hàng tồn của đợt hàng này sau khi đã xuất bán nốt phần còn thiếu là : E12 = 2
- Vậy số lượng hàng xuất bán thêm trong đợt hàng sau là : (hàng màu vàng)
= INDEX(Q,D12)-E12 = 4 – 2 = 2
Trang 25- Trị giá hàng xuất trong đợt hàng sau là : E12)*INDEX(P,D12) = 2*1.3 = 2.6
=(INDEX(Q,D12,2) Trị giá hàng xuất được tính tại :
F11 = E11*INDEX(P,D11) + (INDEX(Q,D12,2)-E12)*INDEX(P,D12) = 1*1.1 + 2*1.3 = 3.7
Nếu D6 – D5 > 1, và nếu số lượng hàng xuất lớn hơn số lượng hàng tồn, nghĩa là
sẽ có nhiều đợt hàng tiếp theo đợt hàng “First in”, do đó :
- Xuất hết số lượng tồn của đợt First in : = E5*INDEX(P,D5)
- Xuất nốt số lượng hàng còn thiếu ở đợt hàng nhập cuối : = E6)*INDEX(P,D6)
(INDEX(Q,D6) Số lượng xuất tại các đợt hàng trung gian giữa 2 giá trị D5 và D6 được xác định bằng công thức :
= D5-1,1),OFFSET(P,D5,0,D6-D5-1,1))
SUMPRODUCT( (OFFSET(Q,D5,0,D6-D5-1,1)>0),OFFSET(Q,D5,0,D6-Hàm OFFSET(Q,D5,0,D6-D5-1,1) cho ta 1 mảng con của mảng Q, bắt đầu từ vị
trí đầu tiên của mảng Q, dời xuống D5 hàng, có D6-D5-1 hàng và 1 cột
Trang 26Mảng OFFSET(Q,D5,0,D6-D5-1,1)>0, sẽ cho ta giá trị Logic, do đó ta đặt 2 dấu trừ để convert giá trị True, False thành giá trị số 1, 0
Bây giờ, ta nhìn hình vẽ sau để hiểu rõ hơn về công thức trên, xét công thức FIFO tại hàng 20 và 21 D21 = 13, còn D20 = 10
- Mảng OFFSET(Q,D20,0,D21-D20-1,1) là mảng $B$14:$B$15 có màu xanh,
chữ đỏ, bắt đầu từ hàng 14, dời xuống 10 hàng tính từ hàng thứ 4 là vị trí đầu tiên của mảng Q Mảng này gồm 2 hàng, và có giá trị dương tại B15 là số 1
Trang 27- Mảng OFFSET(P,D20,0,D21-D20-1,1) là mảng $C$14:$C$15 có màu xanh,
chữ xanh, bắt đầu từ hàng 14, dời xuống 10 hàng tính từ hàng thứ 4 là vị trí đầu tiên của mảng P
Hàm SUMPRODUCT sau sẽ trả kết quả là : 1*1.2 = 1.2
= 1,1)>0),OFFSET(Q,D20,0,D21-D20-1,1),OFFSET(P,D20,0,D21-D20-1,1))
SUMPRODUCT( (OFFSET(Q,D20,0,D21-D20 Các hàm còn lại đã giải thích ở trên