احتساب قيمه المخزون FIFO الوارد اولا يصرف اولا

Поділитися
Вставка
  • Опубліковано 28 січ 2025

КОМЕНТАРІ •

  • @keshochannel1520
    @keshochannel1520 13 днів тому +1

    شغل عالى اوى اوى ده يا كبير

  • @محمدجمال-ه9ه2ث
    @محمدجمال-ه9ه2ث  13 днів тому

    Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    On Error GoTo ErrorHandler
    If Not Intersect(Target, Me.Range("A:L")) Is Nothing Then
    Call CalculateFIFO
    End If
    Application.EnableEvents = True
    Exit Sub
    ErrorHandler:
    Application.EnableEvents = True
    MsgBox "حدث خطأ: " & Err.Description
    End Sub
    Sub CalculateFIFO()
    On Error GoTo ErrorHandler
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long, j As Long, currentRow As Long
    Dim itemCode As String
    Dim qtyToIssue As Double
    Dim totalCost As Double
    Dim remainingQty As Double
    Dim totalQtyAvailable As Double
    Dim supplyList As Object
    Set supplyList = CreateObject("Scripting.Dictionary")

    Set ws = ThisWorkbook.Sheets("Sheet1")
    If ws Is Nothing Then
    MsgBox "لم يتم العثور على الورقة المحددة."
    Exit Sub
    End If

    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    If lastRow < 2 Then
    MsgBox "لا توجد بيانات كافية في الورقة."
    Exit Sub
    End If

    ' تحضير الكميات
    Debug.Print "تحضير الكميات المتاحة"
    For j = 2 To lastRow
    If ws.Cells(j, "E").Value = "إضافة" Then
    itemCode = ws.Cells(j, "A").Value
    remainingQty = ws.Cells(j, "D").Value
    supplyList(itemCode & "_" & j) = Array(remainingQty, ws.Cells(j, "F").Value)
    Debug.Print "تمت إضافة: " & itemCode & " كمية: " & remainingQty & " بسعر: " & ws.Cells(j, "F").Value
    ' حساب إجمالي قيمة الشراء لكل عملية شراء ووضعها في العمود L
    ws.Cells(j, "L").Value = remainingQty * ws.Cells(j, "F").Value
    End If
    Next j

    ' تنفيذ عملية الصرف
    Debug.Print "تنفيذ عملية الصرف"
    For i = 2 To lastRow
    If ws.Cells(i, "E").Value = "صرف" Then
    itemCode = ws.Cells(i, "A").Value
    If IsNumeric(ws.Cells(i, "D").Value) And ws.Cells(i, "D").Value > 0 Then
    qtyToIssue = ws.Cells(i, "D").Value
    Else
    qtyToIssue = 0
    End If
    totalCost = 0
    totalQtyAvailable = 0

    ' حساب الكميات المتاحة
    For Each Key In supplyList.Keys
    If InStr(1, Key, itemCode) > 0 Then
    totalQtyAvailable = totalQtyAvailable + supplyList(Key)(0)
    End If
    Next Key

    ' التحقق من توفر الكمية الكافية
    Debug.Print "الصنف: " & itemCode & " | الكمية المطلوبة: " & qtyToIssue & " | الكمية المتاحة: " & totalQtyAvailable
    If qtyToIssue > totalQtyAvailable Then
    MsgBox "الرصيد غير كافي للصرف للصنف: " & itemCode
    ws.Cells(i, "G").Value = "N/A"
    ws.Cells(i, "M").Value = "N/A"
    Debug.Print "الصنف: " & itemCode & " الرصيد غير كافي للصرف."
    GoTo NextRow
    Else
    For Each Key In supplyList.Keys
    If InStr(1, Key, itemCode) > 0 Then
    currentRow = Val(Mid(Key, InStrRev(Key, "_") + 1))
    remainingQty = supplyList(Key)(0)
    If remainingQty > qtyToIssue Then
    totalCost = totalCost + qtyToIssue * supplyList(Key)(1)
    supplyList(Key)(0) = remainingQty - qtyToIssue
    qtyToIssue = 0
    Else
    totalCost = totalCost + remainingQty * supplyList(Key)(1)
    qtyToIssue = qtyToIssue - remainingQty
    supplyList.Remove Key
    End If
    Debug.Print "معالجة الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | الكمية المصروفة: " & qtyToIssue & " | الكمية المتبقية: " & remainingQty
    End If
    If qtyToIssue = 0 Then Exit For
    Next Key

    If ws.Cells(i, "D").Value > 0 Then
    ws.Cells(i, "G").Value = totalCost / ws.Cells(i, "D").Value
    Else
    ws.Cells(i, "G").Value = 0
    End If
    ' عرض التكلفة الإجمالية في العمود M
    ws.Cells(i, "M").Value = totalCost

    Debug.Print "الصف: " & i & " | الصنف: " & itemCode & " | التكلفة الإجمالية: " & totalCost & " | السعر المحسوب: " & ws.Cells(i, "G").Value
    End If
    End If
    NextRow:
    Next i
    Exit Sub
    ErrorHandler:
    Application.EnableEvents = True
    MsgBox "حدث خطأ أثناء الحساب: " & Err.Description
    End Sub