ผมนำรหัส VBA ของ Conrad Carlberg มาปรับปรุงให้สามารถอ้างอิงกับพื้นที่ตารางได้โดยตรงทำให้เราสามารถใช้สูตรนี้ได้ง่ายขึ้นโดยไม่จำเป็นต้องตั้งชื่อ Range Name ไว้ก่อนแต่อย่างใด

โดยทำตัวอย่างพร้อมคำอธิบายไว้ให้ดูวิธีใช้สูตร =FIFO() ไว้ในแฟ้มให้ download กันได้จาก http://www.excelexperttraining.com/e...is/FIFOvba.xls

หรือเลือกใช้สูตรแบบ Add-in จาก
http://www.excelexperttraining.com/e.../FIFOAddin.xla

(โปรดอ่าน วิธีติดตั้งสูตร Add-ins)

หวังว่าตัวอย่างนี้จะมีประโยชน์นะครับ แทนที่จะต้องคอยคิดด้วยมือ คราวนี้จะได้ยอดสินค้าคงเหลือไปใช้กันได้ง่ายขึ้น

หากมีข้อแนะนำเพื่อปรับปรุงแก้ไข กรุณาแจ้งให้ผมทราบด้วย หรือถ้าต้องการสอบถามวิธีใช้งาน กรุณาตั้งคำถามไว้ใน Excel Expert Forum ครับ

Code:
Function FIFO(ItemCode As String, UnitsSold As Long, 
PCode As Range, UnitBegin As Range, UnitPurchase As Range, 
UnitCost As Range) As Currency
 
    Dim Counter As Integer, RemainingUnits As Long, UnitsAccountedFor As Long
 
    FIFO = 0
    UnitsAccountedFor = UnitsSold
 
    For Counter = 1 To UnitBegin.Rows.Count
 
        If ItemCode = PCode(Counter, 1) Then
           RemainingUnits = Application.WorksheetFunction.Max(0, UnitBegin(Counter, 1) + _
                UnitPurchase(Counter, 1) - UnitsAccountedFor)
           FIFO = FIFO + UnitCost(Counter, 1) * RemainingUnits
           UnitsAccountedFor = UnitsAccountedFor - (UnitBegin(Counter, 1) + _
                UnitPurchase(Counter, 1) - RemainingUnits)
        End If
 
    Next Counter
End Function